Skip to content

Commit b64dd6b

Browse files
committed
Fix segfaults
1 parent ab9f47d commit b64dd6b

File tree

1 file changed

+45
-64
lines changed

1 file changed

+45
-64
lines changed

src/backends/tensorflow.c

Lines changed: 45 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,6 @@ RAI_Model *RAI_ModelCreateTF(RAI_Backend backend, const char *devicestr, RAI_Mod
271271
options = NULL;
272272
TF_DeleteBuffer(tfbuffer);
273273
tfbuffer = NULL;
274-
TF_DeleteStatus(status);
275-
status = NULL;
276274

277275
TF_Output tf_inputs[ninputs];
278276
TF_Output tf_outputs[noutputs];
@@ -305,37 +303,37 @@ RAI_Model *RAI_ModelCreateTF(RAI_Backend backend, const char *devicestr, RAI_Mod
305303
noutputs, tf_outputs, // noutputs, outputs
306304
outputs, // output_names,
307305
NULL, // opts
308-
"", // description
306+
NULL, // description
309307
status // status
310308
);
311-
// TODO EAGER
312-
// check status and return error
309+
310+
if (TF_GetCode(status) != TF_OK) {
311+
RAI_SetError(error, RAI_EMODELCONFIGURE, RedisModule_Strdup(TF_Message(status)));
312+
goto cleanup;
313+
}
313314

314315
TFE_ContextOptions *context_opts = TFE_NewContextOptions();
315316
// TFE_ContextOptionsSetConfig(context_opts, proto, proto_len, status);
316317
// TFE_ContextOptionsSetAsync(context_opts, 0);
317-
TFE_ContextOptionsSetDevicePlacementPolicy(context_opts, TFE_DEVICE_PLACEMENT_EXPLICIT);
318+
// TFE_ContextOptionsSetDevicePlacementPolicy(context_opts, TFE_DEVICE_PLACEMENT_EXPLICIT);
318319

319320
TFE_Context *context = TFE_NewContext(context_opts, status);
320-
// TODO EAGER
321-
// check status and return error
321+
if (TF_GetCode(status) != TF_OK) {
322+
RAI_SetError(error, RAI_EMODELCONFIGURE, RedisModule_Strdup(TF_Message(status)));
323+
goto cleanup;
324+
}
322325

323326
TFE_ContextAddFunction(context, function, status);
324-
// TODO EAGER
325-
// check status and return error
327+
if (TF_GetCode(status) != TF_OK) {
328+
RAI_SetError(error, RAI_EMODELCONFIGURE, RedisModule_Strdup(TF_Message(status)));
329+
goto cleanup;
330+
}
326331

327332
TFE_DeleteContextOptions(context_opts);
328-
TFE_DeleteContext(context);
329333

330-
#if 0
331-
TF_Status *optionsStatus = NULL;
332-
TF_SessionOptions *sessionOptions = NULL;
333-
TF_Status *sessionStatus = NULL;
334-
TF_Session *session = NULL;
335-
336-
optionsStatus = TF_NewStatus();
337-
sessionOptions = TF_NewSessionOptions();
334+
TF_DeleteStatus(status);
338335

336+
#if 0
339337
// For setting config options in session from the C API see:
340338
// https://github.com/tensorflow/tensorflow/issues/13853
341339
// import tensorflow as tf
@@ -390,16 +388,6 @@ RAI_Model *RAI_ModelCreateTF(RAI_Backend backend, const char *devicestr, RAI_Mod
390388
}
391389
}
392390

393-
if (TF_GetCode(optionsStatus) != TF_OK) {
394-
RAI_SetError(error, RAI_EMODELCONFIGURE, RedisModule_Strdup(TF_Message(optionsStatus)));
395-
goto cleanup;
396-
}
397-
TF_DeleteStatus(optionsStatus);
398-
optionsStatus = NULL;
399-
400-
sessionStatus = TF_NewStatus();
401-
session = TF_NewSession(graph, sessionOptions, sessionStatus);
402-
403391
TF_Status *deviceListStatus = TF_NewStatus();
404392
TF_DeviceList *deviceList = TF_SessionListDevices(session, deviceListStatus);
405393
const int num_devices = TF_DeviceListCount(deviceList);
@@ -425,9 +413,6 @@ RAI_Model *RAI_ModelCreateTF(RAI_Backend backend, const char *devicestr, RAI_Mod
425413
RAI_SetError(error, RAI_EMODELCREATE, RedisModule_Strdup(TF_Message(status)));
426414
goto cleanup;
427415
}
428-
429-
TF_DeleteSessionOptions(sessionOptions);
430-
TF_DeleteStatus(sessionStatus);
431416
#endif
432417

433418
char **inputs_ = array_new(char *, ninputs);
@@ -467,33 +452,13 @@ RAI_Model *RAI_ModelCreateTF(RAI_Backend backend, const char *devicestr, RAI_Mod
467452
TF_DeleteBuffer(tfbuffer);
468453
if (status)
469454
TF_DeleteStatus(status);
470-
// if (sessionOptions)
471-
// TF_DeleteSessionOptions(sessionOptions);
472-
// if (sessionStatus)
473-
// TF_DeleteStatus(sessionStatus);
474455
return NULL;
475456
}
476457

477458
void RAI_ModelFreeTF(RAI_Model *model, RAI_Error *error) {
478-
TF_Status *status = TF_NewStatus();
479-
#if 0
480-
TF_CloseSession(model->session, status);
481-
482-
if (TF_GetCode(status) != TF_OK) {
483-
RAI_SetError(error, RAI_EMODELFREE, RedisModule_Strdup(TF_Message(status)));
484-
return;
485-
}
486-
487-
TF_DeleteSession(model->session, status);
488-
#endif
489459
TFE_DeleteContext(model->session);
490460
model->session = NULL;
491461

492-
// if (TF_GetCode(status) != TF_OK) {
493-
// RAI_SetError(error, RAI_EMODELFREE, RedisModule_Strdup(TF_Message(status)));
494-
// return;
495-
// }
496-
497462
TF_DeleteGraph(model->model);
498463
model->model = NULL;
499464

@@ -518,10 +483,6 @@ void RAI_ModelFreeTF(RAI_Model *model, RAI_Error *error) {
518483
if (model->data) {
519484
RedisModule_Free(model->data);
520485
}
521-
522-
#if 0
523-
TF_DeleteStatus(status);
524-
#endif
525486
}
526487

527488
int RAI_ModelRunTF(RAI_ModelRunCtx **mctxs, RAI_Error *error) {
@@ -562,24 +523,44 @@ int RAI_ModelRunTF(RAI_ModelRunCtx **mctxs, RAI_Error *error) {
562523
}
563524
inputTensorsValues[i] = RAI_TFTensorFromTensors(batched_input_tensors, nbatches);
564525
inputTensorsHandles[i] = TFE_NewTensorHandle(inputTensorsValues[i], status);
565-
// TODO EAGER
566-
// check status and return error
526+
if (TF_GetCode(status) != TF_OK) {
527+
char *errorMessage = RedisModule_Strdup(TF_Message(status));
528+
RAI_SetError(error, RAI_EMODELRUN, errorMessage);
529+
TF_DeleteStatus(status);
530+
RedisModule_Free(errorMessage);
531+
return 1;
532+
}
567533
}
568534

569535
TFE_Op *fn_op = TFE_NewOp(mctxs[0]->model->session, RAI_TF_FN_NAME, status);
570-
// TODO EAGER
571-
// check status and return error
536+
if (TF_GetCode(status) != TF_OK) {
537+
char *errorMessage = RedisModule_Strdup(TF_Message(status));
538+
RAI_SetError(error, RAI_EMODELRUN, errorMessage);
539+
TF_DeleteStatus(status);
540+
RedisModule_Free(errorMessage);
541+
return 1;
542+
}
572543

573544
TFE_OpAddInputList(fn_op, inputTensorsHandles, ninputs, status);
574-
// TODO EAGER
575-
// check status and return error
545+
if (TF_GetCode(status) != TF_OK) {
546+
char *errorMessage = RedisModule_Strdup(TF_Message(status));
547+
RAI_SetError(error, RAI_EMODELRUN, errorMessage);
548+
TF_DeleteStatus(status);
549+
RedisModule_Free(errorMessage);
550+
return 1;
551+
}
576552

577553
// TODO EAGER: send tensors to device (as long as we keep device allocation EXPLICIT)
578554

579555
int noutputs_ = noutputs;
580556
TFE_Execute(fn_op, outputTensorsHandles, &noutputs_, status);
581-
// TODO EAGER
582-
// check status and return error
557+
if (TF_GetCode(status) != TF_OK) {
558+
char *errorMessage = RedisModule_Strdup(TF_Message(status));
559+
RAI_SetError(error, RAI_EMODELRUN, errorMessage);
560+
TF_DeleteStatus(status);
561+
RedisModule_Free(errorMessage);
562+
return 1;
563+
}
583564

584565
for (size_t i = 0; i < ninputs; ++i) {
585566
TFE_DeleteTensorHandle(inputTensorsHandles[i]);

0 commit comments

Comments
 (0)