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); }
int main() { plan(7); memory_init(); fiber_init(fiber_c_invoke); struct fiber *f = fiber_new("main", main_f); fiber_wakeup(f); ev_run(loop(), 0); fiber_free(); memory_free(); return check_plan(); }
static void fiber_kick(int max) { ACL_RING *head; ACL_FIBER *fiber; while (max > 0) { head = acl_ring_pop_head(&__thread_fiber->dead); if (head == NULL) break; fiber = ACL_RING_TO_APPL(head, ACL_FIBER,me); fiber_free(fiber); max--; } }