barbieri pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=a7657e821f81eab59a719c81d3994194492476a6

commit a7657e821f81eab59a719c81d3994194492476a6
Author: Gustavo Sverzut Barbieri <[email protected]>
Date:   Mon Dec 19 12:57:09 2016 -0200

    ecore_con/ecore_ipc: flush should wait for connection.
    
    Some applications will create the handle, immediately send data, flush
    and delete it, expecting the data to be sent to remote peer.
    
    This is a bad behavior as the application would become unresponsive
    until the connection is established, data can be written (since
    depends on server consuming it), then allow it to be closed.
    
    A proper behavior here would be to chain based on events, with the
    usage of a copier would be simply wait for "done" event.
    
    However the legacy API allowed this and terminology depends on this
    awkward "feature", thus be bug-compatible.
    
    This fixes T5015.
---
 src/lib/ecore_con/ecore_con_legacy.c | 4 ++++
 src/lib/ecore_ipc/ecore_ipc.c        | 3 +++
 2 files changed, 7 insertions(+)

diff --git a/src/lib/ecore_con/ecore_con_legacy.c 
b/src/lib/ecore_con/ecore_con_legacy.c
index e99b4a9..684c25d 100644
--- a/src/lib/ecore_con/ecore_con_legacy.c
+++ b/src/lib/ecore_con/ecore_con_legacy.c
@@ -2262,6 +2262,10 @@ ecore_con_server_flush(Ecore_Con_Server *svr)
 
    if (!svr->dialer) return;
 
+   while (!efl_io_closer_closed_get(svr->dialer) &&
+          !efl_net_dialer_connected_get(svr->dialer))
+     ecore_main_loop_iterate();
+
    efl_io_buffered_stream_flush(svr->dialer, EINA_FALSE, EINA_TRUE);
 
    inner_dialer = efl_io_buffered_stream_inner_io_get(svr->dialer);
diff --git a/src/lib/ecore_ipc/ecore_ipc.c b/src/lib/ecore_ipc/ecore_ipc.c
index 40a1e1e..ec83de7 100644
--- a/src/lib/ecore_ipc/ecore_ipc.c
+++ b/src/lib/ecore_ipc/ecore_ipc.c
@@ -1182,6 +1182,9 @@ ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
      }
    if (svr->dialer.input)
      {
+        while (!efl_io_closer_closed_get(svr->dialer.dialer) &&
+               !efl_net_dialer_connected_get(svr->dialer.dialer))
+          ecore_main_loop_iterate();
         while (efl_io_queue_usage_get(svr->dialer.input) > 0)
           efl_io_copier_flush(svr->dialer.send_copier, EINA_TRUE, EINA_TRUE);
         return;

-- 


Reply via email to