From cdca0d0df45d29f7245a311701ce0d9398e1a29a Mon Sep 17 00:00:00 2001 From: Arnaud Date: Thu, 11 Sep 2025 12:30:54 +0200 Subject: [PATCH] Avoid raising errors in the spawn threads --- codex/contracts/clock.nim | 1 - library/codex_context.nim | 12 ++++--- .../codex_thread_request.nim | 2 +- .../requests/node_lifecycle_request.nim | 33 +++++++++++-------- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/codex/contracts/clock.nim b/codex/contracts/clock.nim index 885d8e86..1d4f57ba 100644 --- a/codex/contracts/clock.nim +++ b/codex/contracts/clock.nim @@ -1,4 +1,3 @@ - {.push raises: [].} import std/times diff --git a/library/codex_context.nim b/library/codex_context.nim index 592b0b9c..c0451e9b 100644 --- a/library/codex_context.nim +++ b/library/codex_context.nim @@ -65,7 +65,7 @@ template callEventCallback(ctx: ptr CodexContext, eventName: string, body: untyp cast[CodexCallback](ctx[].eventCallback)( RET_OK, unsafeAddr event[0], cast[csize_t](len(event)), ctx[].eventUserData ) - except Exception, CatchableError: + except CatchableError: let msg = "Exception " & eventName & " when calling 'eventCallBack': " & getCurrentExceptionMsg() @@ -114,12 +114,16 @@ proc sendRequestToCodexThread*( ## process proc. See the 'codex_thread_request.nim' module for more details. ok() -proc runCodex(ctx: ptr CodexContext) {.async.} = +proc runCodex(ctx: ptr CodexContext) {.async: (raises: []).} = var codex: CodexServer while true: - # Wait until a request is available - await ctx.reqSignal.wait() + try: + # Wait until a request is available + await ctx.reqSignal.wait() + except Exception as e: + error "codex thread error while waiting for reqSignal", error = e.msg + continue # If codex_destroy was called, exit the loop if ctx.running.load == false: diff --git a/library/codex_thread_requests/codex_thread_request.nim b/library/codex_thread_requests/codex_thread_request.nim index 9e2c7ae1..00acc526 100644 --- a/library/codex_thread_requests/codex_thread_request.nim +++ b/library/codex_thread_requests/codex_thread_request.nim @@ -67,7 +67,7 @@ proc handleRes[T: string | void]( proc process*( T: type CodexThreadRequest, request: ptr CodexThreadRequest, codex: ptr CodexServer -) {.async.} = +) {.async: (raises: []).} = ## Processes the request in the Codex thread. ## Dispatch to the appropriate request handler based on reqType. let retFut = diff --git a/library/codex_thread_requests/requests/node_lifecycle_request.nim b/library/codex_thread_requests/requests/node_lifecycle_request.nim index 9a4c623d..19bcb37c 100644 --- a/library/codex_thread_requests/requests/node_lifecycle_request.nim +++ b/library/codex_thread_requests/requests/node_lifecycle_request.nim @@ -87,18 +87,25 @@ proc destroyShared(self: ptr NodeLifecycleRequest) = deallocShared(self[].configJson) deallocShared(self) -proc createCodex(configJson: cstring): Future[Result[CodexServer, string]] {.async.} = - var conf = CodexConf.load( - version = codexFullVersion, - envVarsPrefix = "codex", - cmdLine = @[], - secondarySources = proc( - config: CodexConf, sources: auto - ) {.gcsafe, raises: [ConfigurationError].} = - if configJson.len > 0: - sources.addConfigFileContent(Json, $(configJson)) - , - ) +proc createCodex( + configJson: cstring +): Future[Result[CodexServer, string]] {.async: (raises: []).} = + var conf: CodexConf + + try: + conf = CodexConf.load( + version = codexFullVersion, + envVarsPrefix = "codex", + cmdLine = @[], + secondarySources = proc( + config: CodexConf, sources: auto + ) {.gcsafe, raises: [ConfigurationError].} = + if configJson.len > 0: + sources.addConfigFileContent(Json, $(configJson)) + , + ) + except ConfigurationError as e: + return err("Failed to load configuration: " & e.msg) conf.setupLogging() conf.setupMetrics() @@ -136,7 +143,7 @@ proc createCodex(configJson: cstring): Future[Result[CodexServer, string]] {.asy proc process*( self: ptr NodeLifecycleRequest, codex: ptr CodexServer -): Future[Result[string, string]] {.async.} = +): Future[Result[string, string]] {.async: (raises: []).} = defer: destroyShared(self)