okra pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=53707933992eee68e17a6101739aff2249390fd8

commit 53707933992eee68e17a6101739aff2249390fd8
Author: Stephen 'Okra' Houston <[email protected]>
Date:   Sat Jul 15 21:31:06 2017 -0500

    Sysinfo Gadget: More thread vs object lifetime work: Make threads no longer 
dependent on the main loop objects and vice versa.
---
 src/modules/sysinfo/batman/batman.c                |  15 --
 src/modules/sysinfo/batman/batman_config.c         |   2 +-
 src/modules/sysinfo/batman/batman_fallback.c       |  36 ++---
 src/modules/sysinfo/batman/batman_sysctl.c         |  14 +-
 src/modules/sysinfo/batman/batman_udev.c           |   8 +-
 src/modules/sysinfo/batman/batman_upower.c         |   8 +-
 src/modules/sysinfo/cpuclock/cpuclock.c            | 131 +++++----------
 src/modules/sysinfo/cpuclock/cpuclock_config.c     |   2 +-
 src/modules/sysinfo/cpumonitor/cpumonitor.c        | 131 ++++-----------
 src/modules/sysinfo/cpumonitor/cpumonitor.h        |   4 +-
 src/modules/sysinfo/cpumonitor/cpumonitor_proc.c   |  21 +--
 src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c |  54 +++----
 src/modules/sysinfo/memusage/memusage.c            |  81 ++--------
 src/modules/sysinfo/memusage/memusage_sysctl.c     |   4 +-
 src/modules/sysinfo/mod.c                          |  28 +---
 src/modules/sysinfo/netstatus/netstatus.c          | 175 ++++++++++-----------
 src/modules/sysinfo/netstatus/netstatus.h          |   8 +-
 src/modules/sysinfo/netstatus/netstatus_config.c   |   2 +-
 src/modules/sysinfo/netstatus/netstatus_proc.c     |  96 +++++------
 src/modules/sysinfo/netstatus/netstatus_sysctl.c   |  90 ++++-------
 src/modules/sysinfo/sysinfo.c                      |  35 +----
 src/modules/sysinfo/sysinfo.h                      |  27 +---
 src/modules/sysinfo/thermal/thermal.c              |  60 +------
 src/modules/sysinfo/thermal/thermal_config.c       |   2 +-
 src/modules/sysinfo/thermal/thermal_fallback.c     |   8 +-
 25 files changed, 346 insertions(+), 696 deletions(-)

diff --git a/src/modules/sysinfo/batman/batman.c 
b/src/modules/sysinfo/batman/batman.c
index 1af63702d..79e06fa83 100644
--- a/src/modules/sysinfo/batman/batman.c
+++ b/src/modules/sysinfo/batman/batman.c
@@ -617,19 +617,6 @@ sysinfo_batman_remove(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNU
    (void) inst;
    _batman_fallback_stop();
 #endif
-   inst->cfg->batman.done = EINA_TRUE;
-   if (inst->cfg->esm == E_SYSINFO_MODULE_SYSINFO)
-     {
-        if (inst->cfg->memusage.done && inst->cfg->thermal.done &&
-            inst->cfg->netstatus.done && inst->cfg->cpuclock.done && 
inst->cfg->cpumonitor.done)
-          {
-              sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
inst->cfg);
-              if (inst->cfg->id >= 0)
-                sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
-              E_FREE(inst->cfg);
-              E_FREE(inst);
-          }
-     }
 }
 
 static void
@@ -678,7 +665,6 @@ sysinfo_batman_create(Evas_Object *parent, Instance *inst)
    inst->cfg->batman.time_left = -2;
    inst->cfg->batman.have_battery = -2;
    inst->cfg->batman.have_power = -2;
-   inst->cfg->batman.done = EINA_FALSE;
 
    inst->cfg->batman.o_gadget = elm_layout_add(parent);
    e_theme_edje_object_set(inst->cfg->batman.o_gadget, 
"base/theme/gadget/batman",
@@ -750,7 +736,6 @@ batman_create(Evas_Object *parent, int *id, 
E_Gadget_Site_Orient orient EINA_UNU
    inst = E_NEW(Instance, 1);
    inst->cfg = _conf_item_get(id);
    *id = inst->cfg->id;
-   inst->cfg->batman.done = EINA_FALSE;
    inst->o_main = elm_box_add(parent);
    E_EXPAND(inst->o_main);
    evas_object_data_set(inst->o_main, "Instance", inst);
diff --git a/src/modules/sysinfo/batman/batman_config.c 
b/src/modules/sysinfo/batman/batman_config.c
index 5622c0af4..e08c346ad 100644
--- a/src/modules/sysinfo/batman/batman_config.c
+++ b/src/modules/sysinfo/batman/batman_config.c
@@ -7,7 +7,7 @@ _config_close(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, voi
    Instance *inst = bc->inst;
 
    E_FREE_FUNC(inst->cfg->batman.configure, evas_object_del);
-   E_FREE_FUNC(bc, free);
+   E_FREE(bc);
    e_config_save_queue();
 }
 
diff --git a/src/modules/sysinfo/batman/batman_fallback.c 
b/src/modules/sysinfo/batman/batman_fallback.c
index a04980a3c..0b840e9c0 100644
--- a/src/modules/sysinfo/batman/batman_fallback.c
+++ b/src/modules/sysinfo/batman/batman_fallback.c
@@ -277,8 +277,8 @@ linux_sys_class_power_supply_cb_re_init(void *data)
 //           if (sysev->fd_handler)
 //             ecore_main_fd_handler_del(sysev->fd_handler);
 //           if (sysev->fd >= 0) close(sysev->fd);
-             free(sysev->name);
-             free(sysev);
+             E_FREE(sysev->name);
+             E_FREE(sysev);
           }
      }
    linux_sys_class_power_supply_init();
@@ -319,8 +319,8 @@ linux_sys_class_power_supply_cb_event_fd_active(void *data,
 //           if (sysev->fd_handler)
 //             ecore_main_fd_handler_del(sysev->fd_handler);
 //           if (sysev->fd >= 0) close(sysev->fd);
-             free(sysev->name);
-             free(sysev);
+             E_FREE(sysev->name);
+             E_FREE(sysev);
 
              if (re_init_timer) ecore_timer_del(re_init_timer);
              re_init_timer = ecore_timer_loop_add(1.0, 
linux_sys_class_power_supply_cb_re_init, NULL);
@@ -476,7 +476,7 @@ linux_sys_class_power_supply_init(void)
 
                   if (!(linux_sys_class_power_supply_is_battery(name)))
                     {
-                       free(name);
+                       E_FREE(name);
                        continue;
                     }
                   sysev = (Sys_Class_Power_Supply_Uevent *)calloc(1, 
sizeof(Sys_Class_Power_Supply_Uevent));
@@ -573,7 +573,7 @@ linux_sys_class_power_supply_check(void)
                        full = 1;
                        charging = 0;
                     }
-                  free(tmp);
+                  E_FREE(tmp);
                }
              /* some batteries can/will/want to predict how long they will
               * last. if so - take what the battery says. too bad if it's
@@ -825,7 +825,7 @@ linux_acpi_init(void)
                        if (tmp)
                          {
                             if (!strcmp(tmp, "on-line")) have_power = 1;
-                            free(tmp);
+                            E_FREE(tmp);
                          }
                        fclose(f);
                     }
@@ -853,7 +853,7 @@ linux_acpi_init(void)
                   if (tmp)
                     {
                        if (!strcmp(tmp, "yes")) have_battery = 1;
-                       free(tmp);
+                       E_FREE(tmp);
                     }
                   /* design cap */
                   tmp = fgets(buf, sizeof(buf), f);
@@ -861,7 +861,7 @@ linux_acpi_init(void)
                   if (tmp)
                     {
                        if (strcmp(tmp, "unknown")) acpi_max_design += 
atoi(tmp);
-                       free(tmp);
+                       E_FREE(tmp);
                     }
                   /* last full cap */
                   tmp = fgets(buf, sizeof(buf), f);
@@ -869,7 +869,7 @@ linux_acpi_init(void)
                   if (tmp)
                     {
                        if (strcmp(tmp, "unknown")) acpi_max_full += atoi(tmp);
-                       free(tmp);
+                       E_FREE(tmp);
                     }
                   fclose(f);
                }
@@ -930,34 +930,34 @@ linux_acpi_check(void)
              FILE *f;
 
              snprintf(buf, sizeof(buf), "/proc/acpi/battery/%s/state", name);
-             free(name);
+             E_FREE(name);
              f = fopen(buf, "r");
              if (!f) continue;
 
              tmp = file_str_entry_get(f, "present:");
              if (!tmp) goto fclose_and_continue;
              if (!strcasecmp(tmp, "yes")) have_battery = 1;
-             free(tmp);
+             E_FREE(tmp);
 
              tmp = file_str_entry_get(f, "capacity state:");
              if (!tmp) goto fclose_and_continue;
-             free(tmp);
+             E_FREE(tmp);
 
              tmp = file_str_entry_get(f, "charging state:");
              if (!tmp) goto fclose_and_continue;
              if ((have_power == 0) && (!strcasecmp(tmp, "charging")))
                have_power = 1;
-             free(tmp);
+             E_FREE(tmp);
 
              tmp = file_str_entry_get(f, "present rate:");
              if (!tmp) goto fclose_and_continue;
              if (strcasecmp(tmp, "unknown")) rate += atoi(tmp);
-             free(tmp);
+             E_FREE(tmp);
 
              tmp = file_str_entry_get(f, "remaining capacity:");
              if (!tmp) goto fclose_and_continue;
              if (strcasecmp(tmp, "unknown")) capacity += atoi(tmp);
-             free(tmp);
+             E_FREE(tmp);
 
 fclose_and_continue:
              fclose(f);
@@ -1182,7 +1182,7 @@ fclose_and_continue:
                     }
                }
 
-             free(name);
+             E_FREE(name);
           }
         if (max_charge > 0) battery_full = ((long long)charge * 100) / 
max_charge;
         else battery_full = 0;
@@ -1251,7 +1251,7 @@ dir_has_contents(const char *dir)
 
    count = eina_list_count(bats);
    EINA_LIST_FREE(bats, file)
-     free(file);
+     E_FREE(file);
    if (count > 0) return 1;
    return 0;
 }
diff --git a/src/modules/sysinfo/batman/batman_sysctl.c 
b/src/modules/sysinfo/batman/batman_sysctl.c
index 82f5b343f..cc8b90e85 100644
--- a/src/modules/sysinfo/batman/batman_sysctl.c
+++ b/src/modules/sysinfo/batman/batman_sysctl.c
@@ -144,8 +144,8 @@ _batman_sysctl_stop(void)
    EINA_LIST_FREE(batman_device_ac_adapters, ac) 
      {
         E_FREE_FUNC(ac->udi, eina_stringshare_del);
-        E_FREE_FUNC(ac->mib, free);
-        E_FREE_FUNC(ac, free);
+        E_FREE(ac->mib);
+        E_FREE(ac);
      }
    
    EINA_LIST_FREE(batman_device_batteries, bat)
@@ -156,12 +156,12 @@ _batman_sysctl_stop(void)
         E_FREE_FUNC(bat->vendor, eina_stringshare_del);
         E_FREE_FUNC(bat->poll, ecore_poller_del);
 #if defined(__FreeBSD__) || defined(__DragonFly__)
-        E_FREE_FUNC(bat->mib_state, free);
-        E_FREE_FUNC(bat->mib_time, free);
-        E_FREE_FUNC(bat->mib_units, free);
+        E_FREE(bat->mib_state);
+        E_FREE(bat->mib_time);
+        E_FREE(bat->mib_units);
 #endif
-        E_FREE_FUNC(bat->mib, free);
-        E_FREE_FUNC(bat, free);
+        E_FREE(bat->mib);
+        E_FREE(bat);
      }
 }
 
diff --git a/src/modules/sysinfo/batman/batman_udev.c 
b/src/modules/sysinfo/batman/batman_udev.c
index 6699d0e5f..18314f328 100644
--- a/src/modules/sysinfo/batman/batman_udev.c
+++ b/src/modules/sysinfo/batman/batman_udev.c
@@ -50,7 +50,7 @@ _batman_udev_stop(Instance *inst)
 
    EINA_LIST_FREE(batman_device_ac_adapters, ac)
      {
-        E_FREE_FUNC(ac, free);
+        E_FREE(ac);
      }
    EINA_LIST_FREE(batman_device_batteries, bat)
      {
@@ -59,7 +59,7 @@ _batman_udev_stop(Instance *inst)
        eina_stringshare_del(bat->model);
        eina_stringshare_del(bat->vendor);
         E_FREE_FUNC(bat->poll, ecore_poller_del);
-        E_FREE_FUNC(bat, free);
+        E_FREE(bat);
      }
 }
 
@@ -190,7 +190,7 @@ _batman_udev_battery_del(const char *syspath, Instance 
*inst)
              eina_stringshare_del(bat->model);
              eina_stringshare_del(bat->vendor);
              E_FREE_FUNC(bat->poll, ecore_poller_del);
-             E_FREE_FUNC(bat, free);
+             E_FREE(bat);
           }
      }
    eina_stringshare_del(syspath);
@@ -214,7 +214,7 @@ _batman_udev_ac_del(const char *syspath, Instance *inst)
           {
              batman_device_ac_adapters = 
eina_list_remove_list(batman_device_ac_adapters, l);
              eina_stringshare_del(ac->udi);
-             E_FREE_FUNC(ac, free);
+             E_FREE(ac);
           }
      }
    eina_stringshare_del(syspath);
diff --git a/src/modules/sysinfo/batman/batman_upower.c 
b/src/modules/sysinfo/batman/batman_upower.c
index c86b335e7..b59360f30 100644
--- a/src/modules/sysinfo/batman/batman_upower.c
+++ b/src/modules/sysinfo/batman/batman_upower.c
@@ -31,7 +31,7 @@ _battery_free(Battery *bat)
      eina_stringshare_del(bat->model);
    if (bat->vendor)
      eina_stringshare_del(bat->vendor);
-   free(bat);
+   E_FREE(bat);
 }
 
 static void
@@ -43,7 +43,7 @@ _ac_free(Ac_Adapter *ac)
 
    batman_device_ac_adapters = eina_list_remove(batman_device_ac_adapters, ac);
    eina_stringshare_del(ac->udi);
-   free(ac);
+   E_FREE(ac);
 }
 
 static void
@@ -244,7 +244,7 @@ _device_type_cb(void *data, const Eldbus_Message *msg, 
Eldbus_Pending *pending E
    else
      goto error;
 
-   free(ud);
+   E_FREE(ud);
 
    return;
 
@@ -252,7 +252,7 @@ error:
    obj = eldbus_proxy_object_get(ud->proxy);
    eldbus_proxy_unref(ud->proxy);
    eldbus_object_unref(obj);
-   free(ud);
+   E_FREE(ud);
    return;
 }
 
diff --git a/src/modules/sysinfo/cpuclock/cpuclock.c 
b/src/modules/sysinfo/cpuclock/cpuclock.c
index 35dc7892c..013712ec2 100644
--- a/src/modules/sysinfo/cpuclock/cpuclock.c
+++ b/src/modules/sysinfo/cpuclock/cpuclock.c
@@ -44,16 +44,16 @@ _cpuclock_status_free(Cpu_Status *s)
 {
    Eina_List *l;
 
-   if (s->frequencies) eina_list_free(s->frequencies);
+   if (eina_list_count(s->frequencies)) eina_list_free(s->frequencies);
    if (s->governors)
      {
         for (l = s->governors; l; l = l->next)
-          E_FREE_FUNC(l->data, free);
+          E_FREE(l->data);
         eina_list_free(s->governors);
      }
-   E_FREE_FUNC(s->cur_governor, free);
+   E_FREE(s->cur_governor);
    if (s->orig_governor) eina_stringshare_del(s->orig_governor);
-   E_FREE_FUNC(s, free);
+   E_FREE(s);
 }
 
 static int
@@ -370,7 +370,7 @@ _cpuclock_config_updated(Instance *inst)
         for (l = inst->cfg->cpuclock.status->frequencies, i = 0; l; l = 
l->next, i++)
           frequency_msg->val[i] = (long)l->data;
         
edje_object_message_send(elm_layout_edje_get(inst->cfg->cpuclock.o_gadget), 
EDJE_MESSAGE_INT_SET, 1, frequency_msg);
-        free(frequency_msg);
+        E_FREE(frequency_msg);
      }
 
    if (inst->cfg->cpuclock.status->governors)
@@ -381,7 +381,7 @@ _cpuclock_config_updated(Instance *inst)
         for (l = inst->cfg->cpuclock.status->governors, i = 0; l; l = l->next, 
i++)
           governor_msg->str[i] = (char *)l->data;
         
edje_object_message_send(elm_layout_edje_get(inst->cfg->cpuclock.o_gadget), 
EDJE_MESSAGE_STRING_SET, 2, governor_msg);
-        free(governor_msg);
+        E_FREE(governor_msg);
      }
    _cpuclock_poll_interval_update(inst);
 }
@@ -402,7 +402,7 @@ _cpuclock_face_update_current(Instance *inst)
    frequency_msg->val[4] = 0; // pad
    edje_object_message_send(elm_layout_edje_get(inst->cfg->cpuclock.o_gadget), 
EDJE_MESSAGE_INT_SET, 3,
                             frequency_msg);
-   free(frequency_msg);
+   E_FREE(frequency_msg);
 
    /* BSD crashes here without the if-condition
     * since it has no governors (yet) */
@@ -499,7 +499,7 @@ _cpuclock_status_check_available(Cpu_Status *s)
    if (s->governors)
      {
         for (l = s->governors; l; l = l->next)
-          free(l->data);
+          E_FREE(l->data);
         eina_list_free(s->governors);
         s->governors = NULL;
      }
@@ -586,7 +586,7 @@ _cpuclock_status_check_available(Cpu_Status *s)
         if (s->governors)
           {
              for (l = s->governors; l; l = l->next)
-               free(l->data);
+               E_FREE(l->data);
              eina_list_free(s->governors);
              s->governors = NULL;
           }
@@ -749,7 +749,7 @@ _cpuclock_status_check_current(Cpu_Status *s)
           {
              ret = 1;
 
-             free(s->cur_governor);
+             E_FREE(s->cur_governor);
              s->cur_governor = strdup(buf);
 
              for (i = strlen(s->cur_governor) - 1; i >= 0; i--)
@@ -845,37 +845,36 @@ _cpuclock_cb_frequency_check_notify(void *data,
    Eina_Bool freq_changed = EINA_FALSE;
    Eina_Bool init_set = EINA_FALSE;
    Thread_Config *thc = data;
-   Instance *inst = thc->inst;
 
-   if (!inst->cfg) return;
-   if (inst->cfg->esm != E_SYSINFO_MODULE_CPUCLOCK && inst->cfg->esm != 
E_SYSINFO_MODULE_SYSINFO) return;
+   if (!thc->inst && !thc->inst->cfg) return;
+   if (thc->inst->cfg->esm != E_SYSINFO_MODULE_CPUCLOCK && thc->inst->cfg->esm 
!= E_SYSINFO_MODULE_SYSINFO) return;
 
-   if ((inst->cfg->cpuclock.status) && (status) &&
+   if ((thc->inst->cfg->cpuclock.status) && (status) &&
        (
 #if defined(__OpenBSD__)
-   (status->cur_percent       != inst->cfg->cpuclock.status->cur_percent      
) ||
+   (status->cur_percent       != thc->inst->cfg->cpuclock.status->cur_percent  
    ) ||
 #endif
-   (status->cur_frequency     != inst->cfg->cpuclock.status->cur_frequency    
) ||
-   (status->cur_min_frequency != 
inst->cfg->cpuclock.status->cur_min_frequency) ||
-   (status->cur_max_frequency != 
inst->cfg->cpuclock.status->cur_max_frequency) ||
-   (status->can_set_frequency != 
inst->cfg->cpuclock.status->can_set_frequency)))
+   (status->cur_frequency     != 
thc->inst->cfg->cpuclock.status->cur_frequency    ) ||
+   (status->cur_min_frequency != 
thc->inst->cfg->cpuclock.status->cur_min_frequency) ||
+   (status->cur_max_frequency != 
thc->inst->cfg->cpuclock.status->cur_max_frequency) ||
+   (status->can_set_frequency != 
thc->inst->cfg->cpuclock.status->can_set_frequency)))
      freq_changed = EINA_TRUE;
-   E_FREE_FUNC(inst->cfg->cpuclock.status, _cpuclock_status_free);
-   inst->cfg->cpuclock.status = status;
+   E_FREE_FUNC(thc->inst->cfg->cpuclock.status, _cpuclock_status_free);
+   thc->inst->cfg->cpuclock.status = status;
    if (freq_changed)
      {
-        _cpuclock_face_update_current(inst);
+        _cpuclock_face_update_current(thc->inst);
      }
-   if (inst->cfg->cpuclock.status->active == 0)
-     elm_layout_signal_emit(inst->cfg->cpuclock.o_gadget, "e,state,disabled", 
"e");
-   else if (inst->cfg->cpuclock.status->active == 1)
-     elm_layout_signal_emit(inst->cfg->cpuclock.o_gadget, "e,state,enabled", 
"e");
+   if (thc->inst->cfg->cpuclock.status->active == 0)
+     elm_layout_signal_emit(thc->inst->cfg->cpuclock.o_gadget, 
"e,state,disabled", "e");
+   else if (thc->inst->cfg->cpuclock.status->active == 1)
+     elm_layout_signal_emit(thc->inst->cfg->cpuclock.o_gadget, 
"e,state,enabled", "e");
 
    if (!init_set)
      {
-        _cpuclock_set_pstate(inst->cfg->cpuclock.pstate_min - 1,
-                             inst->cfg->cpuclock.pstate_max - 1,
-                             inst->cfg->cpuclock.status->pstate_turbo);
+        _cpuclock_set_pstate(thc->inst->cfg->cpuclock.pstate_min - 1,
+                             thc->inst->cfg->cpuclock.pstate_max - 1,
+                             thc->inst->cfg->cpuclock.status->pstate_turbo);
         init_set = EINA_TRUE;
      }
 }
@@ -884,38 +883,9 @@ static void
 _cpuclock_cb_frequency_check_end(void *data, Ecore_Thread *th EINA_UNUSED)
 {
    Thread_Config *thc = data;
+
    e_powersave_sleeper_free(thc->sleeper);
-   if (thc->inst->cfg->cpuclock.defer)
-     {
-        if (thc->inst->cfg->cpuclock.handler)
-          ecore_event_handler_del(thc->inst->cfg->cpuclock.handler);
-        if (thc->inst->cfg->cpuclock.governor)
-          eina_stringshare_del(thc->inst->cfg->cpuclock.governor);
-        E_FREE_FUNC(thc->inst->cfg->cpuclock.status, _cpuclock_status_free);
-        thc->inst->cfg->cpuclock.defer = EINA_FALSE;
-        thc->inst->cfg->cpuclock.done = EINA_TRUE;
-        if (thc->inst->cfg->esm == E_SYSINFO_MODULE_CPUCLOCK)
-          {
-             sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
thc->inst->cfg);
-             if (thc->inst->cfg->id >= 0)
-               sysinfo_instances = eina_list_remove(sysinfo_instances, 
thc->inst);
-             E_FREE(thc->inst->cfg);
-             E_FREE(thc->inst);
-          }
-        else
-          {
-             if (thc->inst->cfg->memusage.done && thc->inst->cfg->thermal.done 
&&
-                 thc->inst->cfg->netstatus.done && 
thc->inst->cfg->cpumonitor.done && thc->inst->cfg->batman.done)
-               {
-                   sysinfo_config->items = 
eina_list_remove(sysinfo_config->items, thc->inst->cfg);
-                   if (thc->inst->cfg->id >= 0)
-                     sysinfo_instances = eina_list_remove(sysinfo_instances, 
thc->inst);
-                   E_FREE(thc->inst->cfg);
-                   E_FREE(thc->inst);
-               }
-          }
-     }
-   E_FREE_FUNC(thc, free);
+   E_FREE(thc);
 }
 
 EINTERN void
@@ -987,13 +957,10 @@ _cpuclock_removed_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_data)
                                        _cpuclock_removed_cb, inst);
    if (inst->cfg->cpuclock.frequency_check_thread)
      {
-        inst->cfg->cpuclock.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->cpuclock.frequency_check_thread);
         inst->cfg->cpuclock.frequency_check_thread = NULL;
        return;
      }
-   if (inst->cfg->cpuclock.handler)
-     ecore_event_handler_del(inst->cfg->cpuclock.handler);
    if (inst->cfg->cpuclock.governor)
      eina_stringshare_del(inst->cfg->cpuclock.governor);
    E_FREE_FUNC(inst->cfg->cpuclock.status, _cpuclock_status_free);
@@ -1021,31 +988,13 @@ sysinfo_cpuclock_remove(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_U
      ecore_event_handler_del(handler);
    if (inst->cfg->cpuclock.frequency_check_thread)
      {
-        inst->cfg->cpuclock.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->cpuclock.frequency_check_thread);
         inst->cfg->cpuclock.frequency_check_thread = NULL;
-        return;
      }
-
-   if (inst->cfg->cpuclock.handler)
-     ecore_event_handler_del(inst->cfg->cpuclock.handler);
    if (inst->cfg->cpuclock.governor)
      eina_stringshare_del(inst->cfg->cpuclock.governor);
    E_FREE_FUNC(inst->cfg->cpuclock.status, _cpuclock_status_free);
 
-   inst->cfg->cpuclock.done = EINA_TRUE;
-   if (inst->cfg->esm == E_SYSINFO_MODULE_SYSINFO)
-     {
-        if (inst->cfg->memusage.done && inst->cfg->thermal.done &&
-            inst->cfg->netstatus.done && inst->cfg->cpumonitor.done && 
inst->cfg->batman.done)
-          {
-              sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
inst->cfg);
-              if (inst->cfg->id >= 0)
-                sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
-              E_FREE(inst->cfg);
-              E_FREE(inst);
-          }
-     }
 }
 
 static void
@@ -1084,13 +1033,13 @@ _cpuclock_created_cb(void *data, Evas_Object *obj, void 
*event_data EINA_UNUSED)
    evas_object_show(inst->cfg->cpuclock.o_gadget);
    evas_object_smart_callback_del_full(obj, "gadget_created", 
_cpuclock_created_cb, data);
 
+   inst->cfg->cpuclock.status = _cpuclock_status_new();
+   _cpuclock_status_check_available(inst->cfg->cpuclock.status);
+
    E_LIST_HANDLER_APPEND(inst->cfg->cpuclock.handlers, E_EVENT_SCREENSAVER_ON, 
_screensaver_on, inst);
    E_LIST_HANDLER_APPEND(inst->cfg->cpuclock.handlers, 
E_EVENT_SCREENSAVER_OFF, _screensaver_off, inst);
+   E_LIST_HANDLER_APPEND(inst->cfg->cpuclock.handlers, 
E_EVENT_POWERSAVE_UPDATE, _cpuclock_event_cb_powersave, inst);
 
-   inst->cfg->cpuclock.status = _cpuclock_status_new();
-   _cpuclock_status_check_available(inst->cfg->cpuclock.status);
-   inst->cfg->cpuclock.handler = 
ecore_event_handler_add(E_EVENT_POWERSAVE_UPDATE,
-                                               _cpuclock_event_cb_powersave, 
inst);
    _cpuclock_config_updated(inst);
    if ((inst->cfg->cpuclock.restore_governor) && 
(inst->cfg->cpuclock.governor))
      {
@@ -1110,8 +1059,6 @@ sysinfo_cpuclock_create(Evas_Object *parent, Instance 
*inst)
 {
    Eina_List *l = NULL;
 
-   inst->cfg->cpuclock.defer = EINA_FALSE;
-   inst->cfg->cpuclock.done = EINA_FALSE;
    if (inst->cfg->cpuclock.pstate_min == 0) inst->cfg->cpuclock.pstate_min = 1;
    if (inst->cfg->cpuclock.pstate_max == 0) inst->cfg->cpuclock.pstate_max = 
101;
 
@@ -1132,13 +1079,13 @@ sysinfo_cpuclock_create(Evas_Object *parent, Instance 
*inst)
    evas_object_event_callback_add(inst->cfg->cpuclock.o_gadget, 
EVAS_CALLBACK_RESIZE, _cpuclock_resize_cb, inst);
    evas_object_show(inst->cfg->cpuclock.o_gadget);
 
+   inst->cfg->cpuclock.status = _cpuclock_status_new();
+   _cpuclock_status_check_available(inst->cfg->cpuclock.status);
+   
    E_LIST_HANDLER_APPEND(inst->cfg->cpuclock.handlers, E_EVENT_SCREENSAVER_ON, 
_screensaver_on, inst);
    E_LIST_HANDLER_APPEND(inst->cfg->cpuclock.handlers, 
E_EVENT_SCREENSAVER_OFF, _screensaver_off, inst);
+   E_LIST_HANDLER_APPEND(inst->cfg->cpuclock.handlers, 
E_EVENT_POWERSAVE_UPDATE, _cpuclock_event_cb_powersave, inst);
 
-   inst->cfg->cpuclock.status = _cpuclock_status_new();
-   _cpuclock_status_check_available(inst->cfg->cpuclock.status);
-   inst->cfg->cpuclock.handler = 
ecore_event_handler_add(E_EVENT_POWERSAVE_UPDATE,
-                                               _cpuclock_event_cb_powersave, 
inst);
    _cpuclock_config_updated(inst);
    if ((inst->cfg->cpuclock.restore_governor) && 
(inst->cfg->cpuclock.governor))
      {
@@ -1197,8 +1144,6 @@ cpuclock_create(Evas_Object *parent, int *id, 
E_Gadget_Site_Orient orient EINA_U
    inst = E_NEW(Instance, 1);
    inst->cfg = _conf_item_get(id);
    *id = inst->cfg->id;
-   inst->cfg->cpuclock.defer = EINA_FALSE;
-   inst->cfg->cpuclock.done = EINA_FALSE;
    inst->o_main = elm_box_add(parent);
    E_EXPAND(inst->o_main);
    evas_object_data_set(inst->o_main, "Instance", inst);
diff --git a/src/modules/sysinfo/cpuclock/cpuclock_config.c 
b/src/modules/sysinfo/cpuclock/cpuclock_config.c
index 187282500..7efb63707 100644
--- a/src/modules/sysinfo/cpuclock/cpuclock_config.c
+++ b/src/modules/sysinfo/cpuclock/cpuclock_config.c
@@ -8,7 +8,7 @@ _config_close(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, voi
 
    E_FREE_FUNC(inst->cfg->cpuclock.configure, evas_object_del);
    E_FREE_FUNC(cc->powersaves, eina_list_free);
-   E_FREE_FUNC(cc, free);
+   E_FREE(cc);
    e_config_save_queue();
 }
 
diff --git a/src/modules/sysinfo/cpumonitor/cpumonitor.c 
b/src/modules/sysinfo/cpumonitor/cpumonitor.c
index cfb2af60d..84488033b 100644
--- a/src/modules/sysinfo/cpumonitor/cpumonitor.c
+++ b/src/modules/sysinfo/cpumonitor/cpumonitor.c
@@ -5,18 +5,22 @@ typedef struct _Thread_Config Thread_Config;
 struct _Thread_Config
 {
    int interval;
-   int cores;
+   int num_cores;
+   int percent;
+   unsigned long total;
+   unsigned long idle;
    Instance *inst;
    E_Powersave_Sleeper *sleeper;
+   Eina_List *cores;
 };
 
 static void
-_cpumonitor_face_update(Instance *inst)
+_cpumonitor_face_update(Thread_Config *thc)
 {
    Eina_List *l;
    CPU_Core *core;
 
-   EINA_LIST_FOREACH(inst->cfg->cpumonitor.cores, l, core)
+   EINA_LIST_FOREACH(thc->cores, l, core)
      {
         Edje_Message_Int_Set *usage_msg;
         usage_msg = malloc(sizeof(Edje_Message_Int_Set) + 1 * sizeof(int));
@@ -25,12 +29,12 @@ _cpumonitor_face_update(Instance *inst)
         usage_msg->val[0] = core->percent;
         edje_object_message_send(elm_layout_edje_get(core->layout), 
EDJE_MESSAGE_INT_SET, 1,
                             usage_msg);
-        free(usage_msg);
+        E_FREE(usage_msg);
      }
-   if (inst->cfg->cpumonitor.popup)
+   if (thc->inst->cfg->cpumonitor.popup)
      {
-        elm_progressbar_value_set(inst->cfg->cpumonitor.popup_pbar,
-                                  (float)inst->cfg->cpumonitor.percent / 100);
+        elm_progressbar_value_set(thc->inst->cfg->cpumonitor.popup_pbar,
+                                  (float)thc->percent / 100);
      }
 }
 
@@ -123,7 +127,7 @@ _cpumonitor_resize_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj, void *e
 {
    Evas_Coord w = 1, h = 1, sw, sh;
    Instance *inst = data;
-   int num_cores = eina_list_count(inst->cfg->cpumonitor.cores);
+   int num_cores = inst->cfg->cpumonitor.cores;
 
    if (!num_cores || !inst->o_main) return;
 
@@ -164,9 +168,9 @@ _cpumonitor_cb_usage_check_main(void *data, Ecore_Thread 
*th)
      {
         if (ecore_thread_check(th)) break;
 #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
-        _cpumonitor_sysctl_getusage(thc->inst);
+        _cpumonitor_sysctl_getusage(&thc->total, &thc->idle, &thc->percent, 
thc->cores);
 #else 
-        _cpumonitor_proc_getusage(thc->inst);
+        _cpumonitor_proc_getusage(&thc->total, &thc->idle, &thc->percent, 
thc->cores);
 #endif
         ecore_thread_feedback(th, NULL);
         if (ecore_thread_check(th)) break;
@@ -185,12 +189,11 @@ _cpumonitor_cb_usage_check_notify(void *data,
                                    void *msg EINA_UNUSED)
 {
    Thread_Config *thc = data;
-   Instance *inst = thc->inst;
-
-   if (!inst->cfg) return;
-   if (inst->cfg->esm != E_SYSINFO_MODULE_CPUMONITOR && inst->cfg->esm != 
E_SYSINFO_MODULE_SYSINFO) return;
 
-   _cpumonitor_face_update(inst);
+   if (!thc->inst || !thc->inst->cfg) return;
+   if (thc->inst->cfg->esm != E_SYSINFO_MODULE_CPUMONITOR && 
thc->inst->cfg->esm != E_SYSINFO_MODULE_SYSINFO) return;
+   thc->inst->cfg->cpumonitor.percent = thc->percent;
+   _cpumonitor_face_update(thc);
 }
 
 static void
@@ -200,37 +203,12 @@ _cpumonitor_cb_usage_check_end(void *data, Ecore_Thread 
*th EINA_UNUSED)
    CPU_Core *core;
 
    e_powersave_sleeper_free(thc->sleeper);
-   if (thc->inst->cfg->cpumonitor.defer)
+   EINA_LIST_FREE(thc->cores, core)
      {
-       EINA_LIST_FREE(thc->inst->cfg->cpumonitor.cores, core)
-          {
-             evas_object_del(core->layout);
-             E_FREE_FUNC(core, free);
-          }
-        thc->inst->cfg->cpumonitor.defer = EINA_FALSE;
-        thc->inst->cfg->cpumonitor.done = EINA_TRUE;
-        if (thc->inst->cfg->esm == E_SYSINFO_MODULE_CPUMONITOR)
-          {
-             sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
thc->inst->cfg);
-             if (thc->inst->cfg->id >= 0)
-               sysinfo_instances = eina_list_remove(sysinfo_instances, 
thc->inst);
-            E_FREE(thc->inst->cfg);
-             E_FREE(thc->inst);
-          }
-       else
-          {
-             if (thc->inst->cfg->memusage.done && thc->inst->cfg->thermal.done 
&&
-                 thc->inst->cfg->netstatus.done && 
thc->inst->cfg->cpuclock.done && thc->inst->cfg->batman.done)
-               {
-                   sysinfo_config->items = 
eina_list_remove(sysinfo_config->items, thc->inst->cfg);
-                   if (thc->inst->cfg->id >= 0)
-                     sysinfo_instances = eina_list_remove(sysinfo_instances, 
thc->inst);
-                   E_FREE(thc->inst->cfg);
-                   E_FREE(thc->inst);
-               }
-          }
+        evas_object_del(core->layout);
+        E_FREE(core);
      }
-   E_FREE_FUNC(thc, free);
+   E_FREE(thc);
 }
 
 Evas_Object *
@@ -259,15 +237,9 @@ static Eina_Bool
 _screensaver_on(void *data)
 {
    Instance *inst = data;
-   CPU_Core *core;
 
    if (inst->cfg->cpumonitor.usage_check_thread)
      {
-        EINA_LIST_FREE(inst->cfg->cpumonitor.cores, core)
-          {
-             evas_object_del(core->layout);
-             E_FREE_FUNC(core, free);
-          }
         ecore_thread_cancel(inst->cfg->cpumonitor.usage_check_thread);
         inst->cfg->cpumonitor.usage_check_thread = NULL;
      }
@@ -293,11 +265,6 @@ _cpumonitor_config_updated(Instance *inst)
    
    if (inst->cfg->cpumonitor.usage_check_thread)
      {
-        EINA_LIST_FREE(inst->cfg->cpumonitor.cores, core)
-          {
-             evas_object_del(core->layout);
-             E_FREE_FUNC(core, free);
-          }
         ecore_thread_cancel(inst->cfg->cpumonitor.usage_check_thread);
         inst->cfg->cpumonitor.usage_check_thread = NULL;
      }
@@ -305,14 +272,17 @@ _cpumonitor_config_updated(Instance *inst)
    if (thc)
      {
         thc->inst = inst;
+        thc->total = 0;
+        thc->idle = 0;
+        thc->percent = 0;
         thc->interval = inst->cfg->cpumonitor.poll_interval;
         thc->sleeper = e_powersave_sleeper_new();
 #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
-        thc->cores = _cpumonitor_sysctl_getcores();
+        thc->num_cores = _cpumonitor_sysctl_getcores();
 #else
-        thc->cores = _cpumonitor_proc_getcores();
+        thc->num_cores = _cpumonitor_proc_getcores();
 #endif
-        for (i = 0; i < thc->cores; i++)
+        for (i = 0; i < thc->num_cores; i++)
           {
              core = E_NEW(CPU_Core, 1);
              core->layout = _cpumonitor_add_layout(inst);
@@ -321,7 +291,7 @@ _cpumonitor_config_updated(Instance *inst)
              core->percent = 0;
              core->total = 0;
              core->idle = 0;
-             inst->cfg->cpumonitor.cores = 
eina_list_append(inst->cfg->cpumonitor.cores, core);
+             thc->cores = eina_list_append(thc->cores, core);
           }
         inst->cfg->cpumonitor.usage_check_thread =
           ecore_thread_feedback_run(_cpumonitor_cb_usage_check_main,
@@ -336,7 +306,6 @@ static void
 _cpumonitor_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_data)
 {
    Instance *inst = data;
-   CPU_Core *core;
    Ecore_Event_Handler *handler;
 
    if (inst->o_main != event_data) return;
@@ -347,23 +316,14 @@ _cpumonitor_removed_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_dat
      E_FREE_FUNC(inst->cfg->cpumonitor.configure, evas_object_del);
    EINA_LIST_FREE(inst->cfg->cpumonitor.handlers, handler)
      ecore_event_handler_del(handler);
-   EINA_LIST_FREE(inst->cfg->cpumonitor.cores, core)
    evas_object_smart_callback_del_full(e_gadget_site_get(inst->o_main), 
"gadget_removed",
                                        _cpumonitor_removed_cb, inst);
    evas_object_event_callback_del_full(inst->o_main, EVAS_CALLBACK_DEL, 
sysinfo_cpumonitor_remove, data);
    if (inst->cfg->cpumonitor.usage_check_thread)
      {
-        inst->cfg->cpumonitor.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->cpumonitor.usage_check_thread);
         inst->cfg->cpumonitor.usage_check_thread = NULL;
-       return;
-     }
-   EINA_LIST_FREE(inst->cfg->cpumonitor.cores, core)
-     {
-        evas_object_del(core->layout);
-        E_FREE_FUNC(core, free);
      }
-
    sysinfo_config->items = eina_list_remove(sysinfo_config->items, inst->cfg);
    if (inst->cfg->id >= 0)
      sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
@@ -375,7 +335,6 @@ void
 sysinfo_cpumonitor_remove(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_data EINA_UNUSED)
 {
    Instance *inst = data;
-   CPU_Core *core;
    Ecore_Event_Handler *handler;
 
    if (inst->cfg->cpumonitor.popup)
@@ -386,28 +345,8 @@ sysinfo_cpumonitor_remove(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA
      ecore_event_handler_del(handler);
    if (inst->cfg->cpumonitor.usage_check_thread)
      {
-        inst->cfg->cpumonitor.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->cpumonitor.usage_check_thread);
         inst->cfg->cpumonitor.usage_check_thread = NULL;
-       return;
-     }
-   EINA_LIST_FREE(inst->cfg->cpumonitor.cores, core)
-     {
-        evas_object_del(core->layout);
-        E_FREE_FUNC(core, free);
-     }
-   inst->cfg->cpumonitor.done = EINA_TRUE;
-   if (inst->cfg->esm == E_SYSINFO_MODULE_SYSINFO)
-     {
-        if (inst->cfg->memusage.done && inst->cfg->thermal.done &&
-            inst->cfg->netstatus.done && inst->cfg->cpuclock.done && 
inst->cfg->batman.done)
-          {
-              sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
inst->cfg);
-              if (inst->cfg->id >= 0)
-                sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
-              E_FREE(inst->cfg);
-              E_FREE(inst);
-          }
      }
 }
 
@@ -455,10 +394,6 @@ _cpumonitor_created_cb(void *data, Evas_Object *obj, void 
*event_data EINA_UNUSE
 Evas_Object *
 sysinfo_cpumonitor_create(Evas_Object *parent, Instance *inst)
 {
-   inst->cfg->cpumonitor.defer = EINA_FALSE;
-   inst->cfg->cpumonitor.done = EINA_FALSE;
-   inst->cfg->cpumonitor.total = 0;
-   inst->cfg->cpumonitor.idle = 0;
    inst->cfg->cpumonitor.percent = 0;
    inst->cfg->cpumonitor.popup = NULL;
    inst->cfg->cpumonitor.configure = NULL;
@@ -514,9 +449,6 @@ _conf_item_get(int *id)
 
    ci->esm = E_SYSINFO_MODULE_CPUMONITOR;
    ci->cpumonitor.poll_interval = 32;
-   ci->cpumonitor.total = 0;
-   ci->cpumonitor.percent = 0;
-   ci->cpumonitor.idle = 0;
    ci->cpumonitor.popup = NULL;
    ci->cpumonitor.configure = NULL;
    sysinfo_config->items = eina_list_append(sysinfo_config->items, ci);
@@ -532,11 +464,6 @@ cpumonitor_create(Evas_Object *parent, int *id, 
E_Gadget_Site_Orient orient EINA
    inst = E_NEW(Instance, 1);
    inst->cfg = _conf_item_get(id);
    *id = inst->cfg->id;
-   inst->cfg->cpumonitor.defer = EINA_FALSE;
-   inst->cfg->cpumonitor.done = EINA_FALSE;
-   inst->cfg->cpumonitor.total = 0;
-   inst->cfg->cpumonitor.idle = 0;
-   inst->cfg->cpumonitor.percent = 0;
    inst->cfg->cpumonitor.popup = NULL;
    inst->cfg->cpumonitor.configure = NULL;
    inst->o_main = elm_box_add(parent);
diff --git a/src/modules/sysinfo/cpumonitor/cpumonitor.h 
b/src/modules/sysinfo/cpumonitor/cpumonitor.h
index e25b5be3a..113d0fcb4 100644
--- a/src/modules/sysinfo/cpumonitor/cpumonitor.h
+++ b/src/modules/sysinfo/cpumonitor/cpumonitor.h
@@ -5,8 +5,8 @@
 
 EINTERN void _cpumonitor_config_updated(Instance *inst);
 EINTERN int _cpumonitor_proc_getcores(void);
-EINTERN void _cpumonitor_proc_getusage(Instance *inst);
-EINTERN int _cpumonitor_sysctl_getcores(void);
+EINTERN void _cpumonitor_proc_getusage(unsigned long *prev_total, unsigned 
long *prev_idle, int *prev_precent, Eina_List *cores);
+EINTERN int _cpumonitor_sysctl_getcores(unsigned long *prev_total, unsigned 
long *prev_idle, int *prev_precent, Eina_List *cores);
 EINTERN void _cpumonitor_sysctl_getusage(Instance *inst);
 EINTERN Evas_Object *cpumonitor_configure(Instance *inst);
 #endif
diff --git a/src/modules/sysinfo/cpumonitor/cpumonitor_proc.c 
b/src/modules/sysinfo/cpumonitor/cpumonitor_proc.c
index 7428af59e..2cfb45237 100644
--- a/src/modules/sysinfo/cpumonitor/cpumonitor_proc.c
+++ b/src/modules/sysinfo/cpumonitor/cpumonitor_proc.c
@@ -28,7 +28,10 @@ _cpumonitor_proc_getcores(void)
 }
 
 void
-_cpumonitor_proc_getusage(Instance *inst)
+_cpumonitor_proc_getusage(unsigned long *prev_total,
+                          unsigned long *prev_idle,
+                          int *prev_percent,
+                          Eina_List *cores)
 {
    int k = 0, j = 0;
    char buf[4096];
@@ -42,7 +45,7 @@ _cpumonitor_proc_getusage(Instance *inst)
           {
              if (k == 0)
                {
-                  long total = 0, idle = 0, use = 0, total_change = 0, 
idle_change = 0;
+                  unsigned long total = 0, idle = 0, use = 0, total_change = 
0, idle_change = 0;
                   int percent = 0;
                   char *line, *tok;
                   int i = 0;
@@ -58,19 +61,19 @@ _cpumonitor_proc_getusage(Instance *inst)
                          idle = use;
                        tok = strtok(NULL, " ");
                     }
-                  total_change = total - inst->cfg->cpumonitor.total;
-                  idle_change = idle - inst->cfg->cpumonitor.idle;
+                  total_change = total - *prev_total;
+                  idle_change = idle - *prev_idle;
                   if (total_change != 0)
                     percent = 100 * (1 - ((float)idle_change / 
(float)total_change));
                   if (percent > 100) percent = 100;
                   else if (percent < 0) percent = 0;
-                  inst->cfg->cpumonitor.total = total;
-                  inst->cfg->cpumonitor.idle = idle;
-                  inst->cfg->cpumonitor.percent = percent;
+                  *prev_total = total;
+                  *prev_idle = idle;
+                  *prev_percent = percent;
                }
              if (k > 0)
                {
-                  long total = 0, idle = 0, use = 0, total_change = 0, 
idle_change = 0;
+                  unsigned long total = 0, idle = 0, use = 0, total_change = 
0, idle_change = 0;
                   int percent = 0;
                   if (!strncmp(buf, "cpu", 3))
                     {
@@ -89,7 +92,7 @@ _cpumonitor_proc_getusage(Instance *inst)
                          }
                     }
                   else break;
-                  core = eina_list_nth(inst->cfg->cpumonitor.cores, j);
+                  core = eina_list_nth(cores, j);
                   total_change = total - core->total;
                   idle_change = idle - core->idle;
                   if (total_change != 0)
diff --git a/src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c 
b/src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c
index 55ffd39b0..319a9b0d5 100644
--- a/src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c
+++ b/src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c
@@ -27,7 +27,7 @@ _cpumonitor_sysctl_getcores(void)
 
 
 void
-_cpumonitor_sysctl_getusage(Instance *inst)
+_cpumonitor_sysctl_getusage(unsigned long *prev_total, unsigned long 
*prev_idle, int *prev_precent, Eina_List *cores)
 {
    CPU_Core *core;
    size_t size;
@@ -36,21 +36,21 @@ _cpumonitor_sysctl_getusage(Instance *inst)
 #if defined(__FreeBSD__) || defined(__DragonFly__)
    int ncpu = _cpumonitor_sysctl_getcores();
    if (!ncpu) return;
-   size =  sizeof(long) * (CPU_STATES * ncpu);
-   long cpu_times[ncpu][CPU_STATES];
+   size =  sizeof(unsigned long) * (CPU_STATES * ncpu);
+   unsigned long cpu_times[ncpu][CPU_STATES];
 
    if (sysctlbyname("kern.cp_times", cpu_times, &size, NULL, 0) < 0)
      return;
  
    for (i = 0; i < ncpu; i++)
      {
-        long *cpu = cpu_times[i];
+        unsigned long *cpu = cpu_times[i];
         double total = 0;
 
         for (j = 0; j < CPU_STATES; j++) 
            total += cpu[j];
 
-        core = eina_list_nth(inst->cfg->cpumonitor.cores, i);
+        core = eina_list_nth(cores, i);
 
         int diff_total = total - core->total;
         int diff_idle = cpu[4] - core->idle;
@@ -58,7 +58,7 @@ _cpumonitor_sysctl_getusage(Instance *inst)
         if (diff_total == 0) diff_total = 1;
 
         double ratio = diff_total / 100.0;
-        long used = diff_total - diff_idle;
+        unsigned long used = diff_total - diff_idle;
 
         int percent = used / ratio;
         if (percent > 100) 
@@ -74,59 +74,59 @@ _cpumonitor_sysctl_getusage(Instance *inst)
         total_all += total;
         idle_all += core->idle;
      }
-   inst->cfg->cpumonitor.total = total_all / ncpu;
-   inst->cfg->cpumonitor.idle = idle_all / ncpu;
-   inst->cfg->cpumonitor.percent = (int) (percent_all / ncpu);
+   *prev_total = total_all / ncpu;
+   *prev_idle = idle_all / ncpu;
+   *prev_percent = (int) (percent_all / ncpu);
 #elif defined(__OpenBSD__)
    int ncpu = _cpumonitor_sysctl_getcores();
    if (!ncpu) return;
    if (ncpu == 1)
      {
-        long cpu_times[CPU_STATES];
+        unsigned long cpu_times[CPU_STATES];
         int cpu_time_mib[] = { CTL_KERN, KERN_CPTIME };
-        size = CPU_STATES * sizeof(long);
+        size = CPU_STATES * sizeof(unsigned long);
         if (sysctl(cpu_time_mib, 2, &cpu_times, &size, NULL, 0) < 0)
           return;
 
-        long total = 0;
+        unsigned long total = 0;
         for (j = 0; j < CPU_STATES; j++) 
           total += cpu_times[j];
         
-        long idle = cpu_times[4];
+        unsigned long idle = cpu_times[4];
 
-        int diff_total = total - inst->cfg->cpumonitor.total;
-        int diff_idle = idle - inst->cfg->cpumonitor.idle;
+        int diff_total = total - *prev_total;
+        int diff_idle = idle - *prev_idle;
 
         if (diff_total == 0) diff_total = 1;
 
         double ratio = diff_total / 100.0;
-        long used = diff_total - diff_idle;
+        unsigned long used = diff_total - diff_idle;
         int percent = used / ratio;
         if (percent > 100)
           percent = 100;
         else if (percent < 0)
           percent = 0;
          
-        inst->cfg->cpumonitor.total = total;
-        inst->cfg->cpumonitor.idle = idle; // cpu_times[3];
-        inst->cfg->cpumonitor.percent = (int) percent; 
+        *prev_total = total;
+        *prev_idle = idle; // cpu_times[3];
+        *prev_percent = (int) percent; 
      }
    else if (ncpu > 1)
      {
         for (i = 0; i < ncpu; i++)        
           {
-             long cpu_times[CPU_STATES];
-             size = CPU_STATES * sizeof(long);
+             unsigned long cpu_times[CPU_STATES];
+             size = CPU_STATES * sizeof(unsigned long);
              int cpu_time_mib[] = { CTL_KERN, KERN_CPTIME2, 0 };
              cpu_time_mib[2] = i;
              if (sysctl(cpu_time_mib, 3, &cpu_times, &size, NULL, 0) < 0)
                return;
 
-             long total = 0;
+             unsigned long total = 0;
              for (j = 0; j < CPU_STATES - 1; j++)
                total += cpu_times[j];
             
-             core = eina_list_nth(inst->cfg->cpumonitor.cores, i);
+             core = eina_list_nth(cores, i);
              int diff_total = total - core->total;
              int diff_idle  = cpu_times[4] - core->idle;
 
@@ -135,7 +135,7 @@ _cpumonitor_sysctl_getusage(Instance *inst)
 
              if (diff_total == 0) diff_total = 1;
              double ratio = diff_total / 100;
-             long used = diff_total - diff_idle;
+             unsigned long used = diff_total - diff_idle;
              int percent = used / ratio;
 
              core->percent = percent;
@@ -145,9 +145,9 @@ _cpumonitor_sysctl_getusage(Instance *inst)
              idle_all += core->idle;
           }
    
-        inst->cfg->cpumonitor.total =  (total_all / ncpu);
-        inst->cfg->cpumonitor.idle =   (idle_all / ncpu);
-        inst->cfg->cpumonitor.percent = (percent_all / ncpu) + (percent_all % 
ncpu);
+        *prev_total =  (total_all / ncpu);
+        *prev_idle =   (idle_all / ncpu);
+        *prev_percent = (percent_all / ncpu) + (percent_all % ncpu);
      }
 #endif
 }
diff --git a/src/modules/sysinfo/memusage/memusage.c 
b/src/modules/sysinfo/memusage/memusage.c
index 6562c72d8..3cb81451c 100644
--- a/src/modules/sysinfo/memusage/memusage.c
+++ b/src/modules/sysinfo/memusage/memusage.c
@@ -94,7 +94,7 @@ _memusage_face_update(Instance *inst)
    msg->val[8] = inst->cfg->memusage.swp_used;
    edje_object_message_send(elm_layout_edje_get(inst->cfg->memusage.o_gadget),
                             EDJE_MESSAGE_INT_SET, 1, msg);
-   free(msg);
+   E_FREE(msg);
 
    if (inst->cfg->memusage.popup)
      _memusage_popup_update(inst);
@@ -308,32 +308,7 @@ _memusage_cb_usage_check_end(void *data, Ecore_Thread *th 
EINA_UNUSED)
 {
    Thread_Config *thc = data;
    e_powersave_sleeper_free(thc->sleeper);
-   if (thc->inst->cfg->memusage.defer)
-     {
-        thc->inst->cfg->memusage.defer = EINA_FALSE;
-        thc->inst->cfg->memusage.done = EINA_TRUE;
-        if (thc->inst->cfg->esm == E_SYSINFO_MODULE_MEMUSAGE)
-          {
-             sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
thc->inst->cfg);
-             if (thc->inst->cfg->id >= 0)
-               sysinfo_instances = eina_list_remove(sysinfo_instances, 
thc->inst);
-            E_FREE(thc->inst->cfg);
-             E_FREE(thc->inst);
-          }
-        else
-          {
-             if (thc->inst->cfg->cpumonitor.done && 
thc->inst->cfg->thermal.done &&
-                 thc->inst->cfg->netstatus.done && 
thc->inst->cfg->cpuclock.done && thc->inst->cfg->batman.done)
-               {
-                   sysinfo_config->items = 
eina_list_remove(sysinfo_config->items, thc->inst->cfg);
-                   if (thc->inst->cfg->id >= 0)
-                     sysinfo_instances = eina_list_remove(sysinfo_instances, 
thc->inst);
-                   E_FREE(thc->inst->cfg);
-                   E_FREE(thc->inst);
-               }
-          }
-     }
-   E_FREE_FUNC(thc, free);
+   E_FREE(thc);
 }
 
 static void
@@ -342,22 +317,21 @@ _memusage_cb_usage_check_notify(void *data,
                                    void *msg EINA_UNUSED)
 {
    Thread_Config *thc = data;
-   Instance *inst = thc->inst;
-
-   if (!inst->cfg) return;
-   if (inst->cfg->esm != E_SYSINFO_MODULE_MEMUSAGE &&
-       inst->cfg->esm != E_SYSINFO_MODULE_SYSINFO) return;
-
-   inst->cfg->memusage.mem_percent = thc->mem_percent;
-   inst->cfg->memusage.swp_percent = thc->swp_percent;
-   inst->cfg->memusage.mem_total = thc->mem_total;
-   inst->cfg->memusage.mem_used = thc->mem_used;
-   inst->cfg->memusage.mem_cached = thc->mem_cached;
-   inst->cfg->memusage.mem_buffers = thc->mem_buffers;
-   inst->cfg->memusage.mem_shared = thc->mem_shared;
-   inst->cfg->memusage.swp_total = thc->swp_total;
-   inst->cfg->memusage.swp_used = thc->swp_used;
-   _memusage_face_update(inst);
+
+   if (!thc->inst->cfg) return;
+   if (thc->inst->cfg->esm != E_SYSINFO_MODULE_MEMUSAGE &&
+       thc->inst->cfg->esm != E_SYSINFO_MODULE_SYSINFO) return;
+
+   thc->inst->cfg->memusage.mem_percent = thc->mem_percent;
+   thc->inst->cfg->memusage.swp_percent = thc->swp_percent;
+   thc->inst->cfg->memusage.mem_total = thc->mem_total;
+   thc->inst->cfg->memusage.mem_used = thc->mem_used;
+   thc->inst->cfg->memusage.mem_cached = thc->mem_cached;
+   thc->inst->cfg->memusage.mem_buffers = thc->mem_buffers;
+   thc->inst->cfg->memusage.mem_shared = thc->mem_shared;
+   thc->inst->cfg->memusage.swp_total = thc->swp_total;
+   thc->inst->cfg->memusage.swp_used = thc->swp_used;
+   _memusage_face_update(thc->inst);
 }
 
 static Eina_Bool
@@ -431,10 +405,8 @@ _memusage_removed_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_data)
      ecore_event_handler_del(handler);
    if (inst->cfg->memusage.usage_check_thread)
      {
-        inst->cfg->memusage.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->memusage.usage_check_thread);
         inst->cfg->memusage.usage_check_thread = NULL;
-       return;
      }
    sysinfo_config->items = eina_list_remove(sysinfo_config->items, inst->cfg);
    if (inst->cfg->id >= 0)
@@ -455,26 +427,11 @@ sysinfo_memusage_remove(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_U
      E_FREE_FUNC(inst->cfg->memusage.configure, evas_object_del);
    if (inst->cfg->memusage.usage_check_thread)
      {
-        inst->cfg->memusage.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->memusage.usage_check_thread);
         inst->cfg->memusage.usage_check_thread = NULL;
-        return;
      }
    EINA_LIST_FREE(inst->cfg->memusage.handlers, handler)
      ecore_event_handler_del(handler);
-   inst->cfg->memusage.done = EINA_TRUE;
-   if (inst->cfg->esm == E_SYSINFO_MODULE_SYSINFO)
-     {
-        if (inst->cfg->thermal.done && inst->cfg->cpumonitor.done &&
-            inst->cfg->netstatus.done && inst->cfg->cpuclock.done && 
inst->cfg->batman.done)
-          {
-              sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
inst->cfg);
-              if (inst->cfg->id >= 0)
-                sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
-              E_FREE(inst->cfg);
-              E_FREE(inst);
-          }
-     }
 }
 
 static void
@@ -517,8 +474,6 @@ _memusage_created_cb(void *data, Evas_Object *obj, void 
*event_data EINA_UNUSED)
 Evas_Object *
 sysinfo_memusage_create(Evas_Object *parent, Instance *inst)
 {
-   inst->cfg->memusage.defer = EINA_FALSE;
-   inst->cfg->memusage.done = EINA_FALSE;
    inst->cfg->memusage.mem_percent = 0;
    inst->cfg->memusage.swp_percent = 0;
    inst->cfg->memusage.mem_total = 0;
@@ -599,8 +554,6 @@ memusage_create(Evas_Object *parent, int *id, 
E_Gadget_Site_Orient orient EINA_U
    inst = E_NEW(Instance, 1);
    inst->cfg = _conf_item_get(id);
    *id = inst->cfg->id;
-   inst->cfg->memusage.defer = EINA_FALSE;
-   inst->cfg->memusage.done = EINA_FALSE;
    inst->cfg->memusage.mem_percent = 0;
    inst->cfg->memusage.swp_percent = 0;
    inst->cfg->memusage.mem_total = 0;
diff --git a/src/modules/sysinfo/memusage/memusage_sysctl.c 
b/src/modules/sysinfo/memusage/memusage_sysctl.c
index af85e7522..1760497c5 100644
--- a/src/modules/sysinfo/memusage/memusage_sysctl.c
+++ b/src/modules/sysinfo/memusage/memusage_sysctl.c
@@ -104,7 +104,7 @@ void _memusage_sysctl_getusage(unsigned long *mem_total,
 
    *swp_used >>= 10;
 
-   free(mib);
+   E_FREE(mib);
 #elif defined(__OpenBSD__)
    static int mib[] = { CTL_HW, HW_PHYSMEM64 };
    static int bcstats_mib[] = { CTL_VFS, VFS_GENERIC, VFS_BCACHESTAT };
@@ -145,7 +145,7 @@ void _memusage_sysctl_getusage(unsigned long *mem_total,
            }
       }
 swap_out:
-   if (swdev) free(swdev);
+   if (swdev) E_FREE(swdev);
 
    *mem_total /= 1024;
  
diff --git a/src/modules/sysinfo/mod.c b/src/modules/sysinfo/mod.c
index d3fea5ae3..d8109ad5b 100644
--- a/src/modules/sysinfo/mod.c
+++ b/src/modules/sysinfo/mod.c
@@ -50,8 +50,8 @@ sysinfo_init(void)
    E_CONFIG_VAL(D, T, netstatus.poll_interval, INT);
    E_CONFIG_VAL(D, T, netstatus.automax, INT);
    E_CONFIG_VAL(D, T, netstatus.inmax, INT);
-   E_CONFIG_VAL(D, T, netstatus.receive_units, INT);
    E_CONFIG_VAL(D, T, netstatus.outmax, INT);
+   E_CONFIG_VAL(D, T, netstatus.receive_units, INT);
    E_CONFIG_VAL(D, T, netstatus.send_units, INT);
 
    conf_edd = E_CONFIG_DD_NEW("Sysinfo_Config", Config);
@@ -82,7 +82,7 @@ sysinfo_init(void)
         ci->batman.time_left = -2;
         ci->batman.have_battery = -2;
         ci->batman.have_power = -2;
-#if defined(HAVE_EEZ)E || defined(__OpenBSD__) || defined(__NetBSD__)
+#if defined(HAVE_EEZE) || defined(__OpenBSD__) || defined(__NetBSD__)
         ci->batman.fuzzy = 0;
 #endif
         ci->batman.desktop_notifications = 0;
@@ -98,8 +98,6 @@ sysinfo_init(void)
         ci->thermal.units = CELSIUS;
         ci->thermal.popup = NULL;
         ci->thermal.configure = NULL;
-        ci->thermal.defer = EINA_FALSE;
-        ci->thermal.done = EINA_FALSE;
        ci->cpuclock.poll_interval = 32;
         ci->cpuclock.restore_governor = 0;
         ci->cpuclock.auto_powersave = 1;
@@ -109,41 +107,25 @@ sysinfo_init(void)
         ci->cpuclock.pstate_max = 101;
         ci->cpuclock.popup = NULL;
        ci->cpuclock.configure = NULL;
-        ci->cpuclock.defer = EINA_FALSE;
-        ci->cpuclock.done = EINA_FALSE;
        ci->cpumonitor.poll_interval = 32;
-        ci->cpumonitor.total = 0;
-        ci->cpumonitor.idle = 0;
         ci->cpumonitor.percent = 0;
         ci->cpumonitor.popup = NULL;
         ci->cpumonitor.configure = NULL;
-        ci->cpumonitor.defer = EINA_FALSE;
-        ci->cpumonitor.done = EINA_FALSE;
         ci->memusage.poll_interval = 32;
         ci->memusage.mem_percent = 0;
         ci->memusage.swp_percent = 0;
         ci->memusage.popup = NULL;
         ci->memusage.configure = NULL;
-        ci->memusage.defer = EINA_FALSE;
-        ci->memusage.done = EINA_FALSE;
         ci->netstatus.poll_interval = 32;
         ci->netstatus.automax = EINA_TRUE;
-        ci->netstatus.receive_units = NETSTATUS_UNIT_BYTES;
-        ci->netstatus.send_units = NETSTATUS_UNIT_BYTES;
-        ci->netstatus.in = 0;
-        ci->netstatus.out = 0;
         ci->netstatus.inmax = 0;
         ci->netstatus.outmax = 0;
-        ci->netstatus.incurrent = 0;
-        ci->netstatus.outcurrent = 0;
-        ci->netstatus.inpercent = 0;
-        ci->netstatus.outpercent = 0;
+       ci->netstatus.receive_units = NETSTATUS_UNIT_BYTES;
+        ci->netstatus.send_units = NETSTATUS_UNIT_BYTES;
         ci->netstatus.instring = NULL;
         ci->netstatus.outstring = NULL;
         ci->netstatus.popup = NULL;
         ci->netstatus.configure = NULL;
-        ci->netstatus.defer = EINA_FALSE;
-        ci->netstatus.done = EINA_FALSE;
 
         E_CONFIG_LIMIT(ci->batman.poll_interval, 4, 4096);
         E_CONFIG_LIMIT(ci->batman.alert, 0, 60);
@@ -193,7 +175,7 @@ sysinfo_shutdown(void)
         Config_Item *ci;
         EINA_LIST_FREE(sysinfo_config->items, ci)
           {
-             free(ci);
+             E_FREE(ci);
           }
         E_FREE(sysinfo_config);
      }
diff --git a/src/modules/sysinfo/netstatus/netstatus.c 
b/src/modules/sysinfo/netstatus/netstatus.c
index e7238eca3..e8e9ad3c7 100644
--- a/src/modules/sysinfo/netstatus/netstatus.c
+++ b/src/modules/sysinfo/netstatus/netstatus.c
@@ -6,34 +6,43 @@ struct _Thread_Config
 {
    int interval;
    Instance *inst;
-   int percent;
-   long current;
+   Eina_Bool automax;
+   int inpercent;
+   unsigned long in;
+   unsigned long incurrent;
+   unsigned long inmax;
+   Eina_Stringshare *instring;
+   int outpercent;
+   unsigned long out;
+   unsigned long outcurrent;
+   unsigned long outmax;
+   Eina_Stringshare *outstring;
    E_Powersave_Sleeper *sleeper;
 };
 
 static void
-_netstatus_face_update(Instance *inst)
+_netstatus_face_update(Thread_Config *thc)
 {
    Edje_Message_Int_Set *msg;
 
    msg = malloc(sizeof(Edje_Message_Int_Set) + 6 * sizeof(int));
    EINA_SAFETY_ON_NULL_RETURN(msg);
    msg->count = 6;
-   msg->val[0] = inst->cfg->netstatus.incurrent;
-   msg->val[1] = inst->cfg->netstatus.inpercent;
-   msg->val[2] = inst->cfg->netstatus.inmax;
-   msg->val[3] = inst->cfg->netstatus.outcurrent;
-   msg->val[4] = inst->cfg->netstatus.outpercent;
-   msg->val[5] = inst->cfg->netstatus.outmax;
-   edje_object_message_send(elm_layout_edje_get(inst->cfg->netstatus.o_gadget),
+   msg->val[0] = thc->incurrent;
+   msg->val[1] = thc->inpercent;
+   msg->val[2] = thc->inmax;
+   msg->val[3] = thc->outcurrent;
+   msg->val[4] = thc->outpercent;
+   msg->val[5] = thc->outmax;
+   
edje_object_message_send(elm_layout_edje_get(thc->inst->cfg->netstatus.o_gadget),
                             EDJE_MESSAGE_INT_SET, 1, msg);
-   free(msg);
+   E_FREE(msg);
 
-   if (inst->cfg->netstatus.popup)
+   if (thc->inst->cfg->netstatus.popup)
      {
         char text[4096];
-        snprintf(text, sizeof(text), "%s<br>%s", 
inst->cfg->netstatus.instring, inst->cfg->netstatus.outstring);
-        elm_object_text_set(inst->cfg->netstatus.popup_label, text);
+        snprintf(text, sizeof(text), "%s<br>%s", thc->instring, 
thc->outstring);
+        elm_object_text_set(thc->inst->cfg->netstatus.popup_label, text);
      }
 }
 
@@ -130,15 +139,45 @@ _netstatus_cb_usage_check_main(void *data, Ecore_Thread 
*th)
    Thread_Config *thc = data;
    for (;;)
      {
+        char rin[4096], rout[4096];
+
         if (ecore_thread_check(th)) break;
 #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
-        _netstatus_sysctl_getrstatus(thc->inst);
-        _netstatus_sysctl_gettstatus(thc->inst);
+        _netstatus_sysctl_getrstatus(thc->automax, &thc->in, &thc->incurrent, 
&thc->inmax, &thc->inpercent);
+        _netstatus_sysctl_gettstatus(thc->automax, &thc->out, 
&thc->outcurrent, &thc->outmax, &thc->outpercent);
 #else 
-        _netstatus_proc_getrstatus(thc->inst);
-        _netstatus_proc_gettstatus(thc->inst);
+        _netstatus_proc_getrstatus(thc->automax, &thc->in, &thc->incurrent, 
&thc->inmax, &thc->inpercent);
+        _netstatus_proc_gettstatus(thc->automax, &thc->out, &thc->outcurrent, 
&thc->outmax, &thc->outpercent);
 #endif
-        ecore_thread_feedback(th, NULL);
+        if (!thc->incurrent)
+          {
+             snprintf(rin, sizeof(rin), "%s: 0 B/s", _("Receiving"));
+          }
+        else
+          {
+             if (thc->incurrent > 1048576)
+               snprintf(rin, sizeof(rin), "%s: %.2f MB/s", _("Receiving"), 
((float)thc->incurrent / 1048576));
+             else if ((thc->incurrent > 1024) && (thc->incurrent < 1048576))
+               snprintf(rin, sizeof(rin), "%s: %lu KB/s", _("Receiving"), 
(thc->incurrent / 1024));
+             else
+               snprintf(rin, sizeof(rin), "%s: %lu B/s", _("Receiving"), 
thc->incurrent);
+          }
+        eina_stringshare_replace(&thc->instring, rin);
+        if (!thc->outcurrent)
+          {
+             snprintf(rout, sizeof(rout), "%s: 0 B/s", _("Receiving"));
+          }
+        else
+          {
+             if (thc->outcurrent > 1048576)
+               snprintf(rout, sizeof(rout), "%s: %.2f MB/s", _("Receiving"), 
((float)thc->outcurrent / 1048576));
+             else if ((thc->outcurrent > 1024) && (thc->outcurrent < 1048576))
+               snprintf(rout, sizeof(rout), "%s: %lu KB/s", _("Receiving"), 
(thc->outcurrent / 1024));
+             else
+               snprintf(rout, sizeof(rout), "%s: %lu B/s", _("Receiving"), 
thc->outcurrent);
+          }
+        eina_stringshare_replace(&thc->outstring, rout);
+       ecore_thread_feedback(th, NULL);
         if (ecore_thread_check(th)) break;
         e_powersave_sleeper_sleep(thc->sleeper, thc->interval);
         if (e_powersave_mode_get() == E_POWERSAVE_MODE_FREEZE)
@@ -155,12 +194,13 @@ _netstatus_cb_usage_check_notify(void *data,
                                    void *msg EINA_UNUSED)
 {
    Thread_Config *thc = data;
-   Instance *inst = thc->inst;
 
-   if (!inst->cfg) return;
-   if (inst->cfg->esm != E_SYSINFO_MODULE_NETSTATUS && inst->cfg->esm != 
E_SYSINFO_MODULE_SYSINFO) return;
+   if (!thc->inst->cfg) return;
+   if (thc->inst->cfg->esm != E_SYSINFO_MODULE_NETSTATUS && 
thc->inst->cfg->esm != E_SYSINFO_MODULE_SYSINFO) return;
 
-   _netstatus_face_update(inst);
+  eina_stringshare_replace(&thc->inst->cfg->netstatus.instring, thc->instring);
+  eina_stringshare_replace(&thc->inst->cfg->netstatus.outstring, 
thc->outstring);
+   _netstatus_face_update(thc);
 }
 
 static void
@@ -168,34 +208,9 @@ _netstatus_cb_usage_check_end(void *data, Ecore_Thread *th 
EINA_UNUSED)
 {
    Thread_Config *thc = data;
    e_powersave_sleeper_free(thc->sleeper);
-   if (thc->inst->cfg->netstatus.defer)
-     {
-        E_FREE_FUNC(thc->inst->cfg->netstatus.instring, eina_stringshare_del);
-        E_FREE_FUNC(thc->inst->cfg->netstatus.outstring, eina_stringshare_del);
-        thc->inst->cfg->netstatus.defer = EINA_FALSE;
-        thc->inst->cfg->netstatus.done = EINA_TRUE;
-       if (thc->inst->cfg->esm == E_SYSINFO_MODULE_NETSTATUS)
-          {
-             sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
thc->inst->cfg);
-             if (thc->inst->cfg->id >= 0)
-               sysinfo_instances = eina_list_remove(sysinfo_instances, 
thc->inst);
-             E_FREE(thc->inst->cfg);
-             E_FREE(thc->inst);
-          }
-        else
-          {
-             if (thc->inst->cfg->memusage.done && thc->inst->cfg->thermal.done 
&&
-                 thc->inst->cfg->cpumonitor.done && 
thc->inst->cfg->cpuclock.done && thc->inst->cfg->batman.done)
-               {
-                   sysinfo_config->items = 
eina_list_remove(sysinfo_config->items, thc->inst->cfg);
-                   if (thc->inst->cfg->id >= 0)
-                     sysinfo_instances = eina_list_remove(sysinfo_instances, 
thc->inst);
-                   E_FREE(thc->inst->cfg);
-                   E_FREE(thc->inst);
-               }
-          }
-     }
-   E_FREE_FUNC(thc, free);
+   E_FREE_FUNC(thc->instring, eina_stringshare_del);
+   E_FREE_FUNC(thc->outstring, eina_stringshare_del);
+   E_FREE(thc);
 }
 
 static Eina_Bool
@@ -237,7 +252,18 @@ _netstatus_config_updated(Instance *inst)
         thc->inst = inst;
         thc->sleeper = e_powersave_sleeper_new();
         thc->interval = inst->cfg->netstatus.poll_interval;
-        inst->cfg->netstatus.usage_check_thread =
+        thc->in = 0;
+        thc->inmax = inst->cfg->netstatus.inmax;
+        thc->incurrent = 0;
+        thc->inpercent = 0;
+        thc->instring = NULL;
+        thc->out = 0;
+        thc->outmax = inst->cfg->netstatus.outmax;
+        thc->outcurrent = 0;
+        thc->outpercent = 0;
+        thc->outstring = NULL;
+        thc->automax = inst->cfg->netstatus.automax;
+       inst->cfg->netstatus.usage_check_thread =
           ecore_thread_feedback_run(_netstatus_cb_usage_check_main,
                                     _netstatus_cb_usage_check_notify,
                                     _netstatus_cb_usage_check_end,
@@ -265,10 +291,8 @@ _netstatus_removed_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_data
      ecore_event_handler_del(handler);
    if (inst->cfg->netstatus.usage_check_thread)
      {
-        inst->cfg->netstatus.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->netstatus.usage_check_thread);
         inst->cfg->netstatus.usage_check_thread = NULL;
-        return;
      }
    E_FREE_FUNC(inst->cfg->netstatus.instring, eina_stringshare_del);
    E_FREE_FUNC(inst->cfg->netstatus.outstring, eina_stringshare_del);
@@ -294,26 +318,12 @@ sysinfo_netstatus_remove(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_
      ecore_event_handler_del(handler);
    if (inst->cfg->netstatus.usage_check_thread)
      {
-        inst->cfg->netstatus.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->netstatus.usage_check_thread);
         inst->cfg->netstatus.usage_check_thread = NULL;
         return;
      }
    E_FREE_FUNC(inst->cfg->netstatus.instring, eina_stringshare_del);
    E_FREE_FUNC(inst->cfg->netstatus.outstring, eina_stringshare_del);
-   inst->cfg->netstatus.done = EINA_TRUE;
-   if (inst->cfg->esm == E_SYSINFO_MODULE_SYSINFO)
-     {
-        if (inst->cfg->memusage.done && inst->cfg->thermal.done &&
-            inst->cfg->cpumonitor.done && inst->cfg->cpuclock.done && 
inst->cfg->batman.done)
-          {
-              sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
inst->cfg);
-              if (inst->cfg->id >= 0)
-                sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
-              E_FREE(inst->cfg);
-              E_FREE(inst);
-          }
-     }
 }
 
 static void
@@ -324,6 +334,9 @@ _netstatus_created_cb(void *data, Evas_Object *obj, void 
*event_data EINA_UNUSED
 
    e_gadget_configure_cb_set(inst->o_main, _netstatus_configure_cb);
 
+   inst->cfg->netstatus.instring = NULL;
+   inst->cfg->netstatus.outstring = NULL;
+
    inst->cfg->netstatus.o_gadget = elm_layout_add(inst->o_main);
    if (orient == E_GADGET_SITE_ORIENT_VERTICAL)
      e_theme_edje_object_set(inst->cfg->netstatus.o_gadget,
@@ -349,17 +362,9 @@ _netstatus_created_cb(void *data, Evas_Object *obj, void 
*event_data EINA_UNUSED
 Evas_Object *
 sysinfo_netstatus_create(Evas_Object *parent, Instance *inst)
 {
-   inst->cfg->netstatus.defer = EINA_FALSE;
-   inst->cfg->netstatus.done = EINA_FALSE;
-   inst->cfg->netstatus.in = 0;
-   inst->cfg->netstatus.out = 0;
-   inst->cfg->netstatus.incurrent = 0;
-   inst->cfg->netstatus.outcurrent = 0;
-   inst->cfg->netstatus.inpercent = 0;
-   inst->cfg->netstatus.outpercent = 0;
+   inst->cfg->netstatus.popup = NULL;
    inst->cfg->netstatus.instring = NULL;
    inst->cfg->netstatus.outstring = NULL;
-   inst->cfg->netstatus.popup = NULL;
    inst->cfg->netstatus.o_gadget = elm_layout_add(parent);
    e_theme_edje_object_set(inst->cfg->netstatus.o_gadget, 
"base/theme/gadget/netstatus",
                            "e/gadget/netstatus/main");
@@ -399,16 +404,8 @@ _conf_item_get(int *id)
    ci->esm = E_SYSINFO_MODULE_NETSTATUS;
    ci->netstatus.poll_interval = 32;
    ci->netstatus.automax = EINA_TRUE;
-   ci->netstatus.inmax = 0;
-   ci->netstatus.outmax = 0;
    ci->netstatus.receive_units = NETSTATUS_UNIT_BYTES;
    ci->netstatus.send_units = NETSTATUS_UNIT_BYTES;
-   ci->netstatus.in = 0;
-   ci->netstatus.out = 0;
-   ci->netstatus.incurrent = 0;
-   ci->netstatus.outcurrent = 0;
-   ci->netstatus.inpercent = 0;
-   ci->netstatus.outpercent = 0;
    ci->netstatus.instring = NULL;
    ci->netstatus.outstring = NULL;
    ci->netstatus.popup = NULL;
@@ -426,14 +423,6 @@ netstatus_create(Evas_Object *parent, int *id, 
E_Gadget_Site_Orient orient EINA_
    inst = E_NEW(Instance, 1);
    inst->cfg = _conf_item_get(id);
    *id = inst->cfg->id;
-   inst->cfg->netstatus.defer = EINA_FALSE;
-   inst->cfg->netstatus.done = EINA_FALSE;
-   inst->cfg->netstatus.in = 0;
-   inst->cfg->netstatus.out = 0;
-   inst->cfg->netstatus.incurrent = 0;
-   inst->cfg->netstatus.outcurrent = 0;
-   inst->cfg->netstatus.inpercent = 0;
-   inst->cfg->netstatus.outpercent = 0;
    inst->cfg->netstatus.instring = NULL;
    inst->cfg->netstatus.outstring = NULL;
    inst->cfg->netstatus.popup = NULL;
diff --git a/src/modules/sysinfo/netstatus/netstatus.h 
b/src/modules/sysinfo/netstatus/netstatus.h
index 87a729b6b..257434d56 100644
--- a/src/modules/sysinfo/netstatus/netstatus.h
+++ b/src/modules/sysinfo/netstatus/netstatus.h
@@ -17,9 +17,9 @@ struct _Netstatus_Config
 };
 
 EINTERN void _netstatus_config_updated(Instance *inst);
-EINTERN void _netstatus_proc_getrstatus(Instance *inst);
-EINTERN void _netstatus_proc_gettstatus(Instance *inst);
-EINTERN void _netstatus_sysctl_getrstatus(Instance *inst);
-EINTERN void _netstatus_sysctl_gettstatus(Instance *inst);
+EINTERN void _netstatus_proc_getrstatus(Eina_Bool automax, unsigned long 
*prev_in, unsigned long *prev_incurrent, unsigned long *prev_inmax, int 
*prev_inpercent);
+EINTERN void _netstatus_proc_gettstatus(Eina_Bool automax, unsigned long 
*prev_out, unsigned long *prev_outcurrent, unsigned long *prev_outmax, int 
*prev_outpercent);
+EINTERN void _netstatus_sysctl_getrstatus(Eina_Bool automax, unsigned long 
*prev_in, unsigned long *prev_incurrent, unsigned long *prev_inmax, int 
*prev_inpercent);
+EINTERN void _netstatus_sysctl_gettstatus(Eina_Bool automax, unsigned long 
*prev_out, unsigned long *prev_outcurrent, unsigned long *prev_outmax, int 
*prev_outpercent);
 EINTERN Evas_Object *netstatus_configure(Instance *inst);
 #endif
diff --git a/src/modules/sysinfo/netstatus/netstatus_config.c 
b/src/modules/sysinfo/netstatus/netstatus_config.c
index 12d404b00..81bad60b8 100644
--- a/src/modules/sysinfo/netstatus/netstatus_config.c
+++ b/src/modules/sysinfo/netstatus/netstatus_config.c
@@ -7,7 +7,7 @@ _config_close(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, voi
    Instance *inst = nc->inst;
 
    E_FREE_FUNC(inst->cfg->netstatus.configure, evas_object_del);
-   E_FREE_FUNC(nc, free);
+   E_FREE(nc);
    e_config_save_queue();
 }
 
diff --git a/src/modules/sysinfo/netstatus/netstatus_proc.c 
b/src/modules/sysinfo/netstatus/netstatus_proc.c
index 191d1ea3c..f7e92a8b8 100644
--- a/src/modules/sysinfo/netstatus/netstatus_proc.c
+++ b/src/modules/sysinfo/netstatus/netstatus_proc.c
@@ -1,12 +1,16 @@
 #include "netstatus.h"
 
 void
-_netstatus_proc_getrstatus(Instance *inst)
+_netstatus_proc_getrstatus(Eina_Bool automax,
+                           unsigned long *prev_in,
+                           unsigned long *prev_incurrent,
+                           unsigned long *prev_inmax,
+                           int *prev_inpercent)
 {
-   long in, dummy, tot_in = 0;
-   long diffin;
+   unsigned long in, dummy, tot_in = 0;
+   unsigned long diffin;
    int percent = 0;
-   char buf[4096], rin[4096], dummys[64];
+   char buf[4096], dummys[64];
    FILE *f;
 
    f = fopen("/proc/net/dev", "r");
@@ -23,47 +27,37 @@ _netstatus_proc_getrstatus(Instance *inst)
           }
         fclose(f);
      }
-   diffin = tot_in - inst->cfg->netstatus.in;
-   if (!inst->cfg->netstatus.in)
-     inst->cfg->netstatus.in = tot_in;
+   diffin = tot_in - *prev_in;
+   if (!*prev_in)
+     *prev_in = tot_in;
    else
      {
-        inst->cfg->netstatus.in = tot_in;
-        if (inst->cfg->netstatus.automax)
+        *prev_in = tot_in;
+        if (automax)
           {
-             if (diffin > inst->cfg->netstatus.inmax)
-               inst->cfg->netstatus.inmax = diffin;
+             if (diffin > *prev_inmax)
+               *prev_inmax = diffin;
           }
-        inst->cfg->netstatus.incurrent = diffin;
-        if (inst->cfg->netstatus.inmax > 0)
-          percent = 100 * ((float)inst->cfg->netstatus.incurrent / 
(float)inst->cfg->netstatus.inmax);
+        *prev_incurrent = diffin;
+        if (*prev_inmax > 0)
+          percent = 100 * ((float)*prev_incurrent / (float)*prev_inmax);
         if (percent > 100) percent = 100;
         else if (percent < 0) percent = 0;
-        inst->cfg->netstatus.inpercent = percent;
+        *prev_inpercent = percent;
      }
-   if (!diffin)
-     {
-        snprintf(rin, sizeof(rin), "%s: 0 B/s", _("Receiving"));
-     }
-   else
-     {        
-        if (diffin > 1048576)
-          snprintf(rin, sizeof(rin), "%s: %.2f MB/s", _("Receiving"), 
((float)diffin / 1048576));
-        else if ((diffin > 1024) && (diffin < 1048576))
-          snprintf(rin, sizeof(rin), "%s: %lu KB/s", _("Receiving"), (diffin / 
1024));
-        else
-          snprintf(rin, sizeof(rin), "%s: %lu B/s", _("Receiving"), diffin);
-     }
-   eina_stringshare_replace(&inst->cfg->netstatus.instring, rin);
 }
 
 void
-_netstatus_proc_gettstatus(Instance *inst)
+_netstatus_proc_gettstatus(Eina_Bool automax,
+                           unsigned long *prev_out,
+                           unsigned long *prev_outcurrent,
+                           unsigned long *prev_outmax,
+                           int *prev_outpercent)
 {
-   long out, dummy, tot_out = 0;
-   long diffout;
+   unsigned long out, dummy, tot_out = 0;
+   unsigned long diffout;
    int percent = 0;
-   char buf[4096], rout[4096], dummys[64];
+   char buf[4096], dummys[64];
    FILE *f;
 
    f = fopen("/proc/net/dev", "r");
@@ -80,37 +74,23 @@ _netstatus_proc_gettstatus(Instance *inst)
           }
         fclose(f);
      }
-   diffout = tot_out - inst->cfg->netstatus.out;
-   if (!inst->cfg->netstatus.out)
-     inst->cfg->netstatus.out = tot_out;
+   diffout = tot_out - *prev_out;
+   if (!*prev_out)
+     *prev_out = tot_out;
    else
      {
-        inst->cfg->netstatus.out = tot_out;
-        if (inst->cfg->netstatus.automax)
+        *prev_out = tot_out;
+        if (automax)
           {
-             if (diffout > inst->cfg->netstatus.outmax)
-               inst->cfg->netstatus.outmax = diffout;
+             if (diffout > *prev_outmax)
+               *prev_outmax = diffout;
           }
-        inst->cfg->netstatus.outcurrent = diffout;
-        if (inst->cfg->netstatus.outcurrent > 0)
-          percent = 100 * ((float)inst->cfg->netstatus.outcurrent / 
(float)inst->cfg->netstatus.outmax);
+        *prev_outcurrent = diffout;
+        if (*prev_outcurrent > 0)
+          percent = 100 * ((float)*prev_outcurrent / (float)*prev_outmax);
         if (percent > 100) percent = 100;
         else if (percent < 0) percent = 0;
-        inst->cfg->netstatus.outpercent = percent;
-     }
-   if (!diffout)
-     {
-        snprintf(rout, sizeof(rout), "%s: 0 B/s", _("Sending"));
-     }
-   else
-     {
-        if (diffout > 1048576)
-          snprintf(rout, sizeof(rout), "%s: %.2f MB/s", _("Sending"), 
((float)diffout / 1048576));
-        else if ((diffout > 1024) && (diffout < 1048576))
-          snprintf(rout, sizeof(rout), "%s: %lu KB/s", _("Sending"), (diffout 
/ 1024));
-        else
-          snprintf(rout, sizeof(rout), "%s: %lu B/s", _("Sending"), diffout);
+        *prev_outpercent = percent;
      }
-   eina_stringshare_replace(&inst->cfg->netstatus.outstring, rout);
 }
 
diff --git a/src/modules/sysinfo/netstatus/netstatus_sysctl.c 
b/src/modules/sysinfo/netstatus/netstatus_sysctl.c
index e37b8af95..8822d6e3e 100644
--- a/src/modules/sysinfo/netstatus/netstatus_sysctl.c
+++ b/src/modules/sysinfo/netstatus/netstatus_sysctl.c
@@ -106,10 +106,13 @@ _openbsd_generic_network_status(unsigned long int *in, 
unsigned long int *out)
 #endif
 
 void
-_netstatus_sysctl_getrstatus(Instance *inst)
+_netstatus_sysctl_getrstatus(Eina_Bool automax,
+                           unsigned long *prev_in,
+                           unsigned long *prev_incurrent,
+                           unsigned long *prev_inmax,
+                           int *prev_inpercent)
 {
-   char rin[256];
-   long tot_in = 0, diffin;
+   unsigned long tot_in = 0, diffin;
    int percent = 0;
    unsigned long int incoming = 0, outgoing = 0;
 #if defined(__OpenBSD__)
@@ -119,45 +122,34 @@ _netstatus_sysctl_getrstatus(Instance *inst)
 #endif
 
    tot_in = incoming;
-   diffin = tot_in - inst->cfg->netstatus.in;
-   if (!inst->cfg->netstatus.in)
-     inst->cfg->netstatus.in = tot_in;
+   diffin = tot_in - *prev_in;
+   if (!*prev_in)
+     *prev_in = tot_in;
    else
      {
-        inst->cfg->netstatus.in = tot_in;
-        if (inst->cfg->netstatus.automax)
+        *prev_in = tot_in;
+        if (automax)
           {
-             if (diffin > inst->cfg->netstatus.inmax)
-               inst->cfg->netstatus.inmax = diffin;
+             if (diffin > *prev_inmax)
+               *prev_inmax = diffin;
           }
-        inst->cfg->netstatus.incurrent = diffin;
-        if (inst->cfg->netstatus.inmax > 0)
-          percent = 100 * ((float)inst->cfg->netstatus.incurrent / 
(float)inst->cfg->netstatus.inmax);
+        *prev_incurrent = diffin;
+        if (*prev_inmax > 0)
+          percent = 100 * ((float)*prev_incurrent / (float)*prev_inmax);
         if (percent > 100) percent = 100;
         else if (percent < 0) percent = 0;
-        inst->cfg->netstatus.inpercent = percent;
+        *prev_inpercent = percent;
      }
-   if (!diffin)
-     {
-        snprintf(rin, sizeof(rin), "%s: 0 B/s", _("Receiving"));
-     }
-   else
-     {        
-        if (diffin > 1048576)
-          snprintf(rin, sizeof(rin), "%s: %.2f MB/s", _("Receiving"), 
((float)diffin / 1048576));
-        else if ((diffin > 1024) && (diffin < 1048576))
-          snprintf(rin, sizeof(rin), "%s: %lu KB/s", _("Receiving"), (diffin / 
1024));
-        else
-          snprintf(rin, sizeof(rin), "%s: %lu B/s", _("Receiving"), diffin);
-     }
-   eina_stringshare_replace(&inst->cfg->netstatus.instring, rin);
 }
 
 void
-_netstatus_sysctl_gettstatus(Instance *inst)
+_netstatus_sysctl_gettstatus(Eina_Bool automax,
+                           unsigned long *prev_out,
+                           unsigned long *prev_outcurrent,
+                           unsigned long *prev_outmax,
+                           int *prev_outpercent)
 {
-   char rout[256];
-   long tot_out = 0, diffout;
+   unsigned long tot_out = 0, diffout;
    int percent = 0;
    unsigned long int incoming = 0, outgoing = 0;
 #if defined(__OpenBSD__)
@@ -167,37 +159,23 @@ _netstatus_sysctl_gettstatus(Instance *inst)
 #endif
    tot_out = outgoing;
 
-   diffout = tot_out - inst->cfg->netstatus.out;
-   if (!inst->cfg->netstatus.out)
-     inst->cfg->netstatus.out = tot_out;
+   diffout = tot_out - *prev_out;
+   if (!*prev_out)
+     *prev_out = tot_out;
    else
      {
-        inst->cfg->netstatus.out = tot_out;
-        if (inst->cfg->netstatus.automax)
+        *prev_out = tot_out;
+        if (automax)
           {
-             if (diffout > inst->cfg->netstatus.outmax)
-               inst->cfg->netstatus.outmax = diffout;
+             if (diffout > *prev_outmax)
+               *prev_outmax = diffout;
           }
-        inst->cfg->netstatus.outcurrent = diffout;
-        if (inst->cfg->netstatus.outcurrent > 0)
-          percent = 100 * ((float)inst->cfg->netstatus.outcurrent / 
(float)inst->cfg->netstatus.outmax);
+        *prev_outcurrent = diffout;
+        if (*prev_outcurrent > 0)
+          percent = 100 * ((float)*prev_outcurrent / (float)*prev_outmax);
         if (percent > 100) percent = 100;
         else if (percent < 0) percent = 0;
-        inst->cfg->netstatus.outpercent = percent;
-     }
-   if (!diffout)
-     {
-        snprintf(rout, sizeof(rout), "%s: 0 B/s", _("Sending"));
-     }
-   else
-     {
-        if (diffout > 1048576)
-          snprintf(rout, sizeof(rout), "%s: %.2f MB/s", _("Sending"), 
((float)diffout / 1048576));
-        else if ((diffout > 1024) && (diffout < 1048576))
-          snprintf(rout, sizeof(rout), "%s: %lu KB/s", _("Sending"), (diffout 
/ 1024));
-        else
-          snprintf(rout, sizeof(rout), "%s: %lu B/s", _("Sending"), diffout);
+        *prev_outpercent = percent;
      }
-   eina_stringshare_replace(&inst->cfg->netstatus.outstring, rout);
 }
 
diff --git a/src/modules/sysinfo/sysinfo.c b/src/modules/sysinfo/sysinfo.c
index 9623652c7..17b5ced32 100644
--- a/src/modules/sysinfo/sysinfo.c
+++ b/src/modules/sysinfo/sysinfo.c
@@ -19,15 +19,11 @@ _sysinfo_removed_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_data)
    evas_object_event_callback_del_full(inst->o_main, EVAS_CALLBACK_DEL, 
_sysinfo_deleted_cb, data);
    if (inst && inst->cfg)
      {
-        if (inst->cfg->batman.done && inst->cfg->memusage.done && 
inst->cfg->thermal.done &&
-            inst->cfg->cpumonitor.done && inst->cfg->cpuclock.done && 
inst->cfg->netstatus.done)
-          {
-              sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
inst->cfg);
-              if (inst->cfg->id >= 0)
-                sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
-              E_FREE(inst->cfg);
-              E_FREE(inst);
-          }
+        sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
inst->cfg);
+        if (inst->cfg->id >= 0)
+          sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
+        E_FREE(inst->cfg);
+        E_FREE(inst);
      }
 }
 
@@ -107,7 +103,6 @@ _conf_item_get(int *id)
    ci->batman.desktop_notifications = 0;
    ci->batman.popup = NULL;
    ci->batman.configure = NULL;
-   ci->batman.done = EINA_FALSE;
    ci->thermal.poll_interval = 128;
    ci->thermal.low = 30;
    ci->thermal.high = 80;
@@ -116,8 +111,6 @@ _conf_item_get(int *id)
    ci->thermal.units = CELSIUS;
    ci->thermal.popup = NULL;
    ci->thermal.configure = NULL;
-   ci->thermal.done = EINA_FALSE;
-   ci->thermal.defer = EINA_FALSE;
    ci->cpuclock.poll_interval = 32;
    ci->cpuclock.restore_governor = 0;
    ci->cpuclock.auto_powersave = 1;
@@ -127,13 +120,7 @@ _conf_item_get(int *id)
    ci->cpuclock.pstate_max = 101;
    ci->cpuclock.popup = NULL;
    ci->cpuclock.configure = NULL;
-   ci->cpuclock.done = EINA_FALSE;
-   ci->cpuclock.defer = EINA_FALSE;
-   ci->cpumonitor.done = EINA_FALSE;
-   ci->cpumonitor.defer = EINA_FALSE;
    ci->cpumonitor.poll_interval = 32;
-   ci->cpumonitor.total = 0;
-   ci->cpumonitor.idle = 0;
    ci->cpumonitor.percent = 0;
    ci->cpumonitor.popup = NULL;
    ci->cpumonitor.configure = NULL;
@@ -142,17 +129,7 @@ _conf_item_get(int *id)
    ci->memusage.swp_percent = 0;
    ci->memusage.popup = NULL;
    ci->memusage.configure = NULL;
-   ci->memusage.done = EINA_FALSE;
-   ci->memusage.defer = EINA_FALSE;
    ci->netstatus.poll_interval = 32;
-   ci->netstatus.in = 0;
-   ci->netstatus.out = 0;
-   ci->netstatus.inmax = 0;
-   ci->netstatus.outmax = 0;
-   ci->netstatus.incurrent = 0;
-   ci->netstatus.outcurrent = 0;
-   ci->netstatus.inpercent = 0;
-   ci->netstatus.outpercent = 0;
    ci->netstatus.instring = NULL;
    ci->netstatus.outstring = NULL;
    ci->netstatus.popup = NULL;
@@ -162,8 +139,6 @@ _conf_item_get(int *id)
    ci->netstatus.outmax = 0;
    ci->netstatus.receive_units = NETSTATUS_UNIT_BYTES;
    ci->netstatus.send_units = NETSTATUS_UNIT_BYTES;
-   ci->netstatus.done = EINA_FALSE;
-   ci->netstatus.defer = EINA_FALSE;
 
    sysinfo_config->items = eina_list_append(sysinfo_config->items, ci);
 
diff --git a/src/modules/sysinfo/sysinfo.h b/src/modules/sysinfo/sysinfo.h
index 466ccb4dc..98b4c5a52 100644
--- a/src/modules/sysinfo/sysinfo.h
+++ b/src/modules/sysinfo/sysinfo.h
@@ -193,10 +193,7 @@ struct _Config_Item
       int                  pstate_max;
       Cpu_Status          *status;
       Ecore_Thread        *frequency_check_thread;
-      Ecore_Event_Handler *handler;
       Eina_List           *handlers;
-      Eina_Bool            defer;
-      Eina_Bool            done;
    } cpuclock;
    struct
    {
@@ -208,14 +205,10 @@ struct _Config_Item
       Evas_Object         *configure;
       int                  poll_interval;
       int                  percent;
-      long                 total;
-      long                 idle;
+      int                  cores;
 
       Ecore_Thread        *usage_check_thread;
-      Eina_List           *cores;
       Eina_List           *handlers;
-      Eina_Bool            defer;
-      Eina_Bool            done;
    } cpumonitor;
    struct
    {
@@ -234,8 +227,6 @@ struct _Config_Item
       unsigned long        swp_used;
       Ecore_Thread        *usage_check_thread;
       Eina_List           *handlers;
-      Eina_Bool            defer;
-      Eina_Bool            done;
    } memusage;
    struct
    {
@@ -247,20 +238,12 @@ struct _Config_Item
       Netstatus_Unit       receive_units;
       Netstatus_Unit       send_units;
       int                  poll_interval;
-      long                 in;
-      long                 out;
-      long                 incurrent;
-      long                 outcurrent;
-      long                 inmax;
-      long                 outmax;
-      int                  inpercent;
-      int                  outpercent;
-      Eina_Stringshare    *instring;
-      Eina_Stringshare    *outstring;
+      unsigned long        inmax;
+      unsigned long        outmax;
       Ecore_Thread        *usage_check_thread;
       Eina_List           *handlers;
-      Eina_Bool            defer;
-      Eina_Bool            done;
+      Eina_Stringshare    *instring;
+      Eina_Stringshare    *outstring;
    } netstatus;
    struct   {
       Evas_Object *o_batman;
diff --git a/src/modules/sysinfo/thermal/thermal.c 
b/src/modules/sysinfo/thermal/thermal.c
index 91b4fbc7d..d0744754f 100644
--- a/src/modules/sysinfo/thermal/thermal.c
+++ b/src/modules/sysinfo/thermal/thermal.c
@@ -14,8 +14,8 @@ _thermal_thread_free(Tempthread *tth)
    EINA_LIST_FREE(tth->tempdevs, s) eina_stringshare_del(s);
 #endif
    e_powersave_sleeper_free(tth->sleeper);
-   free(tth->extn);
-   free(tth);
+   E_FREE(tth->extn);
+   E_FREE(tth);
 }
 
 static void
@@ -134,44 +134,17 @@ static void
 _thermal_check_notify(void *data, Ecore_Thread *th, void *msg)
 {
    Tempthread *tth = data;
-   Instance *inst = tth->inst;
    int temp = (int)((long)msg);
-   if (th != inst->cfg->thermal.th) return;
-   _thermal_apply(inst, temp);
+   if (th != tth->inst->cfg->thermal.th) return;
+   _thermal_apply(tth->inst, temp);
 }
 
 static void
 _thermal_check_done(void *data, Ecore_Thread *th EINA_UNUSED)
 {
    Tempthread *tth = data;
-   Instance *inst = tth->inst;
+   _thermal_thread_free(tth);
 
-   if (inst->cfg->thermal.defer)
-     {
-        _thermal_thread_free(tth);
-        inst->cfg->thermal.defer = EINA_FALSE;
-        inst->cfg->thermal.done = EINA_TRUE;
-        if (inst->cfg->esm == E_SYSINFO_MODULE_THERMAL)
-          {
-             sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
inst->cfg);
-             if (inst->cfg->id >= 0)
-               sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
-             E_FREE(inst->cfg);
-             E_FREE(inst);
-          }
-        else
-          {
-             if (inst->cfg->memusage.done && inst->cfg->cpumonitor.done &&
-                 inst->cfg->netstatus.done && inst->cfg->cpuclock.done && 
inst->cfg->batman.done)
-               {
-                   sysinfo_config->items = 
eina_list_remove(sysinfo_config->items, inst->cfg);
-                   if (inst->cfg->id >= 0)
-                     sysinfo_instances = eina_list_remove(sysinfo_instances, 
inst);
-                   E_FREE(inst->cfg);
-                   E_FREE(inst);
-               }
-          }
-     }
 }
 #endif
 
@@ -373,10 +346,8 @@ _thermal_removed_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_data)
                                        _thermal_removed_cb, inst);
    if (inst->cfg->thermal.th)
      {
-        inst->cfg->thermal.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->thermal.th);
         inst->cfg->thermal.th = NULL;
-        return;
      }
    _thermal_face_shutdown(inst);
    sysinfo_config->items = eina_list_remove(sysinfo_config->items, inst->cfg);
@@ -402,25 +373,10 @@ sysinfo_thermal_remove(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UN
      ecore_event_handler_del(handler); 
    if (inst->cfg->thermal.th)
      {
-        inst->cfg->thermal.defer = EINA_TRUE;
         ecore_thread_cancel(inst->cfg->thermal.th);
         inst->cfg->thermal.th = NULL;
-        return;
      }  
    _thermal_face_shutdown(inst);
-   inst->cfg->thermal.done = EINA_TRUE;
-   if (inst->cfg->esm == E_SYSINFO_MODULE_SYSINFO)
-     {
-        if (inst->cfg->memusage.done && inst->cfg->cpumonitor.done &&
-            inst->cfg->netstatus.done && inst->cfg->cpuclock.done && 
inst->cfg->batman.done)
-          {
-              sysinfo_config->items = eina_list_remove(sysinfo_config->items, 
inst->cfg);
-              if (inst->cfg->id >= 0)
-                sysinfo_instances = eina_list_remove(sysinfo_instances, inst);
-              E_FREE(inst->cfg);
-              E_FREE(inst);
-          }
-     }
 }
 
 static void
@@ -433,8 +389,6 @@ _thermal_created_cb(void *data, Evas_Object *obj, void 
*event_data EINA_UNUSED)
 
    inst->cfg->thermal.temp = 900;
    inst->cfg->thermal.have_temp = EINA_FALSE;
-   inst->cfg->thermal.defer = EINA_FALSE;
-   inst->cfg->thermal.done = EINA_FALSE;
 
    inst->cfg->thermal.o_gadget = elm_layout_add(inst->o_main);
    if (orient == E_GADGET_SITE_ORIENT_VERTICAL)
@@ -465,8 +419,6 @@ sysinfo_thermal_create(Evas_Object *parent, Instance *inst)
 {
    inst->cfg->thermal.temp = 900;
    inst->cfg->thermal.have_temp = EINA_FALSE;
-   inst->cfg->thermal.defer = EINA_FALSE;
-   inst->cfg->thermal.done = EINA_FALSE;
 
    inst->cfg->thermal.o_gadget = elm_layout_add(parent);
    e_theme_edje_object_set(inst->cfg->thermal.o_gadget, 
"base/theme/gadget/thermal",
@@ -528,8 +480,6 @@ thermal_create(Evas_Object *parent, int *id, 
E_Gadget_Site_Orient orient EINA_UN
    inst = E_NEW(Instance, 1);
    inst->cfg = _conf_item_get(id);
    *id = inst->cfg->id;
-   inst->cfg->thermal.defer = EINA_FALSE;
-   inst->cfg->thermal.done = EINA_FALSE;
    inst->o_main = elm_box_add(parent);
    E_EXPAND(inst->o_main);
    evas_object_data_set(inst->o_main, "Instance", inst);
diff --git a/src/modules/sysinfo/thermal/thermal_config.c 
b/src/modules/sysinfo/thermal/thermal_config.c
index afd2676e3..f1ead4ed0 100644
--- a/src/modules/sysinfo/thermal/thermal_config.c
+++ b/src/modules/sysinfo/thermal/thermal_config.c
@@ -10,7 +10,7 @@ _config_close(void *data, Evas *e EINA_UNUSED, Evas_Object 
*obj EINA_UNUSED, voi
    Instance *inst = tc->inst;
 
    E_FREE_FUNC(inst->cfg->thermal.configure, evas_object_del);
-   E_FREE_FUNC(tc, free);
+   E_FREE(tc);
    e_config_save_queue();
 }
 
diff --git a/src/modules/sysinfo/thermal/thermal_fallback.c 
b/src/modules/sysinfo/thermal/thermal_fallback.c
index 1135fe1da..e236a19ee 100644
--- a/src/modules/sysinfo/thermal/thermal_fallback.c
+++ b/src/modules/sysinfo/thermal/thermal_fallback.c
@@ -42,9 +42,9 @@ temperature_get_bus_files(const char *bus)
                   f = strdup(path);
                   if (f) result = eina_list_append(result, f);
                }
-             free(file);
+             E_FREE(file);
           }
-        free(name);
+        E_FREE(name);
      }
    return result;
 }
@@ -228,7 +228,7 @@ init(Tempthread *tth)
                         * one for the default. */
                        break;
                     }
-                  free(name);
+                  E_FREE(name);
                }
              break;
 
@@ -247,7 +247,7 @@ init(Tempthread *tth)
                         * one for the default. */
                        break;
                     }
-                  free(name);
+                  E_FREE(name);
                }
              break;
 

-- 


Reply via email to