raster pushed a commit to branch master.

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

commit a94ba7cbfdeb310c32b5d4655631d2612e66fb40
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Wed Nov 30 17:06:45 2016 +0900

    e tempget module - mode to using threads instead of tempget binary
    
    this should reduce mem usage by a sub binary and aso solve the sub
    shell kill issue too nd still keep the polling of system status out of
    the mainloop and keep it unblocked.
---
 src/modules/Makefile_temperature.mk     |  11 +-
 src/modules/temperature/e_mod_config.c  |  44 +++
 src/modules/temperature/e_mod_main.c    | 236 +++++-------
 src/modules/temperature/e_mod_main.h    |  41 ++-
 src/modules/temperature/e_mod_tempget.c | 604 +++++++++++++++++++++++++++---
 src/modules/temperature/e_mod_udev.c    |  70 +---
 src/modules/temperature/tempget.c       | 634 --------------------------------
 7 files changed, 730 insertions(+), 910 deletions(-)

diff --git a/src/modules/Makefile_temperature.mk 
b/src/modules/Makefile_temperature.mk
index b583063..d1cb7fb 100644
--- a/src/modules/Makefile_temperature.mk
+++ b/src/modules/Makefile_temperature.mk
@@ -22,14 +22,7 @@ if HAVE_EEZE
 src_modules_temperature_module_la_SOURCES += 
src/modules/temperature/e_mod_udev.c
 endif
 
-src_modules_temperature_tempgetdir = $(temperaturepkgdir)
-src_modules_temperature_tempget_PROGRAMS = src/modules/temperature/tempget
-
-src_modules_temperature_tempget_CPPFLAGS = $(MOD_CPPFLAGS)
-src_modules_temperature_tempget_LDADD = $(MOD_LIBS)
-src_modules_temperature_tempget_SOURCES = src/modules/temperature/tempget.c
-
 PHONIES += temperature install-temperature
-temperature: $(temperaturepkg_LTLIBRARIES) $(temperature_DATA) 
$(src_modules_temperature_tempget_PROGRAMS)
-install-temperature: install-temperatureDATA install-temperaturepkgLTLIBRARIES 
install-src_modules_temperature_tempgetPROGRAMS
+temperature: $(temperaturepkg_LTLIBRARIES) $(temperature_DATA)
+install-temperature: install-temperatureDATA install-temperaturepkgLTLIBRARIES
 endif
diff --git a/src/modules/temperature/e_mod_config.c 
b/src/modules/temperature/e_mod_config.c
index 57f5212..597184e 100644
--- a/src/modules/temperature/e_mod_config.c
+++ b/src/modules/temperature/e_mod_config.c
@@ -37,6 +37,50 @@ static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas 
*evas, E_Config_Dia
 static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
 static void _cb_display_changed(void *data, Evas_Object *obj EINA_UNUSED);
 
+static Eina_List *
+temperature_get_bus_files(const char *bus)
+{
+   Eina_List *result;
+   Eina_List *therms;
+   char path[PATH_MAX];
+   char busdir[PATH_MAX];
+   char *name;
+
+   result = NULL;
+
+   snprintf(busdir, sizeof(busdir), "/sys/bus/%s/devices", bus);
+   /* Look through all the devices for the given bus. */
+   therms = ecore_file_ls(busdir);
+
+   EINA_LIST_FREE(therms, name)
+     {
+        Eina_List *files;
+        char *file;
+
+        /* Search each device for temp*_input, these should be
+         * temperature devices. */
+        snprintf(path, sizeof(path), "%s/%s", busdir, name);
+        files = ecore_file_ls(path);
+        EINA_LIST_FREE(files, file)
+          {
+             if ((!strncmp("temp", file, 4)) &&
+                 (!strcmp("_input", &file[strlen(file) - 6])))
+               {
+                  char *f;
+
+                  snprintf(path, sizeof(path),
+                           "%s/%s/%s", busdir, name, file);
+                  f = strdup(path);
+                  if (f) result = eina_list_append(result, f);
+               }
+             free(file);
+          }
+        free(name);
+     }
+   return result;
+}
+
+
 void 
 config_temperature_module(Config_Face *inst) 
 {
diff --git a/src/modules/temperature/e_mod_main.c 
b/src/modules/temperature/e_mod_main.c
index 345b7e6..41e1c38 100644
--- a/src/modules/temperature/e_mod_main.c
+++ b/src/modules/temperature/e_mod_main.c
@@ -83,7 +83,7 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, 
const char *style)
 
    o = edje_object_add(gc->evas);
    e_theme_edje_object_set(o, "base/theme/modules/temperature",
-                          "e/modules/temperature/main");
+                           "e/modules/temperature/main");
 
    gcc = e_gadcon_client_new(gc, name, id, style, o);
    gcc->data = inst;
@@ -92,37 +92,13 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, 
const char *style)
    inst->o_temp = o;
    inst->module = temperature_config->module;
    inst->have_temp = EINA_FALSE;
-#ifdef HAVE_EEZE
-   if (inst->backend == TEMPGET)
-     {
-        inst->tempget_data_handler = 
-          ecore_event_handler_add(ECORE_EXE_EVENT_DATA,
-                                 _temperature_cb_exe_data, inst);
-        inst->tempget_del_handler = 
-          ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
-                                 _temperature_cb_exe_del, inst);
-     }
-   else
-     {
-        eeze_init();
-        inst->temp_poller = 
-         ecore_poller_add(ECORE_POLLER_CORE, inst->poll_interval, 
-                          temperature_udev_update_poll, inst);
-        temperature_udev_update(inst);
-     }
-#else 
-   inst->tempget_data_handler = 
-     ecore_event_handler_add(ECORE_EXE_EVENT_DATA,
-                            _temperature_cb_exe_data, inst);
-   inst->tempget_del_handler = 
-     ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
-                            _temperature_cb_exe_del, inst);
+#ifdef HAVE_EEEZ_UDEV
+   eeze_init();
 #endif
-
    temperature_face_update_config(inst);
 
    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
-                                 _temperature_face_cb_mouse_down, inst);
+                                  _temperature_face_cb_mouse_down, inst);
    return gcc;
 }
 
@@ -133,25 +109,7 @@ _gc_shutdown(E_Gadcon_Client *gcc)
 
    inst = gcc->data;
 
-   if (inst->tempget_exe)
-     {
-       ecore_exe_kill(inst->tempget_exe);
-       ecore_exe_free(inst->tempget_exe);
-       inst->tempget_exe = NULL;
-     }
-   if (inst->tempget_data_handler)
-     {
-        ecore_event_handler_del(inst->tempget_data_handler);
-        inst->tempget_data_handler = NULL;
-     }
-   if (inst->tempget_del_handler)
-     {
-       ecore_event_handler_del(inst->tempget_del_handler);
-       inst->tempget_del_handler = NULL;
-     }
 #ifdef HAVE_EEEZ_UDEV
-   if (inst->temp_poller)
-     ecore_poller_del(inst->temp_poller);
    eeze_shutdown();
 #endif
    if (inst->o_temp) evas_object_del(inst->o_temp);
@@ -181,7 +139,7 @@ _gc_icon(const E_Gadcon_Client_Class *client_class 
EINA_UNUSED, Evas *evas)
 
    o = edje_object_add(evas);
    snprintf(buf, sizeof(buf), "%s/e-module-temperature.edj",
-           e_module_dir_get(temperature_config->module));
+            e_module_dir_get(temperature_config->module));
    edje_object_file_set(o, buf, "icon");
    return o;
 }
@@ -242,7 +200,7 @@ _temperature_face_cb_mouse_down(void *data, Evas *e 
EINA_UNUSED, Evas_Object *ob
      }
 }
 
-void
+static void
 _temperature_face_level_set(Config_Face *inst, double level)
 {
    Edje_Message_Float msg;
@@ -269,17 +227,9 @@ _temperature_face_shutdown(const Eina_Hash *hash 
EINA_UNUSED, const void *key EI
    Config_Face *inst;
 
    inst = hdata;
+   if (inst->th) ecore_thread_cancel(inst->th);
    if (inst->sensor_name) eina_stringshare_del(inst->sensor_name);
    if (inst->id) eina_stringshare_del(inst->id);
-#ifdef HAVE_EEZE
-   if (inst->tempdevs)
-     {
-        const char *s;
-
-        EINA_LIST_FREE(inst->tempdevs, s)
-          eina_stringshare_del(s);
-     }
-#endif
    E_FREE(inst);
    return EINA_TRUE;
 }
@@ -298,113 +248,105 @@ _temperature_face_id_max(const Eina_Hash *hash 
EINA_UNUSED, const void *key, voi
    return EINA_TRUE;
 }
 
-void 
-temperature_face_update_config(Config_Face *inst)
+static void
+_temprature_check_main(void *data, Ecore_Thread *th)
 {
-   char buf[8192];
+   Tempthread *tth = data;
+   int ptemp = -500, temp;
 
-   if (inst->tempget_exe)
+   for (;;)
      {
-        ecore_exe_kill(inst->tempget_exe);
-        ecore_exe_free(inst->tempget_exe);
-        inst->tempget_exe = NULL;
+        if (ecore_thread_check(th)) break;
+        temp = -999;
+#ifdef HAVE_EEZE
+        if (tth->udev) temp = temperature_udev_get(tth);
+        else
+#endif
+          temp = temperature_tempget_get(tth);
+
+        if (ptemp != temp) ecore_thread_feedback(th, (void *)((long)temp));
+        ptemp = temp;
+        usleep((1000000.0 / 8.0) * (double)tth->poll_interval);
+        if (ecore_thread_check(th)) break;
      }
+}
 
-#ifdef HAVE_EEZE
-   if (inst->backend == TEMPGET)
+static void
+_temprature_check_notify(void *data, Ecore_Thread *th, void *msg)
+{
+   Tempthread *tth  = data;
+   Config_Face *inst = tth->inst;
+   int temp = (int)((long)msg);
+   char buf[64];
+
+   if (th != inst->th) return;
+   if (temp != -999)
      {
-        if (inst->temp_poller)
+        if (inst->units == FAHRENHEIT) temp = (temp * 9.0 / 5.0) + 32;
+
+        if (!inst->have_temp)
           {
-             ecore_poller_del(inst->temp_poller);
-             inst->temp_poller = NULL;
+             /* enable therm object */
+             edje_object_signal_emit(inst->o_temp, "e,state,known", "");
+             inst->have_temp = EINA_TRUE;
           }
-       if (!inst->tempget_exe) 
-         {
-            snprintf(buf, sizeof(buf),
-                     "exec %s/%s/tempget %i \"%s\" %i", 
-                     e_module_dir_get(temperature_config->module), 
MODULE_ARCH, 
-                     inst->sensor_type,
-                     (inst->sensor_name ? inst->sensor_name : "(null)"),
-                     inst->poll_interval);
-             inst->tempget_exe =
-               ecore_exe_pipe_run(buf, ECORE_EXE_PIPE_READ |
-                                  ECORE_EXE_PIPE_READ_LINE_BUFFERED |
-                                  ECORE_EXE_NOT_LEADER |
-                                  ECORE_EXE_TERM_WITH_PARENT, inst);
-         }
-     }
-   else if (inst->backend == UDEV)
-     {
-       /*avoid creating a new poller if possible*/
-        if (inst->temp_poller)
-          ecore_poller_poller_interval_set(inst->temp_poller, 
-                                          inst->poll_interval);
-        else 
-         {
-            inst->temp_poller = 
-              ecore_poller_add(ECORE_POLLER_CORE, inst->poll_interval, 
-                               temperature_udev_update_poll, inst);
-         }
+        if (inst->units == FAHRENHEIT)
+          snprintf(buf, sizeof(buf), "%i°F", temp);
+        else
+          snprintf(buf, sizeof(buf), "%i°C", temp);
+
+        _temperature_face_level_set(inst,
+                                    (double)(temp - inst->low) /
+                                    (double)(inst->high - inst->low));
+        edje_object_part_text_set(inst->o_temp, "e.text.reading", buf);
      }
-#else
-   if (!inst->tempget_exe) 
+   else
      {
-       snprintf(buf, sizeof(buf),
-                "%s/%s/tempget %i \"%s\" %i", 
-                e_module_dir_get(temperature_config->module), MODULE_ARCH, 
-                inst->sensor_type,
-                (inst->sensor_name ? inst->sensor_name : "(null)"),
-                inst->poll_interval);
-        inst->tempget_exe =
-          ecore_exe_pipe_run(buf, ECORE_EXE_PIPE_READ |
-                             ECORE_EXE_PIPE_READ_LINE_BUFFERED |
-                             ECORE_EXE_NOT_LEADER |
-                             ECORE_EXE_TERM_WITH_PARENT, inst);
+        if (inst->have_temp)
+          {
+             /* disable therm object */
+             edje_object_signal_emit(inst->o_temp, "e,state,unknown", "");
+             edje_object_part_text_set(inst->o_temp, "e.text.reading", "N/A");
+             _temperature_face_level_set(inst, 0.5);
+             inst->have_temp = EINA_FALSE;
+          }
      }
-#endif
 }
 
-Eina_List *
-temperature_get_bus_files(const char *bus)
+static void
+_temprature_check_done(void *data, Ecore_Thread *th)
 {
-   Eina_List *result;
-   Eina_List *therms;
-   char path[PATH_MAX];
-   char busdir[PATH_MAX];
-   char *name;
+   Tempthread *tth  = data;
+   const char *s;
+
+   eina_stringshare_del(tth->sensor_name);
+   eina_stringshare_del(tth->sensor_path);
+   EINA_LIST_FREE(tth->tempdevs, s) eina_stringshare_del(s);
+   free(tth->extn);
+   free(tth);
+}
 
-   result = NULL;
+void
+temperature_face_update_config(Config_Face *inst)
+{
+   Tempthread *tth;
 
-   snprintf(busdir, sizeof(busdir), "/sys/bus/%s/devices", bus);
-   /* Look through all the devices for the given bus. */
-   therms = ecore_file_ls(busdir);
+   if (inst->th) ecore_thread_cancel(inst->th);
 
-   EINA_LIST_FREE(therms, name)
-     {
-        Eina_List *files;
-        char *file;
-
-        /* Search each device for temp*_input, these should be
-         * temperature devices. */
-        snprintf(path, sizeof(path), "%s/%s", busdir, name);
-        files = ecore_file_ls(path);
-        EINA_LIST_FREE(files, file)
-          {
-             if ((!strncmp("temp", file, 4)) &&
-                 (!strcmp("_input", &file[strlen(file) - 6])))
-               {
-                  char *f;
-
-                  snprintf(path, sizeof(path),
-                           "%s/%s/%s", busdir, name, file);
-                  f = strdup(path);
-                  if (f) result = eina_list_append(result, f);
-               }
-             free(file);
-          }
-        free(name);
-     }
-   return result;
+   tth = calloc(1, sizeof(Tempthread));
+   tth->poll_interval = inst->poll_interval;
+#ifdef HAVE_EEZE
+   if (inst->backend != TEMPGET) tth->udev = EINA_TRUE;
+#endif
+   tth->sensor_type = inst->sensor_type;
+   tth->inst = inst;
+   if (inst->sensor_name)
+     tth->sensor_name = eina_stringshare_add(inst->sensor_name);
+   inst->th = ecore_thread_feedback_run(_temprature_check_main,
+                                        _temprature_check_notify,
+                                        _temprature_check_done,
+                                        _temprature_check_done,
+                                        tth, EINA_TRUE);
 }
 
 /* module setup */
diff --git a/src/modules/temperature/e_mod_main.h 
b/src/modules/temperature/e_mod_main.h
index 08a60b1..b096b4f 100644
--- a/src/modules/temperature/e_mod_main.h
+++ b/src/modules/temperature/e_mod_main.h
@@ -26,6 +26,7 @@ typedef enum _Sensor_Type
 
 typedef struct _Config Config;
 typedef struct _Config_Face Config_Face;
+typedef struct _Tempthread Tempthread;
 
 typedef enum _Unit
 {
@@ -33,36 +34,43 @@ typedef enum _Unit
    FAHRENHEIT
 } Unit;
 
+struct _Tempthread
+{
+   Config_Face *inst;
+   int poll_interval;
+   Sensor_Type sensor_type;
+   const char *sensor_name;
+   const char *sensor_path;
+   void *extn;
+#ifdef HAVE_EEZE
+   Eina_List *tempdevs;
+   Eina_Bool udev : 1;
+#endif
+   Eina_Bool initted : 1;
+};
+
 struct _Config_Face
 {
    const char *id;
    /* saved * loaded config values */
    int poll_interval;
    int low, high;
-#ifdef HAVE_EEZE
-   Eina_List *tempdevs;
-   int backend;
-   Ecore_Poller *temp_poller;
-#endif
    int sensor_type;
    const char *sensor_name;
    Unit units;
    /* config state */
    E_Gadcon_Client *gcc;
    Evas_Object *o_temp;
-
+#ifdef HAVE_EEZE
+   int backend;
+#endif
    E_Module *module;
 
    E_Config_Dialog *config_dialog;
    E_Menu *menu;
-   Ecore_Exe *tempget_exe;
-   Ecore_Event_Handler *tempget_data_handler;
-   Ecore_Event_Handler *tempget_del_handler;
+   Ecore_Thread *th;
 
    Eina_Bool have_temp:1;
-#if defined (__FreeBSD__) || defined (__OpenBSD__)
-   int mib[5];
-#endif
 };
 
 struct _Config
@@ -80,8 +88,7 @@ typedef enum _Backend
    UDEV
 } Backend;
 
-Eina_Bool temperature_udev_update_poll(void *data);
-void temperature_udev_update(void *data);
+int temperature_udev_get(Tempthread *tth);
 #endif
 
 E_API extern E_Module_Api e_modapi;
@@ -90,12 +97,10 @@ E_API void *e_modapi_init(E_Module *m);
 E_API int e_modapi_shutdown(E_Module *m);
 E_API int e_modapi_save(E_Module *m);
 
-Eina_Bool _temperature_cb_exe_data(void *data, int type, void *event);
-Eina_Bool _temperature_cb_exe_del(void *data, int type, void *event);
-void _temperature_face_level_set(Config_Face *inst, double level);
 void config_temperature_module(Config_Face *inst);
 void temperature_face_update_config(Config_Face *inst);
-Eina_List *temperature_get_bus_files(const char* bus);
+
+int temperature_tempget_get(Tempthread *tth);
 
 /**
  * @addtogroup Optional_Gadgets
diff --git a/src/modules/temperature/e_mod_tempget.c 
b/src/modules/temperature/e_mod_tempget.c
index 5091d07..d4078c3 100644
--- a/src/modules/temperature/e_mod_tempget.c
+++ b/src/modules/temperature/e_mod_tempget.c
@@ -1,76 +1,580 @@
 #include "e.h"
 #include "e_mod_main.h"
 
-Eina_Bool
-_temperature_cb_exe_data(void *data, EINA_UNUSED int type, void *event)
+#if defined (__FreeBSD__) || defined(__DragonFly__)
+# include <sys/types.h>
+# include <sys/sysctl.h>
+# include <errno.h>
+#endif
+
+#ifdef __OpenBSD__
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/sensors.h>
+#include <errno.h>
+#include <err.h>
+#endif
+
+typedef struct
 {
-   Ecore_Exe_Event_Data *ev;
-   Config_Face *inst;
-   int temp;
+#if defined (__FreeBSD__) || defined(__DragonFly__) || defined (__OpenBSD__)
+   int mib[CTL_MAXNAME];
+#endif
+#if defined (__FreeBSD__) || defined(__DragonFly__)
+   unsigned int miblen;
+#endif
+   int dummy;
+} Extn;
+
+#if defined (__FreeBSD__) || defined(__DragonFly__)
+static const char *sources[] =
+  {
+     "hw.acpi.thermal.tz0.temperature",
+     "dev.cpu.0.temperature",
+     "dev.aibs.0.temp.0",
+     "dev.lm75.0.temperature",
+     NULL
+  };
+#endif
+
+Eina_List *
+temperature_get_bus_files(const char *bus)
+{
+   Eina_List *result;
+   Eina_List *therms;
+   char path[PATH_MAX];
+   char busdir[PATH_MAX];
+   char *name;
 
-   ev = event;
-   inst = data;
-   if ((!inst->tempget_exe) || (ev->exe != inst->tempget_exe)) return 
ECORE_CALLBACK_PASS_ON;
-   temp = -999;
-   if ((ev->lines) && (ev->lines[0].line))
+   result = NULL;
+
+   snprintf(busdir, sizeof(busdir), "/sys/bus/%s/devices", bus);
+   /* Look through all the devices for the given bus. */
+   therms = ecore_file_ls(busdir);
+
+   EINA_LIST_FREE(therms, name)
      {
-        int i;
+        Eina_List *files;
+        char *file;
 
-        for (i = 0; ev->lines[i].line; i++)
+        /* Search each device for temp*_input, these should be
+         * temperature devices. */
+        snprintf(path, sizeof(path), "%s/%s", busdir, name);
+        files = ecore_file_ls(path);
+        EINA_LIST_FREE(files, file)
           {
-             if (!strcmp(ev->lines[i].line, "ERROR"))
-               temp = -999;
-             else
-               temp = atoi(ev->lines[i].line);
+             if ((!strncmp("temp", file, 4)) &&
+                 (!strcmp("_input", &file[strlen(file) - 6])))
+               {
+                  char *f;
+
+                  snprintf(path, sizeof(path),
+                           "%s/%s/%s", busdir, name, file);
+                  f = strdup(path);
+                  if (f) result = eina_list_append(result, f);
+               }
+             free(file);
           }
+        free(name);
      }
-   if (temp != -999)
-     {
-        char buf[256];
+   return result;
+}
 
-        if (inst->units == FAHRENHEIT)
-          temp = (temp * 9.0 / 5.0) + 32;
+#ifdef __OpenBSD__
+static struct sensor snsr;
+static size_t slen = sizeof(snsr);
+#endif
 
-        if (!inst->have_temp)
+static void
+init(Tempthread *tth)
+{
+   Eina_List *therms;
+   char path[512];
+#ifdef __OpenBSD__
+   int dev, numt;
+   struct sensordev snsrdev;
+   c size_t sdlen = sizeof(snsrdev);
+#endif
+#if defined (__FreeBSD__) || defined(__DragonFly__)
+   unsigned i;
+   size_t len;
+   int rc;
+#endif
+   Extn *extn;
+
+   if (tth->initted) return;
+   tth->initted = EINA_TRUE;
+
+   extn = calloc(1, sizeof(Extn));
+   tth->extn = extn;
+
+   if ((!tth->sensor_type) ||
+       ((!tth->sensor_name) ||
+        (tth->sensor_name[0] == 0)))
+     {
+        eina_stringshare_del(tth->sensor_name);
+        tth->sensor_name = NULL;
+        eina_stringshare_del(tth->sensor_path);
+        tth->sensor_path = NULL;
+#if defined (__FreeBSD__) || defined(__DragonFly__)
+        for (i = 0; sources[i]; i++)
+          {
+             rc = sysctlbyname(sources[i], NULL, NULL, NULL, 0);
+             if (rc == 0)
+               {
+                  tth->sensor_type = SENSOR_TYPE_FREEBSD;
+                  tth->sensor_name = eina_stringshare_add(sources[i]);
+                  break;
+               }
+          }
+#elif __OpenBSD__
+        extn->mib[0] = CTL_HW;
+        extn->mib[1] = HW_SENSORS;
+
+        for (dev = 0;; dev++)
           {
-             /* enable therm object */
-             edje_object_signal_emit(inst->o_temp, "e,state,known", "");
-             inst->have_temp = EINA_TRUE;
+             extn->mib[2] = dev;
+             if (sysctl(extn->mib, 3, &snsrdev, &sdlen, NULL, 0) == -1)
+               {
+                  if (errno == ENOENT) /* no further sensors */
+                    break;
+                  else
+                    continue;
+               }
+             if (strcmp(snsrdev.xname, "cpu0") == 0)
+               {
+                  sensor_type = SENSOR_TYPE_OPENBSD;
+                  sensor_name = strdup("cpu0");
+                  break;
+               }
+             else if (strcmp(snsrdev.xname, "km0") == 0)
+               {
+                  sensor_type = SENSOR_TYPE_OPENBSD;
+                  sensor_name = strdup("km0");
+                  break;
+               }
           }
+#else
+        therms = ecore_file_ls("/proc/acpi/thermal_zone");
+        if (therms)
+          {
+             char *name;
 
-        if (inst->units == FAHRENHEIT) 
-          snprintf(buf, sizeof(buf), "%i°F", temp);
+             name = eina_list_data_get(therms);
+             tth->sensor_type = SENSOR_TYPE_LINUX_ACPI;
+             tth->sensor_name = eina_stringshare_add(name);
+             eina_list_free(therms);
+          }
         else
-          snprintf(buf, sizeof(buf), "%i°C", temp);  
+          {
+             eina_list_free(therms);
+             therms = ecore_file_ls("/sys/class/thermal");
+             if (therms)
+               {
+                  char *name;
+                  Eina_List *l;
+
+                  EINA_LIST_FOREACH(therms, l, name)
+                    {
+                       if (!strncmp(name, "thermal", 7))
+                         {
+                            tth->sensor_type = SENSOR_TYPE_LINUX_SYS;
+                            tth->sensor_name = eina_stringshare_add(name);
+                            eina_list_free(therms);
+                            therms = NULL;
+                            break;
+                         }
+                    }
+                  if (therms) eina_list_free(therms);
+               }
+             if (therms)
+               {
+                  if (ecore_file_exists("/proc/omnibook/temperature"))
+                    {
+                       tth->sensor_type = SENSOR_TYPE_OMNIBOOK;
+                       tth->sensor_name = eina_stringshare_add("dummy");
+                    }
+                  else if 
(ecore_file_exists("/sys/devices/temperatures/sensor1_temperature"))
+                    {
+                       tth->sensor_type = SENSOR_TYPE_LINUX_PBOOK;
+                       tth->sensor_name = eina_stringshare_add("dummy");
+                    }
+                  else if 
(ecore_file_exists("/sys/devices/temperatures/cpu_temperature"))
+                    {
+                       tth->sensor_type = SENSOR_TYPE_LINUX_MACMINI;
+                       tth->sensor_name = eina_stringshare_add("dummy");
+                    }
+                  else if 
(ecore_file_exists("/sys/devices/platform/coretemp.0/temp1_input"))
+                    {
+                       tth->sensor_type = SENSOR_TYPE_LINUX_INTELCORETEMP;
+                       tth->sensor_name = eina_stringshare_add("dummy");
+                    }
+                  else if 
(ecore_file_exists("/sys/devices/platform/thinkpad_hwmon/temp1_input"))
+                    {
+                       tth->sensor_type = SENSOR_TYPE_LINUX_THINKPAD;
+                       tth->sensor_name = eina_stringshare_add("dummy");
+                    }
+                  else
+                    {
+                       // try the i2c bus
+                       therms = temperature_get_bus_files("i2c");
+                       if (therms)
+                         {
+                            char *name;
 
-        _temperature_face_level_set(inst,
-               (double)(temp - inst->low) /
-               (double)(inst->high - inst->low));
-        edje_object_part_text_set(inst->o_temp, "e.text.reading", buf);
+                            if ((name = eina_list_data_get(therms)))
+                              {
+                                 if (ecore_file_exists(name))
+                                   {
+                                      int len;
+
+                                      snprintf(path, sizeof(path),
+                                               "%s", 
ecore_file_file_get(name));
+                                      len = strlen(path);
+                                      if (len > 6) path[len - 6] = '\0';
+                                      tth->sensor_type = SENSOR_TYPE_LINUX_I2C;
+                                      tth->sensor_path = 
eina_stringshare_add(name);
+                                      tth->sensor_name = 
eina_stringshare_add(path);
+                                   }
+                              }
+                            eina_list_free(therms);
+                         }
+                       if (!tth->sensor_path)
+                         {
+                            // try the pci bus
+                            therms = temperature_get_bus_files("pci");
+                            if (therms)
+                              {
+                                 char *name;
+
+                                 if ((name = eina_list_data_get(therms)))
+                                   {
+                                      if (ecore_file_exists(name))
+                                        {
+                                           int len;
+
+                                           snprintf(path, sizeof(path),
+                                                    "%s", 
ecore_file_file_get(name));
+                                           len = strlen(path);
+                                           if (len > 6) path[len - 6] = '\0';
+                                           tth->sensor_type = 
SENSOR_TYPE_LINUX_PCI;
+                                           tth->sensor_path = 
eina_stringshare_add(name);
+                                           
eina_stringshare_del(tth->sensor_name);
+                                           tth->sensor_name = 
eina_stringshare_add(path);
+                                        }
+                                   }
+                                 eina_list_free(therms);
+                              }
+                         }
+                    }
+               }
+          }
+#endif
      }
-   else
+   if ((tth->sensor_type) && (tth->sensor_name) && (!tth->sensor_path))
      {
-        if (inst->have_temp)
+        char *name;
+
+        switch (tth->sensor_type)
           {
-             /* disable therm object */
-             edje_object_signal_emit(inst->o_temp, "e,state,unknown", "");
-             edje_object_part_text_set(inst->o_temp, "e.text.reading", "N/A");
-             _temperature_face_level_set(inst, 0.5);
-             inst->have_temp = EINA_FALSE;
+           case SENSOR_TYPE_NONE:
+             break;
+
+           case SENSOR_TYPE_FREEBSD:
+#if defined (__FreeBSD__) || defined(__DragonFly__)
+             len = sizeof(extn->mib) / sizeof(extn->mib[0]);
+             rc = sysctlnametomib(tth->sensor_name, extn->mib, &len);
+             if (rc == 0)
+               {
+                  extn->miblen = len;
+                  tth->sensor_path = eina_stringshare_add(tth->sensor_name);
+               }
+#endif
+             break;
+
+           case SENSOR_TYPE_OPENBSD:
+#ifdef __OpenBSD__
+             for (numt = 0; numt < snsrdev.maxnumt[SENSOR_TEMP]; numt++)
+               {
+                  extn->mib[4] = numt;
+                  slen = sizeof(snsr);
+                  if (sysctl(extn->mib, 5, &snsr, &slen, NULL, 0) == -1)
+                    continue;
+                  if (slen > 0 && (snsr.flags & SENSOR_FINVALID) == 0)
+                    {
+                       break;
+                    }
+               }
+#endif
+             break;
+
+           case SENSOR_TYPE_OMNIBOOK:
+             tth->sensor_path = 
eina_stringshare_add("/proc/omnibook/temperature");
+             break;
+
+           case SENSOR_TYPE_LINUX_MACMINI:
+             tth->sensor_path = 
eina_stringshare_add("/sys/devices/temperatures/cpu_temperature");
+             break;
+
+           case SENSOR_TYPE_LINUX_PBOOK:
+             tth->sensor_path = 
eina_stringshare_add("/sys/devices/temperatures/sensor1_temperature");
+             break;
+
+           case SENSOR_TYPE_LINUX_INTELCORETEMP:
+             tth->sensor_path = 
eina_stringshare_add("/sys/devices/platform/coretemp.0/temp1_input");
+             break;
+
+           case SENSOR_TYPE_LINUX_THINKPAD:
+             tth->sensor_path = 
eina_stringshare_add("/sys/devices/platform/thinkpad_hwmon/temp1_input");
+             break;
+
+           case SENSOR_TYPE_LINUX_I2C:
+             therms = ecore_file_ls("/sys/bus/i2c/devices");
+
+             EINA_LIST_FREE(therms, name)
+               {
+                  snprintf(path, sizeof(path),
+                           "/sys/bus/i2c/devices/%s/%s_input",
+                           name, tth->sensor_name);
+                  if (ecore_file_exists(path))
+                    {
+                       tth->sensor_path = eina_stringshare_add(path);
+                       /* We really only care about the first
+                        * one for the default. */
+                       break;
+                    }
+                  free(name);
+               }
+             break;
+
+           case SENSOR_TYPE_LINUX_PCI:
+             therms = ecore_file_ls("/sys/bus/pci/devices");
+
+             EINA_LIST_FREE(therms, name)
+               {
+                  snprintf(path, sizeof(path),
+                           "/sys/bus/pci/devices/%s/%s_input",
+                           name, tth->sensor_name);
+                  if (ecore_file_exists(path))
+                    {
+                       tth->sensor_path = eina_stringshare_add(path);
+                       /* We really only care about the first
+                        * one for the default. */
+                       break;
+                    }
+                  free(name);
+               }
+             break;
+
+           case SENSOR_TYPE_LINUX_ACPI:
+             snprintf(path, sizeof(path),
+                      "/proc/acpi/thermal_zone/%s/temperature",
+                      tth->sensor_name);
+             tth->sensor_path = eina_stringshare_add(path);
+             break;
+
+           case SENSOR_TYPE_LINUX_SYS:
+             snprintf(path, sizeof(path),
+                      "/sys/class/thermal/%s/temp", tth->sensor_name);
+             tth->sensor_path = eina_stringshare_add(path);
+             break;
+
+           default:
+             break;
           }
      }
-   return ECORE_CALLBACK_DONE;
 }
 
-Eina_Bool
-_temperature_cb_exe_del(void *data, EINA_UNUSED int type, void *event)
+static int
+check(Tempthread *tth)
 {
-   Ecore_Exe_Event_Del *ev;
-   Config_Face *inst;
-
-   ev = event;
-   inst = data;
-   if ((!inst->tempget_exe) || (ev->exe != inst->tempget_exe)) return 
ECORE_CALLBACK_PASS_ON;
-   inst->tempget_exe = NULL;
-   return ECORE_CALLBACK_DONE;
+   FILE *f = NULL;
+   int ret = 0;
+   int temp = 0;
+   char buf[512];
+#if defined (__FreeBSD__) || defined(__DragonFly__)
+   size_t len;
+   size_t ftemp = 0;
+#endif
+#if defined (__FreeBSD__) || defined(__DragonFly__) || defined (__OpenBSD__)
+   Extn *extn = tth->extn;
+#endif
+
+   /* TODO: Make standard parser. Seems to be two types of temperature string:
+    * - Somename: <temp> C
+    * - <temp>
+    */
+   switch (tth->sensor_type)
+     {
+      case SENSOR_TYPE_NONE:
+        /* TODO: Slow down poller? */
+        break;
+
+      case SENSOR_TYPE_FREEBSD:
+#if defined (__FreeBSD__) || defined(__DragonFly__)
+        len = sizeof(ftemp);
+        if (sysctl(extn->mib, extn->miblen, &ftemp, &len, NULL, 0) == 0)
+          {
+             temp = (ftemp - 2732) / 10;
+             ret = 1;
+          }
+        else
+          goto error;
+#endif
+        break;
+
+      case SENSOR_TYPE_OPENBSD:
+#ifdef __OpenBSD__
+        if (sysctl(extn->mib, 5, &snsr, &slen, NULL, 0) != -1)
+          {
+             temp = (snsr.value - 273150000) / 1000000.0;
+             ret = 1;
+          }
+        else
+          goto error;
+#endif
+        break;
+
+      case SENSOR_TYPE_OMNIBOOK:
+        f = fopen(tth->sensor_path, "r");
+        if (f)
+          {
+             char dummy[4096];
+
+             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
+             fclose(f);
+             f = NULL;
+             if (sscanf(buf, "%s %s %i", dummy, dummy, &temp) == 3)
+               ret = 1;
+             else
+               goto error;
+          }
+        else
+          goto error;
+        break;
+
+      case SENSOR_TYPE_LINUX_MACMINI:
+      case SENSOR_TYPE_LINUX_PBOOK:
+        f = fopen(tth->sensor_path, "rb");
+        if (f)
+          {
+             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
+             fclose(f);
+             f = NULL;
+             if (sscanf(buf, "%i", &temp) == 1)
+               ret = 1;
+             else
+               goto error;
+          }
+        else
+          goto error;
+        break;
+
+      case SENSOR_TYPE_LINUX_INTELCORETEMP:
+      case SENSOR_TYPE_LINUX_I2C:
+      case SENSOR_TYPE_LINUX_THINKPAD:
+        f = fopen(tth->sensor_path, "r");
+        if (f)
+          {
+             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
+             fclose(f);
+             f = NULL;
+             /* actually read the temp */
+             if (sscanf(buf, "%i", &temp) == 1)
+               ret = 1;
+             else
+               goto error;
+             /* Hack for temp */
+             temp = temp / 1000;
+          }
+        else
+          goto error;
+        break;
+
+      case SENSOR_TYPE_LINUX_PCI:
+        f = fopen(tth->sensor_path, "r");
+        if (f)
+          {
+             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
+             fclose(f);
+             f = NULL;
+             /* actually read the temp */
+             if (sscanf(buf, "%i", &temp) == 1)
+               ret = 1;
+             else
+               goto error;
+             /* Hack for temp */
+             temp = temp / 1000;
+          }
+        else
+          goto error;
+        break;
+
+      case SENSOR_TYPE_LINUX_ACPI:
+        f = fopen(tth->sensor_path, "r");
+        if (f)
+          {
+             char *p, *q;
+
+             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
+             fclose(f);
+             f = NULL;
+             p = strchr(buf, ':');
+             if (p)
+               {
+                  p++;
+                  while (*p == ' ')
+                    p++;
+                  q = strchr(p, ' ');
+                  if (q) *q = 0;
+                  temp = atoi(p);
+                  ret = 1;
+               }
+             else
+               goto error;
+          }
+        else
+          goto error;
+        break;
+
+      case SENSOR_TYPE_LINUX_SYS:
+        f = fopen(tth->sensor_path, "r");
+        if (f)
+          {
+             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
+             fclose(f);
+             f = NULL;
+             temp = atoi(buf);
+             temp /= 1000;
+             ret = 1;
+          }
+        else
+          goto error;
+        break;
+
+      default:
+        break;
+     }
+
+   if (ret) return temp;
+
+   return -999;
+error:
+   if (f) fclose(f);
+   tth->sensor_type = SENSOR_TYPE_NONE;
+   eina_stringshare_del(tth->sensor_name);
+   tth->sensor_name = NULL;
+   eina_stringshare_del(tth->sensor_path);
+   tth->sensor_path = NULL;
+   return -999;
+}
+
+int
+temperature_tempget_get(Tempthread *tth)
+{
+   int temp;
+
+   init(tth);
+   temp = check(tth);
+   return temp;
 }
diff --git a/src/modules/temperature/e_mod_udev.c 
b/src/modules/temperature/e_mod_udev.c
index f0fafd0..1dafb31 100644
--- a/src/modules/temperature/e_mod_udev.c
+++ b/src/modules/temperature/e_mod_udev.c
@@ -1,33 +1,26 @@
 #include "e.h"
 #include "e_mod_main.h"
 
-Eina_Bool
-temperature_udev_update_poll(void *data)
+int
+temperature_udev_get(Tempthread *tth)
 {
-   temperature_udev_update(data);
-   return ECORE_CALLBACK_RENEW;
-}
-
-void
-temperature_udev_update(void *data)
-{
-   Config_Face *inst;
    Eina_List *l;
-   double cur, temp, cpus = 0;
+   double cur, temp;
    char *syspath;
    const char *test;
    char buf[256];
-   int x, y;
+   int x, y, cpus = 0;
 
-   inst = data;
    temp = -999;
 
-   if (!inst->tempdevs)
-     inst->tempdevs = 
eeze_udev_find_by_type(EEZE_UDEV_TYPE_IS_IT_HOT_OR_IS_IT_COLD_SENSOR, NULL);
-   if (eina_list_count(inst->tempdevs))
+   if (!tth->tempdevs)
+     tth->tempdevs =
+       eeze_udev_find_by_type(EEZE_UDEV_TYPE_IS_IT_HOT_OR_IS_IT_COLD_SENSOR,
+                              NULL);
+   if (tth->tempdevs)
      {
         temp = 0;
-        EINA_LIST_FOREACH(inst->tempdevs, l, syspath)
+        EINA_LIST_FOREACH(tth->tempdevs, l, syspath)
           {
              for (x = 1, y = 0; x < 15; x++)
                {
@@ -36,50 +29,23 @@ temperature_udev_update(void *data)
                   if ((test = eeze_udev_syspath_get_sysattr(syspath, buf)))
                     {
                        y = 0;
-                       cur = strtod(test, NULL);
+                       cur = atoi(test);
                        if (cur > 0)
                          {
-                            temp += (cur / 1000); /* udev reports temp in 
(celsius * 1000) for some reason */
+                            /* udev reports temp in (celsius * 1000) */
+                            temp += (cur / 1000);
                             cpus++;
                          }
                     }
-                  /* keep checking for temp sensors until we get 2 in a row 
that don't exist */
+                  /* keep checking for sensors until 2 in a row don't exist */
                   else y++;
                }
           }
-        temp /= cpus;
-     }
-   if (temp != -999)
-     {
-        if (inst->units == FAHRENHEIT) 
-          temp = (temp * 9.0 / 5.0) + 32;
-
-        if (!inst->have_temp)
-          {
-             /* enable therm object */
-             edje_object_signal_emit(inst->o_temp, "e,state,known", "");
-             inst->have_temp = EINA_TRUE;
-          }
-
-        if (inst->units == FAHRENHEIT) 
-          snprintf(buf, sizeof(buf), "%3.0f°F", temp);
-        else
-          snprintf(buf, sizeof(buf), "%3.0f°C", temp);  
-
-        _temperature_face_level_set(inst,
-                                    (double)(temp - inst->low) /
-                                    (double)(inst->high - inst->low));
-        edje_object_part_text_set(inst->o_temp, "e.text.reading", buf);
-     }
-   else
-     {
-        if (inst->have_temp)
+        if (cpus > 0)
           {
-             /* disable therm object */
-             edje_object_signal_emit(inst->o_temp, "e,state,unknown", "");
-             edje_object_part_text_set(inst->o_temp, "e.text.reading", "N/A");
-             _temperature_face_level_set(inst, 0.5);
-             inst->have_temp = EINA_FALSE;
+             temp /= (double)cpus;
+             return temp;
           }
      }
+   return -999;
 }
diff --git a/src/modules/temperature/tempget.c 
b/src/modules/temperature/tempget.c
deleted file mode 100644
index c5153b7..0000000
--- a/src/modules/temperature/tempget.c
+++ /dev/null
@@ -1,634 +0,0 @@
-#include "e.h"
-
-#if defined (__FreeBSD__) || defined(__DragonFly__)
-# include <sys/types.h>
-# include <sys/sysctl.h>
-# include <errno.h>
-#endif
-
-#ifdef __OpenBSD__
-#include <sys/param.h>
-#include <sys/sysctl.h>
-#include <sys/sensors.h>
-#include <errno.h>
-#include <err.h>
-#endif
-
-#include "e_mod_main.h"
-
-static int sensor_type = SENSOR_TYPE_NONE;
-static char *sensor_name = NULL;
-static int poll_interval = 32;
-static int cur_poll_interval = 32;
-
-static char *sensor_path = NULL;
-#if defined (__FreeBSD__) || defined(__DragonFly__) || defined (__OpenBSD__)
-static int mib[CTL_MAXNAME];
-#endif
-#if defined (__FreeBSD__) || defined(__DragonFly__)
-static unsigned miblen;
-static const char *sources[] =
-  {
-     "hw.acpi.thermal.tz0.temperature",
-     "dev.cpu.0.temperature",
-     "dev.aibs.0.temp.0",
-     "dev.lm75.0.temperature",
-     NULL
-  };
-#endif
-
-#ifdef __OpenBSD__
-static int dev, numt;
-static struct sensordev snsrdev;
-static size_t sdlen = sizeof(snsrdev);
-static struct sensor snsr;
-static size_t slen = sizeof(snsr);
-#endif
-
-static Ecore_Poller *poller = NULL;
-static int ptemp = 0;
-
-static void      init(void);
-static int       check(void);
-static Eina_Bool poll_cb(void *data);
-
-Eina_List *
-temperature_get_bus_files(const char *bus)
-{
-   Eina_List *result;
-   Eina_List *therms;
-   char path[PATH_MAX];
-   char busdir[PATH_MAX];
-   char *name;
-
-   result = NULL;
-
-   snprintf(busdir, sizeof(busdir), "/sys/bus/%s/devices", bus);
-   /* Look through all the devices for the given bus. */
-   therms = ecore_file_ls(busdir);
-
-   EINA_LIST_FREE(therms, name)
-     {
-        Eina_List *files;
-        char *file;
-
-        /* Search each device for temp*_input, these should be
-         * temperature devices. */
-        snprintf(path, sizeof(path), "%s/%s", busdir, name);
-        files = ecore_file_ls(path);
-        EINA_LIST_FREE(files, file)
-          {
-             if ((!strncmp("temp", file, 4)) &&
-                 (!strcmp("_input", &file[strlen(file) - 6])))
-               {
-                  char *f;
-
-                  snprintf(path, sizeof(path),
-                           "%s/%s/%s", busdir, name, file);
-                  f = strdup(path);
-                  if (f) result = eina_list_append(result, f);
-               }
-             free(file);
-          }
-        free(name);
-     }
-   return result;
-}
-
-static void
-init(void)
-{
-   Eina_List *therms;
-   char path[PATH_MAX];
-#if defined (__FreeBSD__) || defined(__DragonFly__)
-   unsigned i;
-   size_t len;
-   int rc;
-#endif
-
-   if ((!sensor_type) || ((!sensor_name) || (sensor_name[0] == 0)))
-     {
-        E_FREE(sensor_name);
-        E_FREE(sensor_path);
-#if defined (__FreeBSD__) || defined(__DragonFly__)
-        for (i = 0; sources[i]; i++)
-          {
-             rc = sysctlbyname(sources[i], NULL, NULL, NULL, 0);
-             if (rc == 0)
-               {
-                  sensor_type = SENSOR_TYPE_FREEBSD;
-                  sensor_name = strdup(sources[i]);
-                  break;
-               }
-          }
-#elif __OpenBSD__
-        mib[0] = CTL_HW;
-        mib[1] = HW_SENSORS;
-
-        for (dev = 0;; dev++)
-          {
-             mib[2] = dev;
-             if (sysctl(mib, 3, &snsrdev, &sdlen, NULL, 0) == -1)
-               {
-                  if (errno == ENOENT) /* no further sensors */
-                    break;
-                  else
-                    continue;
-               }
-             if (strcmp(snsrdev.xname, "cpu0") == 0)
-               {
-                  sensor_type = SENSOR_TYPE_OPENBSD;
-                  sensor_name = strdup("cpu0");
-                  break;
-               }
-             else if (strcmp(snsrdev.xname, "km0") == 0)
-               {
-                  sensor_type = SENSOR_TYPE_OPENBSD;
-                  sensor_name = strdup("km0");
-                  break;
-               }
-          }
-#else
-        therms = ecore_file_ls("/proc/acpi/thermal_zone");
-        if (therms)
-          {
-             char *name;
-
-             name = eina_list_data_get(therms);
-             sensor_type = SENSOR_TYPE_LINUX_ACPI;
-             sensor_name = strdup(name);
-
-             eina_list_free(therms);
-          }
-        else
-          {
-             eina_list_free(therms);
-             therms = ecore_file_ls("/sys/class/thermal");
-             if (therms)
-               {
-                  char *name;
-                  Eina_List *l;
-
-                  EINA_LIST_FOREACH(therms, l, name)
-                    {
-                       if (!strncmp(name, "thermal", 7))
-                         {
-                            sensor_type = SENSOR_TYPE_LINUX_SYS;
-                            sensor_name = strdup(name);
-                            eina_list_free(therms);
-                            therms = NULL;
-                            break;
-                         }
-                    }
-                  if (therms) eina_list_free(therms);
-               }
-             if (therms)
-               {
-                  if (ecore_file_exists("/proc/omnibook/temperature"))
-                    {
-                       sensor_type = SENSOR_TYPE_OMNIBOOK;
-                       sensor_name = strdup("dummy");
-                    }
-                  else if 
(ecore_file_exists("/sys/devices/temperatures/sensor1_temperature"))
-                    {
-                       sensor_type = SENSOR_TYPE_LINUX_PBOOK;
-                       sensor_name = strdup("dummy");
-                    }
-                  else if 
(ecore_file_exists("/sys/devices/temperatures/cpu_temperature"))
-                    {
-                       sensor_type = SENSOR_TYPE_LINUX_MACMINI;
-                       sensor_name = strdup("dummy");
-                    }
-                  else if 
(ecore_file_exists("/sys/devices/platform/coretemp.0/temp1_input"))
-                    {
-                       sensor_type = SENSOR_TYPE_LINUX_INTELCORETEMP;
-                       sensor_name = strdup("dummy");
-                    }
-                  else if 
(ecore_file_exists("/sys/devices/platform/thinkpad_hwmon/temp1_input"))
-                    {
-                       sensor_type = SENSOR_TYPE_LINUX_THINKPAD;
-                       sensor_name = strdup("dummy");
-                    }
-                  else
-                    {
-                       // try the i2c bus
-                       therms = temperature_get_bus_files("i2c");
-                       if (therms)
-                         {
-                            char *name;
-
-                            if ((name = eina_list_data_get(therms)))
-                              {
-                                 if (ecore_file_exists(name))
-                                   {
-                                      int len;
-
-                                      snprintf(path, sizeof(path),
-                                               "%s", 
ecore_file_file_get(name));
-                                      len = strlen(path);
-                                      if (len > 6) path[len - 6] = '\0';
-                                      sensor_type = SENSOR_TYPE_LINUX_I2C;
-                                      sensor_path = strdup(name);
-                                      sensor_name = strdup(path);
-                                      printf("sensor type = i2c\n"
-                                             "sensor path = %s\n"
-                                             "sensor name = %s\n",
-                                             sensor_path, sensor_name);
-                                   }
-                              }
-                            eina_list_free(therms);
-                         }
-                       if (!sensor_path)
-                         {
-                            // try the pci bus
-                            therms = temperature_get_bus_files("pci");
-                            if (therms)
-                              {
-                                 char *name;
-
-                                 if ((name = eina_list_data_get(therms)))
-                                   {
-                                      if (ecore_file_exists(name))
-                                        {
-                                           int len;
-
-                                           snprintf(path, sizeof(path),
-                                                    "%s", 
ecore_file_file_get(name));
-                                           len = strlen(path);
-                                           if (len > 6) path[len - 6] = '\0';
-                                           sensor_type = SENSOR_TYPE_LINUX_PCI;
-                                           sensor_path = strdup(name);
-                                           free(sensor_name);
-                                           sensor_name = strdup(path);
-                                           printf("sensor type = pci\n"
-                                                  "sensor path = %s\n"
-                                                  "sensor name = %s\n",
-                                                  sensor_path, sensor_name);
-                                        }
-                                   }
-                                 eina_list_free(therms);
-                              }
-                         }
-                    }
-               }
-          }
-#endif
-     }
-   if ((sensor_type) && (sensor_name) && (!sensor_path))
-     {
-        char *name;
-
-        switch (sensor_type)
-          {
-           case SENSOR_TYPE_NONE:
-             break;
-
-           case SENSOR_TYPE_FREEBSD:
-#if defined (__FreeBSD__) || defined(__DragonFly__)
-             len = sizeof(mib) / sizeof(mib[0]);
-             rc = sysctlnametomib(sensor_name, mib, &len);
-             if (rc == 0)
-               {
-                  miblen = len;
-                  sensor_path = strdup(sensor_name);
-               }
-#endif
-             break;
-
-           case SENSOR_TYPE_OPENBSD:
-#ifdef __OpenBSD__
-             for (numt = 0; numt < snsrdev.maxnumt[SENSOR_TEMP]; numt++) {
-                  mib[4] = numt;
-                  slen = sizeof(snsr);
-                  if (sysctl(mib, 5, &snsr, &slen, NULL, 0) == -1)
-                    continue;
-                  if (slen > 0 && (snsr.flags & SENSOR_FINVALID) == 0)
-                    {
-                       break;
-                    }
-               }
-#endif
-
-             break;
-
-           case SENSOR_TYPE_OMNIBOOK:
-             sensor_path = strdup("/proc/omnibook/temperature");
-             break;
-
-           case SENSOR_TYPE_LINUX_MACMINI:
-             sensor_path = strdup("/sys/devices/temperatures/cpu_temperature");
-             break;
-
-           case SENSOR_TYPE_LINUX_PBOOK:
-             sensor_path = 
strdup("/sys/devices/temperatures/sensor1_temperature");
-             break;
-
-           case SENSOR_TYPE_LINUX_INTELCORETEMP:
-             sensor_path = 
strdup("/sys/devices/platform/coretemp.0/temp1_input");
-             break;
-
-           case SENSOR_TYPE_LINUX_THINKPAD:
-             sensor_path = 
strdup("/sys/devices/platform/thinkpad_hwmon/temp1_input");
-             break;
-
-           case SENSOR_TYPE_LINUX_I2C:
-             therms = ecore_file_ls("/sys/bus/i2c/devices");
-
-             EINA_LIST_FREE(therms, name)
-               {
-                  snprintf(path, sizeof(path),
-                           "/sys/bus/i2c/devices/%s/%s_input",
-                           name, sensor_name);
-                  if (ecore_file_exists(path))
-                    {
-                       sensor_path = strdup(path);
-                       /* We really only care about the first
-                        * one for the default. */
-                       break;
-                    }
-                  free(name);
-               }
-             break;
-
-           case SENSOR_TYPE_LINUX_PCI:
-             therms = ecore_file_ls("/sys/bus/pci/devices");
-
-             EINA_LIST_FREE(therms, name)
-               {
-                  snprintf(path, sizeof(path),
-                           "/sys/bus/pci/devices/%s/%s_input",
-                           name, sensor_name);
-                  if (ecore_file_exists(path))
-                    {
-                       sensor_path = strdup(path);
-                       /* We really only care about the first
-                        * one for the default. */
-                       break;
-                    }
-                  free(name);
-               }
-             break;
-
-           case SENSOR_TYPE_LINUX_ACPI:
-             snprintf(path, sizeof(path),
-                      "/proc/acpi/thermal_zone/%s/temperature", sensor_name);
-             sensor_path = strdup(path);
-             break;
-
-           case SENSOR_TYPE_LINUX_SYS:
-             snprintf(path, sizeof(path),
-                      "/sys/class/thermal/%s/temp", sensor_name);
-             sensor_path = strdup(path);
-             break;
-
-           default:
-             break;
-          }
-     }
-}
-
-static int
-check(void)
-{
-   FILE *f = NULL;
-   int ret = 0;
-   int temp = 0;
-   char buf[4096];
-#if defined (__FreeBSD__) || defined(__DragonFly__)
-   size_t len;
-   size_t ftemp = 0;
-#endif
-
-   /* TODO: Make standard parser. Seems to be two types of temperature string:
-    * - Somename: <temp> C
-    * - <temp>
-    */
-   switch (sensor_type)
-     {
-      case SENSOR_TYPE_NONE:
-        /* TODO: Slow down poller? */
-        break;
-
-      case SENSOR_TYPE_FREEBSD:
-#if defined (__FreeBSD__) || defined(__DragonFly__)
-        len = sizeof(ftemp);
-        if (sysctl(mib, miblen, &ftemp, &len, NULL, 0) == 0)
-          {
-             temp = (ftemp - 2732) / 10;
-             ret = 1;
-          }
-        else
-          goto error;
-#endif
-        break;
-
-      case SENSOR_TYPE_OPENBSD:
-#ifdef __OpenBSD__
-        if (sysctl(mib, 5, &snsr, &slen, NULL, 0) != -1)
-          {
-             temp = (snsr.value - 273150000) / 1000000.0;
-             ret = 1;
-          }
-        else
-          goto error;
-#endif
-        break;
-
-      case SENSOR_TYPE_OMNIBOOK:
-        f = fopen(sensor_path, "r");
-        if (f)
-          {
-             char dummy[4096];
-
-             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
-             fclose(f);
-             f = NULL;
-             if (sscanf(buf, "%s %s %i", dummy, dummy, &temp) == 3)
-               ret = 1;
-             else
-               goto error;
-          }
-        else
-          goto error;
-        break;
-
-      case SENSOR_TYPE_LINUX_MACMINI:
-      case SENSOR_TYPE_LINUX_PBOOK:
-        f = fopen(sensor_path, "rb");
-        if (f)
-          {
-             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
-             fclose(f);
-             f = NULL;
-             if (sscanf(buf, "%i", &temp) == 1)
-               ret = 1;
-             else
-               goto error;
-          }
-        else
-          goto error;
-        break;
-
-      case SENSOR_TYPE_LINUX_INTELCORETEMP:
-      case SENSOR_TYPE_LINUX_I2C:
-      case SENSOR_TYPE_LINUX_THINKPAD:
-        f = fopen(sensor_path, "r");
-        if (f)
-          {
-             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
-             fclose(f);
-             f = NULL;
-             /* actually read the temp */
-             if (sscanf(buf, "%i", &temp) == 1)
-               ret = 1;
-             else
-               goto error;
-             /* Hack for temp */
-             temp = temp / 1000;
-          }
-        else
-          goto error;
-        break;
-
-      case SENSOR_TYPE_LINUX_PCI:
-        f = fopen(sensor_path, "r");
-        if (f)
-          {
-             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
-             fclose(f);
-             f = NULL;
-             /* actually read the temp */
-             if (sscanf(buf, "%i", &temp) == 1)
-               ret = 1;
-             else
-               goto error;
-             /* Hack for temp */
-             temp = temp / 1000;
-          }
-        else
-          goto error;
-        break;
-
-      case SENSOR_TYPE_LINUX_ACPI:
-        f = fopen(sensor_path, "r");
-        if (f)
-          {
-             char *p, *q;
-
-             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
-             fclose(f);
-             f = NULL;
-             p = strchr(buf, ':');
-             if (p)
-               {
-                  p++;
-                  while (*p == ' ')
-                    p++;
-                  q = strchr(p, ' ');
-                  if (q) *q = 0;
-                  temp = atoi(p);
-                  ret = 1;
-               }
-             else
-               goto error;
-          }
-        else
-          goto error;
-        break;
-
-      case SENSOR_TYPE_LINUX_SYS:
-        f = fopen(sensor_path, "r");
-        if (f)
-          {
-             if (fgets(buf, sizeof(buf), f) == NULL) goto error;
-             fclose(f);
-             f = NULL;
-             temp = atoi(buf);
-             temp /= 1000;
-             ret = 1;
-          }
-        else
-          goto error;
-        break;
-
-      default:
-        break;
-     }
-
-   if (ret) return temp;
-
-   return -999;
-error:
-   if (f) fclose(f);
-   sensor_type = SENSOR_TYPE_NONE;
-   E_FREE(sensor_name);
-   E_FREE(sensor_path);
-   return -999;
-}
-
-static Eina_Bool
-poll_cb(void *data EINA_UNUSED)
-{
-   int t, pp;
-
-   t = check();
-   pp = cur_poll_interval;
-   if (t != ptemp)
-     {
-        cur_poll_interval /= 2;
-        if (cur_poll_interval < 4) cur_poll_interval = 4;
-     }
-   else
-     {
-        cur_poll_interval *= 2;
-        if (cur_poll_interval > 256) cur_poll_interval = 256;
-     }
-   /* adapt polling based on if temp changes - every time it changes,
-    * halve the time between polls, otherwise double it, between 4 and
-    * 256 ticks */
-   if (pp != cur_poll_interval)
-     {
-        if (poller) ecore_poller_del(poller);
-        poller = ecore_poller_add(ECORE_POLLER_CORE, cur_poll_interval,
-                                  poll_cb, NULL);
-     }
-   if (t != ptemp)
-     {
-        if (t == -999) printf("ERROR\n");
-        else printf("%i\n", t);
-        fflush(stdout);
-     }
-   ptemp = t;
-   return ECORE_CALLBACK_RENEW;
-}
-
-int
-main(int argc, char *argv[])
-{
-   if (argc != 4)
-     {
-        printf("ARGS INCORRECT!\n");
-        return 0;
-     }
-   sensor_type = atoi(argv[1]);
-   sensor_name = strdup(argv[2]);
-   if (!strcmp(sensor_name, "-null-"))
-     E_FREE(sensor_name);
-   poll_interval = atoi(argv[3]);
-   cur_poll_interval = poll_interval;
-
-   ecore_init();
-
-   init();
-
-   if (poller) ecore_poller_del(poller);
-   poller = ecore_poller_add(ECORE_POLLER_CORE, cur_poll_interval,
-                             poll_cb, NULL);
-   poll_cb(NULL);
-
-   ecore_main_loop_begin();
-   ecore_shutdown();
-
-   return 0;
-}
-

-- 


Reply via email to