From 64da4fd587cbbbb5ddbe7b83ac8fb9f5f390862b Mon Sep 17 00:00:00 2001 From: Karl Lehenbauer Date: Fri, 13 Jan 2017 06:12:58 +0000 Subject: [PATCH] synchronous "create" method is now asynchronous behind your back --- generic/zookeepertcl.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/generic/zookeepertcl.c b/generic/zookeepertcl.c index 8c706eb..8544f87 100644 --- a/generic/zookeepertcl.c +++ b/generic/zookeepertcl.c @@ -523,6 +523,30 @@ zootcl_sync_data_completion_callback (int rc, const char *value, int valueLen, c zootcl_queue_null_event (zsc); } +/* + *-------------------------------------------------------------- + * + * zootcl_sync_string_completion_callback -- string completion callback function + * + *-------------------------------------------------------------- + */ +void +zootcl_sync_string_completion_callback (int rc, const char *value, const void *context) +{ + zootcl_syncCallbackContext *zsc = (zootcl_syncCallbackContext *)context; + zsc->rc = rc; + + // if value is NULL then there is no value associated with this znode + // we set to NULL and the other end (the event handler) will discriminate + if (value == NULL) { + zsc->dataObj = NULL; + } else { + zsc->dataObj = Tcl_NewStringObj (value, -1); + } + zsc->syncDone = 1; + zootcl_queue_null_event (zsc); +} + /* *-------------------------------------------------------------- * @@ -1792,15 +1816,21 @@ zootcl_create_subcommand(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], ZO } } - char returnPathBuf[1024*1024]; - int status; if (callbackObj == NULL) { - status = zoo_create (zh, path, value, valueLen, &ZOO_OPEN_ACL_UNSAFE, flags, returnPathBuf, sizeof(returnPathBuf)); + zootcl_syncCallbackContext *zsc = (zootcl_syncCallbackContext *)ckalloc (sizeof (zootcl_syncCallbackContext)); + zsc->zo = zo; + zsc->syncDone = 0; + status = zoo_acreate (zh, path, value, valueLen, &ZOO_OPEN_ACL_UNSAFE, flags, zootcl_sync_string_completion_callback, zsc); + if (zootcl_wait (zo, zsc) == TCL_ERROR) { + ckfree (zsc); + return TCL_ERROR; + } if (status == ZOK) { - Tcl_SetObjResult (interp, Tcl_NewStringObj (returnPathBuf, -1)); + Tcl_SetObjResult (interp, zsc->dataObj); } + ckfree (zsc); } else { zootcl_callbackContext *ztc = (zootcl_callbackContext *)ckalloc (sizeof (zootcl_callbackContext)); ztc->callbackObj = callbackObj;