void pt_throw( pt_loop_t * loop, algorithm_instance_t * instance, event_t * event ) { if (event) { if (instance) { // Enqueue an algorithm event dynarray_push_element(instance->events, event); eventfd_write(instance->loop->eventfd_algorithm, 1); } else if (loop) { // Enqueue an user event dynarray_push_element(loop->events_user, event); eventfd_write(loop->eventfd_user, 1); } else { fprintf(stderr, "pt_algorithm_throw: event ignored\n"); } } }
void pt_algorithm_throw( pt_loop_t * loop, algorithm_instance_t * instance, event_t * event ) { //int ret; if (event) { if (instance) { // Enqueue an algorithm event dynarray_push_element(instance->events, event); eventfd_write(instance->loop->eventfd_algorithm, 1); // printf("ret1 = %d\n", ret); } else if (loop) { // Enqueue an user event dynarray_push_element(loop->events_user, event); eventfd_write(loop->eventfd_user, 1); //printf("ret2 = %d\n", ret); } } }
// TODO This could be replaced by watchers: FD -> action bool network_process_sendq(network_t * network) { probe_t * probe; packet_t * packet; size_t num_flying_probes; struct itimerspec new_timeout; // Probe skeleton when entering the network layer. // We have to duplicate the probe since the same address of skeleton // may have been passed to pt_send_probe. // => We duplicate this probe in the // network layer registry (network->probes) and then tagged. // Do not free probe at the end of this function. // Its address will be saved in network->probes and freed later. probe = queue_pop_element(network->sendq, NULL); // Tag the probe if (!network_tag_probe(network, probe)) { fprintf(stderr, "Can't tag probe\n"); goto ERR_TAG_PROBE; } if (network->is_verbose) { printf("Sending probe packet:\n"); probe_dump(probe); } // Make a packet from the probe structure if (!(packet = probe_create_packet(probe))) { fprintf(stderr, "Can't create packet\n"); goto ERR_CREATE_PACKET; } // Send the packet if (!(socketpool_send_packet(network->socketpool, packet))) { fprintf(stderr, "Can't send packet\n"); goto ERR_SEND_PACKET; } // Update the sending time probe_set_sending_time(probe, get_timestamp()); // Register this probe in the list of flying probes if (!(dynarray_push_element(network->probes, probe))) { fprintf(stderr, "Can't register probe\n"); goto ERR_PUSH_PROBE; } // We've just sent a probe and currently, this is the only one in transit. // So currently, there is no running timer, prepare timerfd. num_flying_probes = dynarray_get_size(network->probes); if (num_flying_probes == 1) { itimerspec_set_delay(&new_timeout, network_get_timeout(network)); if (timerfd_settime(network->timerfd, 0, &new_timeout, NULL) == -1) { fprintf(stderr, "Can't set timerfd\n"); goto ERR_TIMERFD; } } return true; ERR_TIMERFD: ERR_PUSH_PROBE: ERR_SEND_PACKET: packet_free(packet); ERR_CREATE_PACKET: ERR_TAG_PROBE: return false; }
static bool probe_push_layer(probe_t * probe, layer_t * layer) { return dynarray_push_element(probe->layers, layer); }