diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2020-02-22 13:24:30 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2020-02-22 13:24:30 +0200 |
commit | 69bc53b8aa9ce26329603ac25f7cfb5d028845dc (patch) | |
tree | 6fa96599846b4259780b28e20e839204015a0237 /src | |
parent | c15bf2380377abf2e8abb91892eb172d5062d75c (diff) | |
download | ping903-69bc53b8aa9ce26329603ac25f7cfb5d028845dc.tar.gz ping903-69bc53b8aa9ce26329603ac25f7cfb5d028845dc.tar.bz2 |
Protect each hostaddr with a mutex
Diffstat (limited to 'src')
-rw-r--r-- | src/config.c | 1 | ||||
-rw-r--r-- | src/ping903.h | 3 | ||||
-rw-r--r-- | src/pinger.c | 23 |
3 files changed, 24 insertions, 3 deletions
diff --git a/src/config.c b/src/config.c index d382c95..838984d 100644 --- a/src/config.c +++ b/src/config.c @@ -119,6 +119,7 @@ cf_ip_list(int mode, union cf_callback_arg *arg, void *data) hostaddr[hostaddr_count].addr = emalloc(res->ai_addrlen); memcpy(hostaddr[hostaddr_count].addr, res->ai_addr, res->ai_addrlen); hostaddr[hostaddr_count].addrlen = res->ai_addrlen; + pthread_mutex_init(&hostaddr[hostaddr_count].mutex, NULL); hostaddr_count++; freeaddrinfo(res); } diff --git a/src/ping903.h b/src/ping903.h index 52ed6c1..57fc22a 100644 --- a/src/ping903.h +++ b/src/ping903.h @@ -90,8 +90,7 @@ typedef struct hostaddr { struct sockaddr *addr; socklen_t addrlen; - /* Send queue */ - struct hostaddr *next; + pthread_mutex_t mutex; /* Current ping statistics */ struct timeval start_tv; diff --git a/src/pinger.c b/src/pinger.c index cbc80d2..1e91180 100644 --- a/src/pinger.c +++ b/src/pinger.c @@ -95,6 +95,18 @@ seqno_alloc(HOSTADDR *addr, struct timeval *tv) return -1; } +static inline void +hostaddr_lock(HOSTADDR *host) +{ + pthread_mutex_lock(&host->mutex); +} + +static inline void +hostaddr_unlock(HOSTADDR *host) +{ + pthread_mutex_unlock(&host->mutex); +} + static HOSTADDR * hostaddr_from_seqno(int seq) { @@ -102,6 +114,7 @@ hostaddr_from_seqno(int seq) if (seqidx[seq].replied) info("%s:%d: DUP!", host->name, seq); seqidx[seq].replied++; + hostaddr_lock(host); return host; } @@ -220,8 +233,11 @@ send_echo(HOSTADDR *host, unsigned char *ping_buffer) size_t buflen; ssize_t n; int seqno; - + + hostaddr_lock(host); gettimeofday(&host->xmit_tv, NULL); + hostaddr_unlock(host); + memcpy(icmp->icmp_data, &host->xmit_tv, sizeof(host->xmit_tv)); if (data_buffer) memcpy(icmp->icmp_data + sizeof(host->xmit_tv), data_buffer, @@ -245,9 +261,11 @@ send_echo(HOSTADDR *host, unsigned char *ping_buffer) if (n < 0) { error("%s: sendto: %s", host->name, strerror(errno)); } else { + hostaddr_lock(host); if (host->xmit_count == 0) host->start_tv = host->xmit_tv; host->xmit_count++; + hostaddr_unlock(host); xmit_total++; if (n != buflen) error("ping: wrote %s %d chars, ret=%d\n", @@ -412,6 +430,7 @@ host_stat_commit(HOSTADDR *host) static void host_reset(HOSTADDR *host) { + hostaddr_lock(host); if (host->xmit_count > 0) host_stat_commit(host); host->xmit_count = 0; @@ -432,6 +451,7 @@ host_reset(HOSTADDR *host) case HOST_STAT_INVALID: break; } + hostaddr_unlock(host); } static inline double @@ -767,6 +787,7 @@ p903_receiver(void *p) icmp, ip, n, rtt); if (host->recv_count == ping_count) host_stat_commit(host); + hostaddr_unlock(host); } else fatal("no host found for sequence number %d", icmp->icmp_seq); |