diff --git a/ffi/event_thread.nim b/ffi/event_thread.nim index cab1f2c..921555b 100644 --- a/ffi/event_thread.nim +++ b/ffi/event_thread.nim @@ -47,7 +47,8 @@ proc emitLivenessEvent[T, P](ctx: ptr FFIContext[T], name: string, payload: P) = chronicles.error "liveness event encode failed", name = name, err = exc.msg return let dataPtr: pointer = - if event.len > 0: unsafeAddr event[0] else: nil + if event.len > 0: cast[pointer](unsafeAddr event[0]) + else: cast[pointer](emptyListenerPayload) ctx.dispatchToListeners(name, dataPtr, event.len) proc onNotResponding*(ctx: ptr FFIContext) = diff --git a/ffi/ffi_context.nim b/ffi/ffi_context.nim index bbc512b..811b920 100644 --- a/ffi/ffi_context.nim +++ b/ffi/ffi_context.nim @@ -133,7 +133,7 @@ proc initContextResources*[T](ctx: ptr FFIContext[T]): Result[void, string] = return err("failed to create the event thread: " & getCurrentExceptionMsg()) success = true - ok() + return ok() proc fireOrErr(sig: ThreadSignalPtr, name: string): Result[void, string] = let fired = sig.fireSync().valueOr: @@ -176,7 +176,7 @@ proc stopAndJoinThreads*[T](ctx: ptr FFIContext[T]): Result[void, string] = joinThread(ctx.ffiThread) ?ctx.eventThreadExitSignal.waitExitOrErr("event thread", ThreadExitTimeout) joinThread(ctx.eventThread) - ok() + return ok() proc clearContext[T](ctx: ptr FFIContext[T]): Result[void, string] = ## Stops a heap-allocated FFI context. @@ -184,4 +184,4 @@ proc clearContext[T](ctx: ptr FFIContext[T]): Result[void, string] = return err("clearContext: " & $error) ctx.cleanUpResources().isOkOr: return err("cleanUpResources failed: " & $error) - ok() + return ok() diff --git a/ffi/ffi_events.nim b/ffi/ffi_events.nim index 8c92f7e..4ea4b5b 100644 --- a/ffi/ffi_events.nim +++ b/ffi/ffi_events.nim @@ -178,7 +178,7 @@ proc eventQueueLen*(q: var EventQueue): int {.raises: [], gcsafe.} = return q.count -const emptyListenerPayload: cstring = "" +const emptyListenerPayload*: cstring = "" ## Non-nil zero-length buffer handed to listeners when a payload is ## empty, so a consumer doing `std::string(data, len)` / `memcpy` never ## receives a nil pointer (which is UB even at len 0). @@ -197,7 +197,8 @@ proc notifyListeners*( proc notifyListenersErr*(listeners: seq[FFIEventListener], msg: string) = let p = - if msg.len > 0: cast[pointer](unsafeAddr msg[0]) else: nil + if msg.len > 0: cast[pointer](unsafeAddr msg[0]) + else: cast[pointer](emptyListenerPayload) notifyListeners(listeners, RET_ERR, p, msg.len) var ffiCurrentEventRegistry* {.threadvar.}: ptr FFIEventRegistry