void acl_fiber_schedule(void) { ACL_FIBER *fiber; ACL_RING *head; acl_fiber_hook_api(1); for (;;) { head = acl_ring_pop_head(&__thread_fiber->ready); if (head == NULL) { acl_msg_info("------- NO ACL_FIBER NOW --------"); break; } fiber = ACL_RING_TO_APPL(head, ACL_FIBER, me); fiber->status = FIBER_STATUS_READY; __thread_fiber->running = fiber; __thread_fiber->switched++; fiber_swap(&__thread_fiber->original, fiber); __thread_fiber->running = NULL; } /* release dead fiber */ while ((head = acl_ring_pop_head(&__thread_fiber->dead)) != NULL) { fiber = ACL_RING_TO_APPL(head, ACL_FIBER, me); fiber_free(fiber); } acl_fiber_hook_api(0); }
void fiber::hook_api(bool on) { acl_fiber_hook_api(on ? 1 : 0); }