| 4286 | } |
| 4287 | |
| 4288 | static void FinishAsyncScriptRun(RAI_OnFinishCtx *onFinishCtx, void *private_data) { |
| 4289 | |
| 4290 | RAI_Error *error; |
| 4291 | RedisAI_InitError(&error); |
| 4292 | RAI_ScriptRunCtx* sctx = RedisAI_GetAsScriptRunCtx(onFinishCtx, error); |
| 4293 | |
| 4294 | RedisGearsPy_LOCK |
| 4295 | PyObject* future = private_data; |
| 4296 | PyObject* pArgs = PyTuple_New(2); |
| 4297 | PyTuple_SetItem(pArgs, 0, future); |
| 4298 | |
| 4299 | if (RedisAI_GetErrorCode(error) != RedisAI_ErrorCode_OK) { |
| 4300 | const char *errStr = RedisAI_GetError(error); |
| 4301 | PyObject* pyErr = PyUnicode_FromStringAndSize(errStr, strlen(errStr)); |
| 4302 | PyTuple_SetItem(pArgs, 1, pyErr); |
| 4303 | PyObject_CallObject(setFutureExceptionFunction, pArgs); |
| 4304 | goto finish; |
| 4305 | } |
| 4306 | |
| 4307 | PyObject* tensorList = PyList_New(0); |
| 4308 | for(size_t i = 0 ; i < RedisAI_ScriptRunCtxNumOutputs(sctx) ; ++i){ |
| 4309 | PyTensor* pyt = PyObject_New(PyTensor, &PyTensorType); |
| 4310 | pyt->t = RedisAI_TensorGetShallowCopy(RedisAI_ScriptRunCtxOutputTensor(sctx, i)); |
| 4311 | PyList_Append(tensorList, (PyObject*)pyt); |
| 4312 | GearsPyDecRef((PyObject*)pyt); |
| 4313 | } |
| 4314 | |
| 4315 | PyTuple_SetItem(pArgs, 1, tensorList); |
| 4316 | PyObject* r = PyObject_CallObject(setFutureResultsFunction, pArgs); |
| 4317 | if(!r){ |
| 4318 | char* err = getPyError(); |
| 4319 | RedisModule_Log(NULL, "warning", "Error happened when releasing execution future, error='%s'", err); |
| 4320 | RG_FREE(err); |
| 4321 | }else{ |
| 4322 | GearsPyDecRef(r); |
| 4323 | } |
| 4324 | |
| 4325 | finish: |
| 4326 | RedisAI_FreeError(error); |
| 4327 | RedisAI_ScriptRunCtxFree(sctx); |
| 4328 | GearsPyDecRef(pArgs); |
| 4329 | RedisGearsPy_UNLOCK |
| 4330 | } |
| 4331 | |
| 4332 | static PyObject* scriptRunnerRunAsync(PyObject *cls, PyObject *args){ |
| 4333 | verifyRedisAILoaded(); |
nothing calls this directly
no test coverage detected