aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/osmo_io.c3
-rw-r--r--src/core/osmo_io_poll.c8
-rw-r--r--tests/osmo_io/osmo_io_test.ok1
3 files changed, 10 insertions, 2 deletions
diff --git a/src/core/osmo_io.c b/src/core/osmo_io.c
index 857644d2..9960fb41 100644
--- a/src/core/osmo_io.c
+++ b/src/core/osmo_io.c
@@ -395,8 +395,7 @@ void osmo_iofd_read_disable(struct osmo_io_fd *iofd)
void osmo_iofd_write_enable(struct osmo_io_fd *iofd)
{
iofd->write_enabled = true;
- if (iofd->tx_queue.current_length > 0)
- osmo_iofd_ops.write_enable(iofd);
+ osmo_iofd_ops.write_enable(iofd);
}
/*! Disable writing to this iofd
diff --git a/src/core/osmo_io_poll.c b/src/core/osmo_io_poll.c
index bc203c0c..dd86f29b 100644
--- a/src/core/osmo_io_poll.c
+++ b/src/core/osmo_io_poll.c
@@ -110,7 +110,15 @@ static void iofd_poll_ofd_cb_recvmsg_sendmsg(struct osmo_fd *ofd, unsigned int w
talloc_free(msghdr);
msgb_free(msg);
+ } else {
+ if (iofd->mode == OSMO_IO_FD_MODE_READ_WRITE)
+ /* Socket is writable, but we have no data to send. A non-blocking/async
+ connect() is signalled this way. */
+ iofd->io_ops.write_cb(iofd, 0, NULL);
+ if (osmo_iofd_txqueue_len(iofd) == 0)
+ iofd_poll_ops.write_disable(iofd);
}
+
}
}
diff --git a/tests/osmo_io/osmo_io_test.ok b/tests/osmo_io/osmo_io_test.ok
index 745e36a8..43e5464f 100644
--- a/tests/osmo_io/osmo_io_test.ok
+++ b/tests/osmo_io/osmo_io_test.ok
@@ -1,5 +1,6 @@
Running test_connected
ep1: write() returned rc=16
+ep2: write() returned rc=0
ep2: read() msg with len=16
01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
Running test_unconnected