More work on AIO subsystem
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
diff --git a/src/utils/aio.c b/src/utils/aio.c
index 3fe2f5a..0db6b28 100644
--- a/src/utils/aio.c
+++ b/src/utils/aio.c
@@ -407,6 +407,7 @@
int rc;
int event;
struct sp_poller_hndl *hndl;
+ int newsock;
/* Wait for new item. */
rc = sp_poller_wait (&self->poller, timeout, &event, &hndl);
@@ -481,6 +482,20 @@
if (event == SP_POLLER_IN) {
if ((*usock)->in.op == SP_USOCK_INOP_ACCEPT) {
+ newsock = accept ((*usock)->parent->s, NULL, NULL);
+ if (newsock == -1) {
+
+ /* Make sure this is a network error,
+ not a programming error. */
+ errno_assert (errno == ECONNABORTED ||
+ errno == EPROTO || errno == ENOBUFS || errno == EMFILE ||
+ errno == ENFILE || errno == ENOMEM);
+
+ /* Do nothing, wait for new connections. */
+ return -ETIMEDOUT;
+ }
+
+ /* TODO: Intialise the usock. */
sp_assert (0);
}
@@ -541,6 +556,10 @@
{
int rc;
+ /* If there's out operation already in progress, fail. */
+ sp_assert (self->out.op == SP_USOCK_OUTOP_NONE);
+ self->out.op = SP_USOCK_OUTOP_CONNECT;
+
rc = connect (self->s, addr, addrlen) ;
/* Move the operation to the worker thread. */
@@ -604,10 +623,14 @@
sp_usock_tune (usock);
return 0;
}
-
+
+ /* If there's an in operaton in progress, fail. */
+ sp_assert (self->out.op == SP_USOCK_OUTOP_NONE);
/* Move the operation to the worker thread. */
if (errno == EAGAIN || errno == EWOULDBLOCK) {
+ usock->parent = self;
+ self->in.op = SP_USOCK_INOP_ACCEPT;
sp_cp_post (self->cp, SP_USOCK_ACCEPT, (void*) self);
return -EINPROGRESS;
}
diff --git a/src/utils/aio.h b/src/utils/aio.h
index 7df3e5d..8cb8078 100644
--- a/src/utils/aio.h
+++ b/src/utils/aio.h
@@ -111,6 +111,7 @@
int protocol;
struct sp_cp *cp;
struct sp_poller_hndl hndl;
+ struct sp_usock *parent;
struct {
int op;
void *buf;
diff --git a/tests/tcp.c b/tests/tcp.c
index e793c3e..a99f0de 100644
--- a/tests/tcp.c
+++ b/tests/tcp.c
@@ -47,10 +47,8 @@
errno_assert (rc >= 0);
sc = sp_socket (AF_SP, SP_PAIR);
errno_assert (sc != -1);
-#if 0
rc = sp_connect (sc, "tcp://127.0.0.1:5555");
errno_assert (rc >= 0);
-#endif
rc = sp_send (sc, "ABC", 3, 0);
errno_assert (rc >= 0);