aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-01-16 22:22:07 -0800
committerGarrett D'Amore <garrett@damore.org>2017-01-16 22:22:07 -0800
commit4e46e666e47e277316cc680c833356045932bb5f (patch)
treed6888f69674a93a3c0a82baafc268773c7bb2976 /src
parent50e1484af0d443b46aa04fd4a8096b157dc160aa (diff)
downloadnng-4e46e666e47e277316cc680c833356045932bb5f.tar.gz
nng-4e46e666e47e277316cc680c833356045932bb5f.tar.bz2
nng-4e46e666e47e277316cc680c833356045932bb5f.zip
External event API for send/recv implemented.
This was the main blocker, I think, for the nanomsg legacy compat shim. Now that we have this, it should be relatively straight-forward to implement the legacy nanomsg API, including the SENDFD, RECVFD thing.
Diffstat (limited to 'src')
-rw-r--r--src/core/event.c32
-rw-r--r--src/core/event.h2
-rw-r--r--src/core/socket.c8
-rw-r--r--src/nng.c30
-rw-r--r--src/nng.h32
5 files changed, 85 insertions, 19 deletions
diff --git a/src/core/event.c b/src/core/event.c
index 1b264632..73bc1c00 100644
--- a/src/core/event.c
+++ b/src/core/event.c
@@ -95,7 +95,7 @@ nni_notifier(void *arg)
// No interest.
continue;
}
- notify->n_func(event, &notify->n_arg);
+ notify->n_func(event, notify->n_arg);
}
nni_mtx_unlock(&sock->s_notify_mx);
@@ -112,3 +112,33 @@ nni_notifier(void *arg)
}
nni_mtx_unlock(&sock->s_mx);
}
+
+
+nni_notify *
+nni_add_notify(nni_sock *sock, int mask, nng_notify_func fn, void *arg)
+{
+ nni_notify *notify;
+
+ if ((notify = NNI_ALLOC_STRUCT(notify)) == NULL) {
+ return (NULL);
+ }
+ notify->n_func = fn;
+ notify->n_arg = arg;
+ notify->n_mask = mask;
+ NNI_LIST_NODE_INIT(&notify->n_node);
+
+ nni_mtx_lock(&sock->s_notify_mx);
+ nni_list_append(&sock->s_notify, notify);
+ nni_mtx_unlock(&sock->s_notify_mx);
+ return (notify);
+}
+
+
+void
+nni_rem_notify(nni_sock *sock, nni_notify *notify)
+{
+ nni_mtx_lock(&sock->s_notify_mx);
+ nni_list_remove(&sock->s_notify, notify);
+ nni_mtx_unlock(&sock->s_notify_mx);
+ NNI_FREE_STRUCT(notify);
+}
diff --git a/src/core/event.h b/src/core/event.h
index 8b160a89..74d6fddb 100644
--- a/src/core/event.h
+++ b/src/core/event.h
@@ -37,5 +37,7 @@ extern int nni_ev_init(nni_event *, int, nni_sock *);
extern void nni_ev_fini(nni_event *);
extern void nni_ev_submit(nni_event *); // call holding sock lock
extern void nni_ev_wait(nni_event *); // call holding sock lock
+extern nni_notify *nni_add_notify(nni_sock *, int, nng_notify_func, void *);
+extern void nni_rem_notify(nni_sock *, nni_notify *);
#endif // CORE_EVENT_H
diff --git a/src/core/socket.c b/src/core/socket.c
index 734e4da8..1e9fe11f 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -232,8 +232,12 @@ nni_sock_open(nni_sock **sockp, uint16_t pnum)
goto fail;
}
- if (((rv = nni_ev_init(&sock->s_recv_ev, NNG_EVENT_RECV, sock)) != 0) ||
- ((rv = nni_ev_init(&sock->s_send_ev, NNG_EVENT_SEND, sock)) != 0)) {
+ rv = nni_ev_init(&sock->s_recv_ev, NNG_EV_CAN_RECV, sock);
+ if (rv != 0) {
+ goto fail;
+ }
+ rv = nni_ev_init(&sock->s_send_ev, NNG_EV_CAN_SEND, sock);
+ if (rv != 0) {
goto fail;
}
diff --git a/src/nng.c b/src/nng.c
index ec221fb7..723b230e 100644
--- a/src/nng.c
+++ b/src/nng.c
@@ -144,6 +144,36 @@ nng_getopt(nng_socket *s, int opt, void *val, size_t *szp)
}
+nng_notify *
+nng_setnotify(nng_socket *sock, int mask, nng_notify_func fn, void *arg)
+{
+ NNI_INIT_VOID();
+ return (nni_add_notify(sock, mask, fn, arg));
+}
+
+
+void
+nng_unsetnotify(nng_socket *sock, nng_notify *notify)
+{
+ NNI_INIT_VOID();
+ nni_rem_notify(sock, notify);
+}
+
+
+nng_socket *
+nng_event_socket(nng_event *ev)
+{
+ return (ev->e_sock);
+}
+
+
+int
+nng_event_type(nng_event *ev)
+{
+ return (ev->e_type);
+}
+
+
// Misc.
const char *
nng_strerror(int num)
diff --git a/src/nng.h b/src/nng.h
index 58c2b774..8dcfb4de 100644
--- a/src/nng.h
+++ b/src/nng.h
@@ -99,27 +99,27 @@ NNG_DECL nng_notify *nng_setnotify(nng_socket *, int, nng_notify_func, void *);
// If the callback is running when this called, then it will wait until that
// callback completes. (The caller of this function should not hold any
// locks acqured by the callback, in order to avoid a deadlock.)
-NNG_DECL int nng_unsetnotify(nng_socket *, nng_notify *);
+NNG_DECL void nng_unsetnotify(nng_socket *, nng_notify *);
// Event types. Sockets can have multiple different kind of events.
// Note that these are edge triggered -- therefore the status indicated
// may have changed since the notification occurred.
//
-// NNG_EVENT_RECV - A message is ready for receive.
-// NNG_EVENT_SEND - A message can be sent.
-// NNG_EVENT_ERROR - An error condition on the socket occurred.
-// NNG_EVENT_PIPE_ADD - A new pipe (connection) is added to the socket.
-// NNG_EVENT_PIPE_REM - A pipe (connection) is removed from the socket.
-// NNG_EVENT_ENDPT_ADD - An endpoint is added to the socket.
-// NNG_EVENT_ENDPT_REM - An endpoint is removed from the socket.
-#define NNG_EVENT_BIT(x) (1U << (x))
-#define NNG_EVENT_RECV NNG_EVENT_BIT(0)
-#define NNG_EVENT_SEND NNG_EVENT_BIT(1)
-#define NNG_EVENT_ERROR NNG_EVENT_BIT(2)
-#define NNG_EVENT_PIPE_ADD NNG_EVENT_BIT(3)
-#define NNG_EVENT_PIPE_REM NNG_EVENT_BIT(4)
-#define NNG_EVENT_ENDPOINT_ADD NNG_EVENT_BIT(5)
-#define NNG_EVENT_ENDPOINT_REM NNG_EVENT_BIT(6)
+// NNG_EV_CAN_RECV - A message is ready for receive.
+// NNG_EV_CAN_SEND - A message can be sent.
+// NNG_EV_ERROR - An error condition on the socket occurred.
+// NNG_EV_PIPE_ADD - A new pipe (connection) is added to the socket.
+// NNG_EV_PIPE_REM - A pipe (connection) is removed from the socket.
+// NNG_EV_ENDPT_ADD - An endpoint is added to the socket.
+// NNG_EV_ENDPT_REM - An endpoint is removed from the socket.
+#define NNG_EV_BIT(x) (1U << (x))
+#define NNG_EV_CAN_RECV NNG_EV_BIT(0)
+#define NNG_EV_CAN_SEND NNG_EV_BIT(1)
+#define NNG_EV_ERROR NNG_EV_BIT(2)
+#define NNG_EV_PIPE_ADD NNG_EV_BIT(3)
+#define NNG_EV_PIPE_REM NNG_EV_BIT(4)
+#define NNG_EV_ENDPT_ADD NNG_EV_BIT(5)
+#define NNG_EV_ENDPT_REM NNG_EV_BIT(6)
// The following functions return more detailed information about the event.
// Some of the values will not make sense for some event types, in which case