Merge branch 'chore/ffi-context-lifecycle' into chore/event-separate-thread

This commit is contained in:
Gabriel Cruz 2026-06-08 08:29:28 -03:00 committed by GitHub
commit 8ac3b5d52c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 8 additions and 6 deletions

View File

@ -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) =

View File

@ -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()

View File

@ -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