aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-07-06 09:35:57 -0700
committerGarrett D'Amore <garrett@damore.org>2018-07-06 09:35:57 -0700
commitea97ec308504650538dda2513c6855ba7a2a49a5 (patch)
tree6bdce9a43730b3e1cfd1b8fa5d13f86783cfd72f
parent43a1c0129ed3ee64cf286ee2b0c194f870f90301 (diff)
downloadnng-ea97ec308504650538dda2513c6855ba7a2a49a5.tar.gz
nng-ea97ec308504650538dda2513c6855ba7a2a49a5.tar.bz2
nng-ea97ec308504650538dda2513c6855ba7a2a49a5.zip
fixes #579 Use ids for pipe listener and dialer
This uses id lookups for pipe listener and dialer during pipe getopt, while still retaining the pointer fields for use during tear down. More changes coming.
-rw-r--r--src/core/pipe.c48
1 files changed, 32 insertions, 16 deletions
diff --git a/src/core/pipe.c b/src/core/pipe.c
index 02f8ea50..6b9b082c 100644
--- a/src/core/pipe.c
+++ b/src/core/pipe.c
@@ -19,6 +19,9 @@
struct nni_pipe {
uint32_t p_id;
+ uint32_t p_sock_id;
+ uint32_t p_dialer_id;
+ uint32_t p_listener_id;
nni_tran_pipe_ops p_tran_ops;
nni_proto_pipe_ops p_proto_ops;
void * p_tran_data;
@@ -312,6 +315,7 @@ nni_pipe_create2(nni_pipe **pp, nni_sock *sock, nni_tran *tran, void *tdata)
p->p_proto_ops = *pops;
p->p_proto_data = NULL;
p->p_sock = sock;
+ p->p_sock_id = nni_sock_id(sock);
p->p_closed = false;
p->p_cbs = false;
p->p_refcnt = 0;
@@ -346,13 +350,15 @@ nni_pipe_create2(nni_pipe **pp, nni_sock *sock, nni_tran *tran, void *tdata)
void
nni_pipe_set_listener(nni_pipe *p, nni_listener *l)
{
- p->p_listener = l;
+ p->p_listener = l;
+ p->p_listener_id = nni_listener_id(l);
}
void
nni_pipe_set_dialer(nni_pipe *p, nni_dialer *d)
{
- p->p_dialer = d;
+ p->p_dialer = d;
+ p->p_dialer_id = nni_dialer_id(d);
}
int
@@ -360,6 +366,8 @@ nni_pipe_getopt(
nni_pipe *p, const char *name, void *val, size_t *szp, nni_opt_type t)
{
nni_tran_option *o;
+ nni_dialer * d;
+ nni_listener * l;
for (o = p->p_tran_ops.p_options; o && o->o_name; o++) {
if (strcmp(o->o_name, name) != 0) {
@@ -367,12 +375,25 @@ nni_pipe_getopt(
}
return (o->o_get(p->p_tran_data, val, szp, t));
}
- // Maybe the endpoint knows?
- if (p->p_dialer != NULL) {
- return (nni_dialer_getopt(p->p_dialer, name, val, szp, t));
+
+ // Maybe the endpoint knows? We look up by ID, instead of using
+ // the links directly, to avoid needing a hold on them. The pipe
+ // can wind up outliving the endpoint in certain circumstances.
+ // This means that getting these properties from the pipe may wind
+ // up being somewhat more expensive.
+ if ((p->p_dialer_id != 0) &&
+ (nni_dialer_find(&d, p->p_dialer_id) == 0)) {
+ int rv;
+ rv = nni_dialer_getopt(d, name, val, szp, t);
+ nni_dialer_rele(d);
+ return (rv);
}
- if (p->p_listener != NULL) {
- return (nni_listener_getopt(p->p_listener, name, val, szp, t));
+ if ((p->p_listener_id != 0) &&
+ (nni_listener_find(&l, p->p_listener_id) == 0)) {
+ int rv;
+ rv = nni_listener_getopt(l, name, val, szp, t);
+ nni_listener_rele(l);
+ return (rv);
}
return (NNG_ENOTSUP);
}
@@ -408,24 +429,19 @@ nni_pipe_ep_list_init(nni_list *list)
uint32_t
nni_pipe_sock_id(nni_pipe *p)
{
- return (nni_sock_id(p->p_sock));
+ return (p->p_sock_id);
}
uint32_t
nni_pipe_listener_id(nni_pipe *p)
{
- if (p->p_listener != NULL) {
- return (nni_listener_id(p->p_listener));
- }
- return (0);
+ return (p->p_listener_id);
}
+
uint32_t
nni_pipe_dialer_id(nni_pipe *p)
{
- if (p->p_dialer != NULL) {
- return (nni_dialer_id(p->p_dialer));
- }
- return (0);
+ return (p->p_dialer_id);
}
static void