diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/endpt.c | 21 | ||||
| -rw-r--r-- | src/core/socket.c | 11 | ||||
| -rw-r--r-- | src/core/socket.h | 1 |
3 files changed, 19 insertions, 14 deletions
diff --git a/src/core/endpt.c b/src/core/endpt.c index de166aff..d598caa2 100644 --- a/src/core/endpt.c +++ b/src/core/endpt.c @@ -238,25 +238,18 @@ nni_dialer(void *arg) nni_ep *ep = arg; int rv; nni_time cooldown; - nni_duration maxrtime; - nni_duration defrtime; + nni_duration maxrtime, nmaxrtime; + nni_duration defrtime, ndefrtime; nni_duration rtime; - // XXX: these need to be obtained from the socket using a lock. - defrtime = ep->ep_sock->s_reconn; - if ((maxrtime = ep->ep_sock->s_reconnmax) == 0) { - maxrtime = defrtime; - } + nni_sock_reconntimes(ep->ep_sock, &defrtime, &maxrtime); for (;;) { - // XXX: socket lock please... - if ((defrtime != ep->ep_sock->s_reconn) || - (maxrtime != ep->ep_sock->s_reconnmax)) { + nni_sock_reconntimes(ep->ep_sock, &ndefrtime, &nmaxrtime); + if ((defrtime != ndefrtime) || (maxrtime != nmaxrtime)) { // Times changed, so reset them. - defrtime = ep->ep_sock->s_reconn; - if ((maxrtime = ep->ep_sock->s_reconnmax) == 0) { - maxrtime = defrtime; - } + defrtime = ndefrtime; + maxrtime = nmaxrtime; rtime = defrtime; } diff --git a/src/core/socket.c b/src/core/socket.c index d091d126..ae399d73 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -792,6 +792,17 @@ nni_sock_rcvmaxsz(nni_sock *sock) } +void +nni_sock_reconntimes(nni_sock *sock, nni_duration *rcur, nni_duration *rmax) +{ + // These two values are linked, so get them atomically. + nni_mtx_lock(&sock->s_mx); + *rcur = sock->s_reconn; + *rmax = sock->s_reconnmax ? sock->s_reconnmax : sock->s_reconn; + nni_mtx_unlock(&sock->s_mx); +} + + int nni_sock_dial(nni_sock *sock, const char *addr, nni_ep **epp, int flags) { diff --git a/src/core/socket.h b/src/core/socket.h index 247513a0..2eefd07e 100644 --- a/src/core/socket.h +++ b/src/core/socket.h @@ -138,5 +138,6 @@ extern nni_mtx *nni_sock_mtx(nni_sock *); extern nni_duration nni_sock_linger(nni_sock *); extern size_t nni_sock_rcvmaxsz(nni_sock *); +extern void nni_sock_reconntimes(nni_sock *, nni_duration *, nni_duration *); #endif // CORE_SOCKET_H |
