aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_tcpconn.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-12-19 23:50:13 -0800
committerGarrett D'Amore <garrett@damore.org>2024-12-20 08:12:42 -0800
commit20e625137a38232c87871661c684953ef2cfc5f8 (patch)
treeaf75f9c134ea89160a1ccbe80d17b0f3582c8239 /src/platform/posix/posix_tcpconn.c
parent60f63557d87528497fe1392fa6a676b2a51efb16 (diff)
downloadnng-20e625137a38232c87871661c684953ef2cfc5f8.tar.gz
nng-20e625137a38232c87871661c684953ef2cfc5f8.tar.bz2
nng-20e625137a38232c87871661c684953ef2cfc5f8.zip
posix pollers: inline the pfd and make callbacks constant
This change moves the posix pollers to inline the PFD and makes the callbacks constant, so that we can dispense with tests, failures, and locks. It is anticipated that this will reduce lock based pressure on the bus and increase performance modestly.
Diffstat (limited to 'src/platform/posix/posix_tcpconn.c')
-rw-r--r--src/platform/posix/posix_tcpconn.c64
1 files changed, 25 insertions, 39 deletions
diff --git a/src/platform/posix/posix_tcpconn.c b/src/platform/posix/posix_tcpconn.c
index d49fc838..b1a2233c 100644
--- a/src/platform/posix/posix_tcpconn.c
+++ b/src/platform/posix/posix_tcpconn.c
@@ -32,9 +32,9 @@ static void
tcp_dowrite(nni_tcp_conn *c)
{
nni_aio *aio;
- int fd;
+ int fd = nni_posix_pfd_fd(&c->pfd);
- if (c->closed || ((fd = nni_posix_pfd_fd(c->pfd)) < 0)) {
+ if (c->closed) {
return;
}
@@ -101,9 +101,9 @@ static void
tcp_doread(nni_tcp_conn *c)
{
nni_aio *aio;
- int fd;
+ int fd = nni_posix_pfd_fd(&c->pfd);
- if (c->closed || ((fd = nni_posix_pfd_fd(c->pfd)) < 0)) {
+ if (c->closed) {
return;
}
@@ -174,9 +174,7 @@ tcp_error(void *arg, int err)
nni_aio_list_remove(aio);
nni_aio_finish_error(aio, err);
}
- if (c->pfd != NULL) {
- nni_posix_pfd_close(c->pfd);
- }
+ nni_posix_pfd_close(&c->pfd);
nni_mtx_unlock(&c->mtx);
}
@@ -193,9 +191,7 @@ tcp_close(void *arg)
nni_aio_list_remove(aio);
nni_aio_finish_error(aio, NNG_ECLOSED);
}
- if (c->pfd != NULL) {
- nni_posix_pfd_close(c->pfd);
- }
+ nni_posix_pfd_close(&c->pfd);
}
nni_mtx_unlock(&c->mtx);
}
@@ -203,18 +199,10 @@ tcp_close(void *arg)
static void
tcp_stop(void *arg)
{
- nni_tcp_conn *c = arg;
- nni_posix_pfd *pfd;
+ nni_tcp_conn *c = arg;
tcp_close(c);
- nni_mtx_lock(&c->mtx);
- pfd = c->pfd;
- c->pfd = NULL;
- nni_mtx_unlock(&c->mtx);
-
- if (pfd != NULL) {
- nni_posix_pfd_fini(pfd);
- }
+ nni_posix_pfd_stop(&c->pfd);
}
// tcp_fini may block briefly waiting for the pollq thread.
@@ -224,6 +212,7 @@ tcp_fini(void *arg)
{
nni_tcp_conn *c = arg;
tcp_stop(c);
+ nni_posix_pfd_fini(&c->pfd);
nni_mtx_fini(&c->mtx);
if (c->dialer != NULL) {
@@ -245,7 +234,7 @@ tcp_free(void *arg)
}
static void
-tcp_cb(nni_posix_pfd *pfd, unsigned events, void *arg)
+tcp_cb(void *arg, unsigned events)
{
nni_tcp_conn *c = arg;
@@ -253,6 +242,10 @@ tcp_cb(nni_posix_pfd *pfd, unsigned events, void *arg)
tcp_error(c, NNG_ECONNSHUT);
return;
}
+ if (c->dial_aio != NULL) {
+ nni_posix_tcp_dial_cb(c, events);
+ return;
+ }
nni_mtx_lock(&c->mtx);
if ((events & NNI_POLL_IN) != 0) {
tcp_doread(c);
@@ -268,7 +261,7 @@ tcp_cb(nni_posix_pfd *pfd, unsigned events, void *arg)
events |= NNI_POLL_IN;
}
if ((!c->closed) && (events != 0)) {
- nni_posix_pfd_arm(pfd, events);
+ nni_posix_pfd_arm(&c->pfd, events);
}
nni_mtx_unlock(&c->mtx);
}
@@ -310,7 +303,7 @@ tcp_send(void *arg, nni_aio *aio)
// means we didn't finish the job, so arm the poller to
// complete us.
if (nni_list_first(&c->writeq) == aio) {
- nni_posix_pfd_arm(c->pfd, NNI_POLL_OUT);
+ nni_posix_pfd_arm(&c->pfd, NNI_POLL_OUT);
}
}
nni_mtx_unlock(&c->mtx);
@@ -344,7 +337,7 @@ tcp_recv(void *arg, nni_aio *aio)
// means we didn't finish the job, so arm the poller to
// complete us.
if (nni_list_first(&c->readq) == aio) {
- nni_posix_pfd_arm(c->pfd, NNI_POLL_IN);
+ nni_posix_pfd_arm(&c->pfd, NNI_POLL_IN);
}
}
nni_mtx_unlock(&c->mtx);
@@ -356,7 +349,7 @@ tcp_get_peername(void *arg, void *buf, size_t *szp, nni_type t)
nni_tcp_conn *c = arg;
struct sockaddr_storage ss;
socklen_t len = sizeof(ss);
- int fd = nni_posix_pfd_fd(c->pfd);
+ int fd = nni_posix_pfd_fd(&c->pfd);
int rv;
nng_sockaddr sa;
@@ -375,7 +368,7 @@ tcp_get_sockname(void *arg, void *buf, size_t *szp, nni_type t)
nni_tcp_conn *c = arg;
struct sockaddr_storage ss;
socklen_t len = sizeof(ss);
- int fd = nni_posix_pfd_fd(c->pfd);
+ int fd = nni_posix_pfd_fd(&c->pfd);
int rv;
nng_sockaddr sa;
@@ -392,7 +385,7 @@ static int
tcp_get_nodelay(void *arg, void *buf, size_t *szp, nni_type t)
{
nni_tcp_conn *c = arg;
- int fd = nni_posix_pfd_fd(c->pfd);
+ int fd = nni_posix_pfd_fd(&c->pfd);
int val = 0;
socklen_t valsz = sizeof(val);
@@ -407,7 +400,7 @@ static int
tcp_get_keepalive(void *arg, void *buf, size_t *szp, nni_type t)
{
nni_tcp_conn *c = arg;
- int fd = nni_posix_pfd_fd(c->pfd);
+ int fd = nni_posix_pfd_fd(&c->pfd);
int val = 0;
socklen_t valsz = sizeof(val);
@@ -455,7 +448,7 @@ tcp_set(void *arg, const char *name, const void *buf, size_t sz, nni_type t)
}
int
-nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d)
+nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d, int fd)
{
nni_tcp_conn *c;
if ((c = NNI_ALLOC_STRUCT(c)) == NULL) {
@@ -468,6 +461,7 @@ nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d)
nni_mtx_init(&c->mtx);
nni_aio_list_init(&c->readq);
nni_aio_list_init(&c->writeq);
+ nni_posix_pfd_init(&c->pfd, fd, tcp_cb, c);
c->stream.s_free = tcp_free;
c->stream.s_stop = tcp_stop;
@@ -482,19 +476,11 @@ nni_posix_tcp_alloc(nni_tcp_conn **cp, nni_tcp_dialer *d)
}
void
-nni_posix_tcp_init(nni_tcp_conn *c, nni_posix_pfd *pfd)
-{
- c->pfd = pfd;
-}
-
-void
nni_posix_tcp_start(nni_tcp_conn *c, int nodelay, int keepalive)
{
// Configure the initial socket options.
- (void) setsockopt(nni_posix_pfd_fd(c->pfd), IPPROTO_TCP, TCP_NODELAY,
+ (void) setsockopt(nni_posix_pfd_fd(&c->pfd), IPPROTO_TCP, TCP_NODELAY,
&nodelay, sizeof(int));
- (void) setsockopt(nni_posix_pfd_fd(c->pfd), SOL_SOCKET, SO_KEEPALIVE,
+ (void) setsockopt(nni_posix_pfd_fd(&c->pfd), SOL_SOCKET, SO_KEEPALIVE,
&keepalive, sizeof(int));
-
- nni_posix_pfd_set_cb(c->pfd, tcp_cb, c);
}