Skip to content

Commit c28a807

Browse files
jpnurmiclaude
andcommitted
fix(sync): let is_done handle delayed tasks on shutdown
Instead of explicitly discarding delayed tasks in worker_thread, teach sentry__bgworker_is_done to treat pending delayed tasks as done when !running. Remaining tasks are cleaned up by decref. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent b97d337 commit c28a807

2 files changed

Lines changed: 10 additions & 18 deletions

File tree

src/sentry_sync.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,9 @@ sentry__bgworker_get_state(sentry_bgworker_t *bgw)
226226
static bool
227227
sentry__bgworker_is_done(sentry_bgworker_t *bgw)
228228
{
229-
return !bgw->first_task && !sentry__atomic_fetch(&bgw->running);
229+
return (!bgw->first_task
230+
|| sentry__monotonic_time() < bgw->first_task->execute_after)
231+
&& !sentry__atomic_fetch(&bgw->running);
230232
}
231233

232234
SENTRY_THREAD_FN
@@ -265,16 +267,6 @@ worker_thread(void *data)
265267
{
266268
uint64_t now = sentry__monotonic_time();
267269
if (now < task->execute_after) {
268-
// discard delayed tasks submitted after shutdown pruning
269-
if (!sentry__atomic_fetch(&bgw->running)) {
270-
while (bgw->first_task) {
271-
sentry_bgworker_task_t *t = bgw->first_task;
272-
bgw->first_task = t->next_task;
273-
sentry__task_decref(t);
274-
}
275-
bgw->last_task = NULL;
276-
continue;
277-
}
278270
sentry__cond_wait_timeout(&bgw->submit_signal, &bgw->task_lock,
279271
(uint32_t)(task->execute_after - now));
280272
continue;

tests/unit/test_sync.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -344,13 +344,13 @@ SENTRY_TEST(bgworker_delayed_shutdown)
344344
sentry__bgworker_submit(bgw, record_order_task, NULL, (void *)2);
345345
sentry__bgworker_submit(bgw, record_order_task, NULL, (void *)3);
346346

347-
// delayed tasks are discarded on shutdown unless already ready
348-
sentry__bgworker_submit_delayed(
349-
bgw, record_order_task, NULL, (void *)4, 50);
350-
sentry__bgworker_submit_delayed(
351-
bgw, record_order_task, NULL, (void *)5, 5000);
352-
sentry__bgworker_submit_delayed(
353-
bgw, record_order_task, NULL, (void *)6, 5000);
347+
// pending delayed tasks are discarded on shutdown
348+
sentry__bgworker_submit_at(
349+
bgw, record_order_task, NULL, (void *)4, UINT64_MAX);
350+
sentry__bgworker_submit_at(
351+
bgw, record_order_task, NULL, (void *)5, UINT64_MAX);
352+
sentry__bgworker_submit_at(
353+
bgw, record_order_task, NULL, (void *)6, UINT64_MAX);
354354

355355
sentry__bgworker_start(bgw);
356356
TEST_CHECK_INT_EQUAL(sentry__bgworker_shutdown(bgw, 1000), 0);

0 commit comments

Comments
 (0)