aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-06-06 09:24:31 -0700
committerGarrett D'Amore <garrett@damore.org>2017-06-06 09:25:37 -0700
commitbf2eb2eed3232cb9f3872d46c5e6bca8855840be (patch)
tree0eeb9e6082d32c997814cd1c9d3fa850176fa4eb /src
parent4771d04fb589c406ff8b2fc1b4edf93b2df42515 (diff)
downloadnng-bf2eb2eed3232cb9f3872d46c5e6bca8855840be.tar.gz
nng-bf2eb2eed3232cb9f3872d46c5e6bca8855840be.tar.bz2
nng-bf2eb2eed3232cb9f3872d46c5e6bca8855840be.zip
Reconn times acquired atomically by socket under lock.
Diffstat (limited to 'src')
-rw-r--r--src/core/endpt.c21
-rw-r--r--src/core/socket.c11
-rw-r--r--src/core/socket.h1
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