void async_loop(async_state_t *state) { action_t *p, *new_actions, *action, **action_last; while (1) { /* get new ones */ action_last = &new_actions; while (state->cur_actions < state->max_actions && (action = action_queue_pop(&state->queue, 0))) { *action_last = action; action_last = &action->next; ++state->cur_actions; } *action_last = state->head; state->head = new_actions; /* process actions */ for (action = state->head, action_last = &state->head; action; ) { if (action->ready) { pthread_setspecific(my_thread_state_key, action); qemu_coroutine_enter(action->coro, action); } /* this is normal return, not through yield */ if (action->ready) { p = action->next; put_action(action); action = p; --state->cur_actions; } else { *action_last = action; action_last = &action->next; action = action->next; } } *action_last = NULL; wait_ready_fd(state); } }
int c_action(const char *action_text) { void *p; lt_packet out_packet; client_func_checks(); makepacket(&out_packet, T_ACTION); p = &out_packet.payload; if (action_text) put_action(&p, action_text, &PLength(&out_packet), &PArgc(&out_packet)); return sendpacket(neighbor_table[1][1][1], &out_packet); }