diff options
-rw-r--r-- | src/core/osmo_io.c | 3 | ||||
-rw-r--r-- | src/core/osmo_io_poll.c | 8 | ||||
-rw-r--r-- | tests/osmo_io/osmo_io_test.ok | 1 |
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 |