From 3f0b0f045fc5acbc2ce86ec951d7a9ddb0ce8eea Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Thu, 24 Aug 2023 17:40:55 +0200 Subject: [PATCH] async: signal ESHUTDOWN to all open worker callbacks (#915) o worker callbacks can execute destructors etc. --- include/re_types.h | 4 ++++ src/async/async.c | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/re_types.h b/include/re_types.h index 165934d40..049d0ab03 100644 --- a/include/re_types.h +++ b/include/re_types.h @@ -242,6 +242,10 @@ typedef SSIZE_T ssize_t; #define EKEYREJECTED 129 #endif +/* Cannot send after transport endpoint shutdown */ +#ifndef ESHUTDOWN +#define ESHUTDOWN 108 +#endif /* * Give the compiler a hint which branch is "likely" or "unlikely" (inspired diff --git a/src/async/async.c b/src/async/async.c index 0c17504e4..07cf885e6 100644 --- a/src/async/async.c +++ b/src/async/async.c @@ -96,6 +96,21 @@ static void async_destructor(void *data) thrd_join(async->thrd[i], NULL); } + /* Notify worker callbacks (so they can call destructors) */ + struct le *le; + LIST_FOREACH(&async->workl, le) + { + struct async_work *work = le->data; + if (work->cb) + work->cb(ESHUTDOWN, work->arg); + } + LIST_FOREACH(&async->curl, le) + { + struct async_work *work = le->data; + if (work->cb) + work->cb(ESHUTDOWN, work->arg); + } + list_flush(&async->workl); list_flush(&async->curl); list_flush(&async->freel);