diff --git a/src/coio_task.c b/src/coio_task.c index 081b1e4793adc1cbd8f03b866ac585a61af3c2a6..0ba83a5a322c48eb949589a37040b47bb7284f75 100644 --- a/src/coio_task.c +++ b/src/coio_task.c @@ -274,19 +274,14 @@ coio_call(ssize_t (*func)(va_list ap), ...) task->complete = 0; diag_create(&task->diag); - bool cancellable = fiber_set_cancellable(false); - va_start(task->ap, func); eio_submit(&task->base); - fiber_yield(); - /* Spurious wakeup indicates a severe BUG, fail early. */ - if (task->complete == 0) - panic("Wrong fiber woken"); + do { + fiber_yield(); + } while (task->complete == 0); va_end(task->ap); - fiber_set_cancellable(cancellable); - ssize_t result = task->base.result; int save_errno = errno; if (result) diff --git a/test/unit/coio.cc b/test/unit/coio.cc index 9813988ea0a815a496ac49d033a456efef055967..d1e74450874bc93e164ad31fe3eefbc3eb69164f 100644 --- a/test/unit/coio.cc +++ b/test/unit/coio.cc @@ -1,6 +1,7 @@ #include "memory.h" #include "fiber.h" #include "coio.h" +#include "coio_task.h" #include "fio.h" #include "unit.h" #include "unit.h" @@ -50,6 +51,23 @@ stat_timeout_test(const char *filename) footer(); } +static ssize_t +coio_test_wakeup(va_list ap) +{ + usleep(1000); + return 0; +} + +static int +test_call_f(va_list ap) +{ + header(); + int res = coio_call(coio_test_wakeup); + note("call done with res %i", res); + footer(); + return res; +} + static int main_f(va_list ap) { @@ -59,6 +77,15 @@ main_f(va_list ap) stat_notify_test(f, filename); fclose(f); (void) remove(filename); + + coio_enable(); + struct fiber *call_fiber = fiber_new_xc("coio_call wakeup", test_call_f); + fiber_set_joinable(call_fiber, true); + fiber_start(call_fiber); + fiber_wakeup(call_fiber); + fiber_cancel(call_fiber); + fiber_join(call_fiber); + ev_break(loop(), EVBREAK_ALL); return 0; } diff --git a/test/unit/coio.result b/test/unit/coio.result index b8391a50c65b5f8b692ae3949fbd11c91b9e8521..7d7477979702f34968ecb54788cd1f24f61053c9 100644 --- a/test/unit/coio.result +++ b/test/unit/coio.result @@ -3,3 +3,6 @@ *** stat_notify_test *** # filename: 1.out *** stat_notify_test: done *** + *** test_call_f *** +# call done with res 0 + *** test_call_f: done ***