On Fri, 02 Dec 2016 14:23:23 +0000 Mike Blumenkrantz
<michael.blumenkra...@gmail.com> said:

> 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.

i thought all eeze was doing was opening /sys files and reading them...?

> On Wed, Nov 30, 2016 at 6:50 PM Carsten Haitzler <ras...@rasterman.com>
> wrote:
> 
> > raster pushed a commit to branch master.
> >
> >
> > http://git.enlightenment.org/core/enlightenment.git/commit/?id=a94ba7cbfdeb310c32b5d4655631d2612e66fb40
> >
> > commit a94ba7cbfdeb310c32b5d4655631d2612e66fb40
> > Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
> > 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
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
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
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to