Beispiel #1
0
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);
    }
}
Beispiel #2
0
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);

}