It looks like this calls eeze (and thus udev) functions in a thread. udev
is not threadsafe, and using eeze's global context in this way will result
in thread collisions.

On Wed, Nov 30, 2016 at 6:50 PM Carsten Haitzler <[email protected]>
wrote:

> 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;
> -
> -
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to