barbieri pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=c534d7912434d0d0fdc6adf1941f0bddac640dd7
commit c534d7912434d0d0fdc6adf1941f0bddac640dd7 Author: Gustavo Sverzut Barbieri <[email protected]> Date: Fri Nov 25 01:24:38 2016 -0200 efl_net_socket_fd: stop monitoring fd on EOS. There was a bug that if the remote peer closed the connection, it would trigger 'read' event, which would read 0 bytes, flagging as EOS... but then marking as "can_read", which was wrong. Just stop monitoring the events and fix that. --- src/lib/ecore_con/efl_net_socket_fd.c | 15 +++++++++++++++ src/lib/ecore_con/efl_net_socket_fd.eo | 1 + 2 files changed, 16 insertions(+) diff --git a/src/lib/ecore_con/efl_net_socket_fd.c b/src/lib/ecore_con/efl_net_socket_fd.c index 822154c..e2ddcc2 100644 --- a/src/lib/ecore_con/efl_net_socket_fd.c +++ b/src/lib/ecore_con/efl_net_socket_fd.c @@ -238,6 +238,21 @@ _efl_net_socket_fd_efl_io_reader_can_read_set(Eo *o, Efl_Net_Socket_Fd_Data *pd } } +EOLIAN static void +_efl_net_socket_fd_efl_io_reader_eos_set(Eo *o, Efl_Net_Socket_Fd_Data *pd EINA_UNUSED, Eina_Bool value) +{ + Eina_Bool old = efl_io_reader_eos_get(o); + if (old == value) return; + + efl_io_reader_eos_set(efl_super(o, MY_CLASS), value); + + if (!value) return; + + /* stop monitoring the FD, it's closed */ + efl_event_callback_del(o, EFL_LOOP_FD_EVENT_READ, _efl_net_socket_fd_event_read, NULL); + efl_event_callback_del(o, EFL_LOOP_FD_EVENT_WRITE, _efl_net_socket_fd_event_write, NULL); +} + EOLIAN static Eina_Error _efl_net_socket_fd_efl_io_writer_write(Eo *o, Efl_Net_Socket_Fd_Data *pd EINA_UNUSED, Eina_Slice *ro_slice, Eina_Slice *remaining) { diff --git a/src/lib/ecore_con/efl_net_socket_fd.eo b/src/lib/ecore_con/efl_net_socket_fd.eo index b5973f9..8250800 100644 --- a/src/lib/ecore_con/efl_net_socket_fd.eo +++ b/src/lib/ecore_con/efl_net_socket_fd.eo @@ -38,6 +38,7 @@ class Efl.Net.Socket.Fd (Efl.Loop.Fd, Efl.Io.Reader.Fd, Efl.Io.Writer.Fd, Efl.Io Efl.Io.Closer.closed.get; Efl.Io.Reader.read; Efl.Io.Reader.can_read.set; + Efl.Io.Reader.eos.set; Efl.Io.Writer.write; Efl.Io.Writer.can_write.set; Efl.Net.Socket.address_local; --
