From a6f7b0f834fe7278fd7125e0d89f1cc570d616ed Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Mon, 26 Dec 2016 13:06:35 +0900 Subject: [PATCH] efreet cache - handle corner case where efreetd keeps disconnecting so an odd one. there is a socket, but nothing is actually listening on it, but clients keep spinning launching efreetd's because the launch, connect, then get a disconnect and try again immediately keeping things spinning heavily, so add a delay of 0.5 sec before launchnig another efreetd if the launch + connect fails and gets a disconnect within 0.5 sec ... so give up for 0.5 sec before trying again to avoid a runaway system. @fix --- src/lib/efreet/efreet_cache.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/lib/efreet/efreet_cache.c b/src/lib/efreet/efreet_cache.c index de4ca7440e..82ceaca802 100644 --- a/src/lib/efreet/efreet_cache.c +++ b/src/lib/efreet/efreet_cache.c @@ -132,11 +132,13 @@ _cb_server_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) return ECORE_CALLBACK_DONE; } +static Ecore_Timer *reconnect_timer = NULL; + static Eina_Bool -_cb_server_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +_cb_server_reconnect(void *data EINA_UNUSED) { - IPC_HEAD(Del); - ipc = NULL; + if (reconnect_timer) ecore_timer_del(reconnect_timer); + reconnect_timer = NULL; _ipc_launch(); if (ipc) { @@ -148,6 +150,25 @@ _cb_server_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) ecore_ipc_server_send(ipc, 1, 0, 0, 0, 0, s, len); efreet_icon_extensions_refresh(); } + return EINA_FALSE; +} + +static Eina_Bool +_cb_server_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + static double last_del = 0.0; + double t; + IPC_HEAD(Del); + ipc = NULL; + t = ecore_time_get(); + if ((t - last_del) < 0.5) + { + if (reconnect_timer) ecore_timer_del(reconnect_timer); + reconnect_timer = ecore_timer_add(0.5, _cb_server_reconnect, NULL); + } + else + _cb_server_reconnect(NULL); + last_del = t; return ECORE_CALLBACK_DONE; }