diff --git a/src/lib/core/fiber.c b/src/lib/core/fiber.c index f7816d780c7c7159319598eb48330e8a845ab694..9e5a6b93efc20cec93eca42b4249d12ad53336f8 100644 --- a/src/lib/core/fiber.c +++ b/src/lib/core/fiber.c @@ -1240,7 +1240,6 @@ fiber_new_ex(const char *name, const struct fiber_attr *fiber_attr, struct fiber, link); rlist_move_entry(&cord->alive, fiber, link); assert((fiber->flags | FIBER_IS_DEAD) != 0); - fiber->flags = FIBER_DEFAULT_FLAGS; } else { fiber = (struct fiber *) mempool_alloc(&cord->fiber_mempool); @@ -1265,11 +1264,10 @@ fiber_new_ex(const char *name, const struct fiber_attr *fiber_attr, rlist_create(&fiber->wake); diag_create(&fiber->diag); fiber_reset(fiber); - fiber->flags = fiber_attr->flags; rlist_add_entry(&cord->alive, fiber, link); } - + fiber->flags = fiber_attr->flags; fiber->f = f; /* Excluding reserved range */ if (++cord->max_fid < FIBER_ID_MAX_RESERVED) diff --git a/test/unit/fiber.cc b/test/unit/fiber.cc index 9d21840dd1f646f04c9b7ec1e9ae01a4e233f9d6..211a1e8343a8e13c77a91f9a9c478eb3046b0692 100644 --- a/test/unit/fiber.cc +++ b/test/unit/fiber.cc @@ -37,6 +37,14 @@ cancel_f(va_list ap) return 0; } +static int +wait_cancel_f(va_list ap) +{ + while (!fiber_is_cancelled()) + fiber_yield(); + return 0; +} + static int exception_f(va_list ap) { @@ -261,6 +269,29 @@ fiber_dead_while_in_cache_test(void) footer(); } +static void +fiber_flags_respect_test(void) +{ + header(); + + /* Make sure the cache has at least one fiber. */ + struct fiber *f = fiber_new_xc("nop", noop_f); + fiber_start(f); + + /* Fibers taken from the cache need to respect the passed flags. */ + struct fiber_attr attr; + fiber_attr_create(&attr); + uint32_t flags = FIBER_IS_JOINABLE | FIBER_IS_CANCELLABLE; + attr.flags |= flags; + f = fiber_new_ex("wait_cancel", &attr, wait_cancel_f); + fail_unless((f->flags & flags) == flags); + fiber_wakeup(f); + fiber_cancel(f); + fiber_join(f); + + footer(); +} + static int main_f(va_list ap) { @@ -269,6 +300,7 @@ main_f(va_list ap) fiber_stack_test(); fiber_wakeup_self_test(); fiber_dead_while_in_cache_test(); + fiber_flags_respect_test(); ev_break(loop(), EVBREAK_ALL); return 0; } diff --git a/test/unit/fiber.result b/test/unit/fiber.result index 8234bf0e5485f5b3ada117de8dba4c143c39e879..61ff54529c4c8db88f6dd3263cf7d30fc0a52983 100644 --- a/test/unit/fiber.result +++ b/test/unit/fiber.result @@ -21,3 +21,5 @@ SystemError Failed to allocate 42 bytes in allocator for exception: Cannot alloc *** fiber_wakeup_self_test: done *** *** fiber_dead_while_in_cache_test *** *** fiber_dead_while_in_cache_test: done *** + *** fiber_flags_respect_test *** + *** fiber_flags_respect_test: done ***