X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=jam.c;h=5faf0379d4b7eb13299dd48595641d935e6e409a;hb=2f5350f30cbfeebde0bd287d16fb118639536493;hp=eb7dc1a09bc621da8aeee6c2b102f8084832bc3a;hpb=c329b5bf838d692d8a94117874795024783cd197;p=jam diff --git a/jam.c b/jam.c index eb7dc1a..5faf037 100644 --- a/jam.c +++ b/jam.c @@ -148,21 +148,14 @@ struct sender { unsigned long long bytes_left; }; -void generate_new_sender(int ep_fd) +void generate_new_sender(int ep_fd, struct sender *s) { int sock, one = 1; unsigned src_num, dst_num; unsigned long long num_bytes; struct sockaddr_in sin; struct epoll_event ev; - struct sender *s; - s = (struct sender *)malloc(sizeof(struct sender)); - if (s == NULL) { - perror("malloc()"); - exit(1); - } - sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == -1) { perror("socket()"); @@ -230,8 +223,15 @@ void *sender_worker(void *arg) buf[i] = rand() & 0xff; // allocate all the senders - for (i = 0; i < num_sockets_per_sender; ++i) - generate_new_sender(ep_fd); + for (i = 0; i < num_sockets_per_sender; ++i) { + struct sender *s = (struct sender *)malloc(sizeof(struct sender)); + if (s == NULL) { + perror("malloc()"); + exit(1); + } + + generate_new_sender(ep_fd, s); + } for ( ;; ) { int num_active = epoll_wait(ep_fd, events, num_sockets_per_sender, -1); @@ -251,6 +251,9 @@ void *sender_worker(void *arg) ret = send(s->fd, buf, bytes_to_send, MSG_NOSIGNAL); if (ret == -1) { + if (errno == EAGAIN) + continue; + perror("send()"); exit(1); } @@ -274,9 +277,7 @@ void *sender_worker(void *arg) exit(1); } close(s->fd); - - free(s); - generate_new_sender(ep_fd); + generate_new_sender(ep_fd, s); } } }