diff options
| author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-10-24 09:09:40 +0000 | 
|---|---|---|
| committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-10-24 09:09:40 +0000 | 
| commit | b05290df28e380ddc789fd5e7eada95e9adef389 (patch) | |
| tree | 016e36503f658e209f76e2b6bfc8d37bb23fc04c /src/tools | |
| parent | 1c06b9ff80a2bf7ee6042534fee6098f7e452b59 (diff) | |
| parent | c4d765b68047176fb83ebc5a7462a68a5d051008 (diff) | |
| download | ouroboros-b05290df28e380ddc789fd5e7eada95e9adef389.tar.gz ouroboros-b05290df28e380ddc789fd5e7eada95e9adef389.zip | |
Merged in dstaesse/ouroboros/be-oping (pull request #277)
tools: Fix memory leaks in oping
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/oping/oping.c | 2 | ||||
| -rw-r--r-- | src/tools/oping/oping_client.c | 18 | ||||
| -rw-r--r-- | src/tools/oping/oping_server.c | 23 | 
3 files changed, 26 insertions, 17 deletions
| diff --git a/src/tools/oping/oping.c b/src/tools/oping/oping.c index b476b33a..801f79b5 100644 --- a/src/tools/oping/oping.c +++ b/src/tools/oping/oping.c @@ -54,6 +54,7 @@ struct c {          double rtt_m2;          flow_set_t * flows; +        fqueue_t *   fq;          /* needs locking */          struct timespec * times; @@ -66,6 +67,7 @@ struct c {  struct s {          struct timespec   times[OPING_MAX_FLOWS];          flow_set_t *      flows; +        fqueue_t *        fq;          pthread_mutex_t   lock;          pthread_t cleaner_pt; diff --git a/src/tools/oping/oping_client.c b/src/tools/oping/oping_client.c index 9f49a1df..85cb2880 100644 --- a/src/tools/oping/oping_client.c +++ b/src/tools/oping/oping_client.c @@ -64,16 +64,14 @@ void * reader(void * o)          int msg_len = 0;          double ms = 0;          double d = 0; -        fqueue_t * fq = fqueue_create(); -        if (fq == NULL) -                return (void *) 1;          (void) o;          /* FIXME: use flow timeout option once we have it */          while (client.rcvd != client.count -               && flow_event_wait(client.flows, fq, &timeout) != -ETIMEDOUT) { -                while ((fd = fqueue_next(fq)) >= 0) { +               && (flow_event_wait(client.flows, client.fq, &timeout) +                   != -ETIMEDOUT)) { +                while ((fd = fqueue_next(client.fq)) >= 0) {                          msg_len = flow_read(fd, buf, OPING_BUF_SIZE);                          if (msg_len < 0)                                  continue; @@ -175,7 +173,13 @@ int client_main(void)          client.flows = flow_set_create();          if (client.flows == NULL) -                return 0; +                return -1; + +        client.fq = fqueue_create(); +        if (client.fq == NULL) { +                flow_set_destroy(client.flows); +                return -1; +        }          fd = flow_alloc(client.s_apn, NULL, NULL);          if (fd < 0) { @@ -251,6 +255,8 @@ int client_main(void)          pthread_mutex_lock(&client.lock);          free(client.times); +        flow_set_destroy(client.flows); +        fqueue_destroy(client.fq);          pthread_mutex_unlock(&client.lock);          pthread_mutex_destroy(&client.lock); diff --git a/src/tools/oping/oping_server.c b/src/tools/oping/oping_server.c index bcd47f9a..720e71b6 100644 --- a/src/tools/oping/oping_server.c +++ b/src/tools/oping/oping_server.c @@ -75,23 +75,15 @@ void * server_thread(void *o)          struct timespec now = {0, 0};          struct timespec timeout = {0, 100 * MILLION};          int fd; -        fqueue_t * fq = fqueue_create(); -        if (fq == NULL) -                return (void *) 1;          (void) o;          while (true) { -                int ret = flow_event_wait(server.flows, fq, &timeout); -                if (ret == -ETIMEDOUT) +                if (flow_event_wait(server.flows, server.fq, &timeout) +                    == -ETIMEDOUT)                          continue; -                if (ret < 0) { -                        printf("Event error.\n"); -                        break; -                } - -                while ((fd = fqueue_next(fq)) >= 0) { +                while ((fd = fqueue_next(server.fq)) >= 0) {                          msg_len = flow_read(fd, buf, OPING_BUF_SIZE);                          if (msg_len < 0)                                  continue; @@ -176,6 +168,12 @@ int server_main(void)          if (server.flows == NULL)                  return 0; +        server.fq = fqueue_create(); +        if (server.fq == NULL) { +                flow_set_destroy(server.flows); +                return -1; +        } +          pthread_create(&server.cleaner_pt, NULL, cleaner_thread, NULL);          pthread_create(&server.accept_pt, NULL, accept_thread, NULL);          pthread_create(&server.server_pt, NULL, server_thread, NULL); @@ -185,6 +183,9 @@ int server_main(void)          pthread_cancel(server.server_pt);          pthread_cancel(server.cleaner_pt); +        flow_set_destroy(server.flows); +        fqueue_destroy(server.fq); +          pthread_join(server.server_pt, NULL);          pthread_join(server.cleaner_pt, NULL); | 
