diff --git a/library/libwaku.h b/library/libwaku.h index 1dc7cf0ae..155cef02b 100644 --- a/library/libwaku.h +++ b/library/libwaku.h @@ -35,6 +35,11 @@ int waku_stop(void* ctx, WakuCallBack callback, void* userData); +// Destroys an instance of a waku node created with waku_new +int waku_destroy(void* ctx, + WakuCallBack callback, + void* userData); + int waku_version(void* ctx, WakuCallBack callback, void* userData); diff --git a/library/libwaku.nim b/library/libwaku.nim index 41a1c316c..9ad0100f1 100644 --- a/library/libwaku.nim +++ b/library/libwaku.nim @@ -100,6 +100,20 @@ proc waku_new(configJson: cstring, return ctx +proc waku_destroy(ctx: ptr Context, + callback: WakuCallBack, + userData: pointer): cint {.dynlib, exportc.} = + + if isNil(callback): + return RET_MISSING_CALLBACK + + waku_thread.stopWakuThread(ctx).isOkOr: + let msg = $error + callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) + return RET_ERR + + return RET_OK + proc waku_version(ctx: ptr Context, callback: WakuCallBack, userData: pointer): cint {.dynlib, exportc.} = diff --git a/library/waku_thread/waku_thread.nim b/library/waku_thread/waku_thread.nim index 14680b572..079e22f29 100644 --- a/library/waku_thread/waku_thread.nim +++ b/library/waku_thread/waku_thread.nim @@ -95,12 +95,16 @@ proc createWakuThread*(): Result[ptr Context, string] = return ok(ctx) -proc stopWakuNodeThread*(ctx: ptr Context) = +proc stopWakuThread*(ctx: ptr Context): Result[void, string] = running.store(false) + let fireRes = ctx.reqSignal.fireSync() + if fireRes.isErr(): + return err("error in stopWakuThread: " & $fireRes.error) joinThread(ctx.thread) discard ctx.reqSignal.close() discard ctx.respSignal.close() freeShared(ctx) + return ok() proc sendRequestToWakuThread*(ctx: ptr Context, reqType: RequestType,