[ecore] Put order in header file, splitting function groups in contiguous chunks.
authorglima <glima@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 10 Aug 2011 19:14:48 +0000 (19:14 +0000)
committerglima <glima@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 10 Aug 2011 19:14:48 +0000 (19:14 +0000)
    Sorry for having to pratically rewrite the header, but the other way
    to get docs right would be to put lots of @addtogroup around several
    chunks of the file, which is ugly too and doesn't organize anything.

    I have tested ecore with that and it seems to be okay.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@62307 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

16 files changed:
src/lib/ecore/Ecore.h
src/lib/ecore/ecore.c
src/lib/ecore/ecore_app.c
src/lib/ecore/ecore_events.c
src/lib/ecore/ecore_exe.c
src/lib/ecore/ecore_glib.c
src/lib/ecore/ecore_idle_enterer.c
src/lib/ecore/ecore_idle_exiter.c
src/lib/ecore/ecore_idler.c
src/lib/ecore/ecore_job.c
src/lib/ecore/ecore_main.c
src/lib/ecore/ecore_pipe.c
src/lib/ecore/ecore_poll.c
src/lib/ecore/ecore_throttle.c
src/lib/ecore/ecore_time.c
src/lib/ecore/ecore_timer.c

index 175756a..97b488f 100644 (file)
@@ -19,7 +19,6 @@ Ecore is a library of convenience functions. A brief explanation of how to use
 it can be found in @ref Ecore_Main_Loop_Page.
 
 The Ecore library provides the following modules:
-@li @ref Ecore_Group
 @li @ref Ecore_File_Group
 @li @ref Ecore_Con_Group
 @li @link Ecore_Evas.h   Ecore_Evas - Evas convenience functions. @endlink
@@ -303,25 +302,53 @@ extern "C" {
 #endif
 
   /**
-   * @file Ecore.h
-   * @defgroup Ecore_Group Ecore - Main Loop and Job Functions.
-   * @brief The file that provides the program utility, main loop and timer
-   *        functions.
+   * @defgroup Ecore_Init_Group Ecore initialization and shutdown functions.
    *
-   * This header provides the Ecore event handling loop.  For more
-   * details, see @ref Ecore_Main_Loop_Group.
+   * @{
+   */
+
+   EAPI int  ecore_init(void);
+   EAPI int  ecore_shutdown(void);
+
+  /**
+   * @}
+   */
+
+  /**
+   *
+   * @defgroup Ecore_Main_Loop_Group Ecore main loop functions
    *
-   * For the main loop to be of any use, you need to be able to add events
-   * and event handlers.  Events for file descriptor events are covered in
-   * @ref Ecore_FD_Handler_Group.
+   * These are functions acting on Ecore's main loop itself or on
+   * events and infrastructure directly linked to it. This loop is
+   * designed to work on embedded systems all the way to large and
+   * powerful multi-cpu workstations.
    *
-   * Time functions are covered in @ref Ecore_Time_Group.
+   * It serialises all system signals and events into a single event
+   * queue, that can be easily processed without needing to worry
+   * about concurrency. A properly written, event-driven program
+   * using this kind of programming does not need threads. It makes
+   * the program very robust and easy to follow.
+   *
+   * For example, for the main loop to be of any use, you need to be
+   * able to add @b events and event handlers on it. Events for file
+   * descriptor events are covered in @ref Ecore_FD_Handler_Group.
+   *
+   * Timer functions are covered in @ref Ecore_Time_Group.
    *
    * There is also provision for callbacks for when the loop enters or
-   * exits an idle state. See @ref Ecore_Idle_Group for more information.
+   * exits an @b idle state. See @ref Ecore_Idle_Group for more
+   * information on it.
+   *
+   * Functions are also provided for spawning child processes using
+   * @c fork(). See @ref Ecore_Exe_Group for more details on it.
+   *
+   * Here is an example of simple program and its basic event loop
+   * flow:
    *
-   * Functions are also provided for spawning child processes using fork.
-   * See @ref Ecore_Exe_Group for more details.
+   * @image html prog_flow.png
+   *
+   * For examples of setting up and using a main loop, see
+   * @ref Ecore_Main_Loop_Page.
    *
    * @{
    */
@@ -336,7 +363,7 @@ extern "C" {
         int micro;
         int revision;
      } Ecore_Version;
-   
+
    EAPI extern Ecore_Version *ecore_version;
 
 #define ECORE_CALLBACK_CANCEL EINA_FALSE /**< Return value to remove a callback */
@@ -345,6 +372,97 @@ extern "C" {
 #define ECORE_CALLBACK_PASS_ON EINA_TRUE /**< Return value to pass event to next handler */
 #define ECORE_CALLBACK_DONE EINA_FALSE /**< Return value to stop event handling */
 
+   /**
+    * @typedef Ecore_Task_Cb Ecore_Task_Cb
+    * A callback run for a task (timer, idler, poller, animator, etc)
+    */
+   typedef Eina_Bool (*Ecore_Task_Cb) (void *data);
+
+   /**
+    * @typedef Ecore_Eselect_Function Ecore_Eselect_Function
+    * A function which can be used to replace select() in the main loop
+    */
+   typedef int (*Ecore_Select_Function)(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
+
+   EAPI void              ecore_main_loop_iterate(void);
+
+   EAPI void              ecore_main_loop_select_func_set(Ecore_Select_Function func);
+   EAPI Ecore_Select_Function ecore_main_loop_select_func_get(void);
+
+   EAPI Eina_Bool         ecore_main_loop_glib_integrate(void);
+   EAPI void              ecore_main_loop_glib_always_integrate_disable(void);
+
+   EAPI void              ecore_main_loop_begin(void);
+   EAPI void              ecore_main_loop_quit(void);
+
+   /**
+    * @typedef Ecore_Cb Ecore_Cb
+    * A generic callback called as a hook when a certain point in
+    * execution is reached.
+    */
+   typedef void (*Ecore_Cb) (void *data);
+
+  /**
+   * @brief Call callback in the main loop.
+   *
+   * @param callback The callback to call in the main loop
+   * @param data The data to give to that call back
+   *
+   * For all call that need to happen in the main loop (most EFL functions do),
+   * this helper function provide the infrastructure needed to do it safely
+   * by avoind dead lock, race condition and properly wake up the main loop.
+   *
+   * Remember after that function call, you should never touch again the @p data
+   * in the thread, it is owned by the main loop and you callback should take
+   * care of freeing it if necessary.
+   */
+   EAPI void                 ecore_main_loop_thread_safe_call(Ecore_Cb callback, void *data);
+
+   /**
+    * @}
+    */
+
+   /**
+    * @defgroup Ecore_Event_Group Ecore Event functions
+    *
+    * Ecore events are used to wake up the Ecore main loop to warn
+    * about state changes, tasks completed, data available for reading
+    * or writing, etc. They are the base of the event oriented
+    * programming.
+    *
+    * The idea is to write many functions (callbacks) that will be
+    * registered to specific events, and called when these events
+    * happen. This way, when the system state changes (a mouse click is
+    * detected, a key is pressed, or the content of a file changes, for
+    * example), the respective callbacks will be called with some
+    * information about that event. Usually the function/callback will
+    * have a data pointer to the event info (the position in the screen
+    * where the mouse was clicked, the name of the key that was
+    * pressed, or the name of the file that has changed).
+    *
+    * The basic usage, when one needs to watch for an existing event,
+    * is to register a callback to it using ecore_event_add(). Of
+    * course it's necessary to know beforehand what are the types of
+    * events that the system/library will emmit.  This should be
+    * available with the documentation from that system/library.
+    *
+    * When writing a library or group of functions that need to inform
+    * about something, and you already are running on top of a main
+    * loop, it is usually a good approach to use events. This way you
+    * allow others to register as many callbacks as necessary to this
+    * event, and don't have to care about who is registering to it. The
+    * functions ecore_event_type_new() and ecore_event_add() are
+    * available for this purpose.
+    *
+    * Example that deals with events:
+    *
+    * @li @ref ecore_event_example_c
+    *
+    * @ingroup Ecore_Main_Loop_Group
+    *
+    * @{
+    */
+
 #define ECORE_EVENT_NONE            0
 #define ECORE_EVENT_SIGNAL_USER     1 /**< User signal event */
 #define ECORE_EVENT_SIGNAL_HUP      2 /**< Hup signal event */
@@ -353,177 +471,41 @@ extern "C" {
 #define ECORE_EVENT_SIGNAL_REALTIME 5 /**< Realtime signal event */
 #define ECORE_EVENT_COUNT           6
 
-#define ECORE_EXE_PRIORITY_INHERIT 9999
-   
-   EAPI extern int ECORE_EXE_EVENT_ADD; /**< A child process has been added */
-   EAPI extern int ECORE_EXE_EVENT_DEL; /**< A child process has been deleted (it exited, naming consistent with the rest of ecore). */
-   EAPI extern int ECORE_EXE_EVENT_DATA; /**< Data from a child process. */
-   EAPI extern int ECORE_EXE_EVENT_ERROR; /**< Errors from a child process. */
-
-   enum _Ecore_Fd_Handler_Flags
-     {
-        ECORE_FD_READ = 1, /**< Fd Read mask */
-        ECORE_FD_WRITE = 2, /**< Fd Write mask */
-        ECORE_FD_ERROR = 4 /**< Fd Error mask */
-     };
-   typedef enum _Ecore_Fd_Handler_Flags Ecore_Fd_Handler_Flags;
-
-   enum _Ecore_Exe_Flags /* flags for executing a child with its stdin and/or stdout piped back */
-     {
-        ECORE_EXE_NONE = 0, /**< No exe flags at all */
-        ECORE_EXE_PIPE_READ = 1, /**< Exe Pipe Read mask */
-        ECORE_EXE_PIPE_WRITE = 2, /**< Exe Pipe Write mask */
-        ECORE_EXE_PIPE_ERROR = 4, /**< Exe Pipe error mask */
-        ECORE_EXE_PIPE_READ_LINE_BUFFERED = 8, /**< Reads are buffered until a newline and delivered 1 event per line */
-        ECORE_EXE_PIPE_ERROR_LINE_BUFFERED = 16, /**< Errors are buffered until a newline and delivered 1 event per line */
-        ECORE_EXE_PIPE_AUTO = 32, /**< stdout and stderr are buffered automatically */
-        ECORE_EXE_RESPAWN = 64, /**< FIXME: Exe is restarted if it dies */
-        ECORE_EXE_USE_SH = 128, /**< Use /bin/sh to run the command. */
-        ECORE_EXE_NOT_LEADER = 256 /**< Do not use setsid() to have the executed process be its own session leader */
-     };
-   typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags;
-
-   enum _Ecore_Exe_Win32_Priority
-     {
-       ECORE_EXE_WIN32_PRIORITY_IDLE, /**< Idle priority, for monitoring the system */
-       ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL, /**< Below default priority */
-       ECORE_EXE_WIN32_PRIORITY_NORMAL, /**< Default priority */
-       ECORE_EXE_WIN32_PRIORITY_ABOVE_NORMAL, /**< Above default priority */
-       ECORE_EXE_WIN32_PRIORITY_HIGH, /**< High priority, use with care as other threads in the system will not get processor time */
-       ECORE_EXE_WIN32_PRIORITY_REALTIME /**< Realtime priority, should be almost never used as it can interrupt system threads that manage mouse input, keyboard input, and background disk flushing */
-     };
-   typedef enum _Ecore_Exe_Win32_Priority Ecore_Exe_Win32_Priority;
-
-   enum _Ecore_Poller_Type /* Poller types */
-     {
-        ECORE_POLLER_CORE = 0 /**< The core poller interval */
-     };
-   typedef enum _Ecore_Poller_Type Ecore_Poller_Type;
-   
-   enum _Ecore_Pos_Map /* Position mappings */
-     {
-        ECORE_POS_MAP_LINEAR,     /**< Linear 0.0 -> 1.0 */
-        ECORE_POS_MAP_ACCELERATE, /**< Start slow then speed up */
-        ECORE_POS_MAP_DECELERATE, /**< Start fast then slow down */
-        ECORE_POS_MAP_SINUSOIDAL, /**< Start slow, speed up then slow down at end */
-        ECORE_POS_MAP_ACCELERATE_FACTOR, /**< Start slow then speed up, v1 being a power factor, 0.0 being linear, 1.0 being normal accelerate, 2.0 being much more pronounced accelerate (squared), 3.0 being cubed, etc. */
-        ECORE_POS_MAP_DECELERATE_FACTOR, /**< Start fast then slow down, v1 being a power factor, 0.0 being linear, 1.0 being normal decelerate, 2.0 being much more pronounced decelerate (squared), 3.0 being cubed, etc. */
-        ECORE_POS_MAP_SINUSOIDAL_FACTOR, /**< Start slow, speed up then slow down at end, v1 being a power factor, 0.0 being linear, 1.0 being normal sinusoidal, 2.0 being much more pronounced sinusoidal (squared), 3.0 being cubed, etc. */
-        ECORE_POS_MAP_DIVISOR_INTERP, /**< Start at gradient * v1, interpolated via power of v2 curve */
-        ECORE_POS_MAP_BOUNCE, /**< Start at 0.0 then "drop" like a ball bouncing to the ground at 1.0, and bounce v2 times, with decay factor of v1 */
-        ECORE_POS_MAP_SPRING  /**< Start at 0.0 then "wobble" like a spring rest position 1.0, and wobble v2 times, with decay factor of v1 */
-     };
-   typedef enum _Ecore_Pos_Map Ecore_Pos_Map;
-
-   enum _Ecore_Animator_Source /* Timing sources for animators */
-     {
-        ECORE_ANIMATOR_SOURCE_TIMER, /**< The default system clock/timer based animator that ticks every "frametime" seconds */
-        ECORE_ANIMATOR_SOURCE_CUSTOM /**< A custom animator trigger that you need to call ecore_animator_trigger() to make it tick */
-     };
-   typedef enum _Ecore_Animator_Source Ecore_Animator_Source;
-   
-   typedef struct _Ecore_Exe                   Ecore_Exe; /**< A handle for spawned processes */
-   typedef struct _Ecore_Timer                 Ecore_Timer; /**< A handle for timers */
-   typedef struct _Ecore_Idler                 Ecore_Idler; /**< A handle for idlers */
-   typedef struct _Ecore_Idle_Enterer          Ecore_Idle_Enterer; /**< A handle for idle enterers */
-   typedef struct _Ecore_Idle_Exiter           Ecore_Idle_Exiter; /**< A handle for idle exiters */
-   typedef struct _Ecore_Fd_Handler            Ecore_Fd_Handler; /**< A handle for Fd handlers */
    typedef struct _Ecore_Win32_Handler         Ecore_Win32_Handler; /**< A handle for HANDLE handlers on Windows */
    typedef struct _Ecore_Event_Handler         Ecore_Event_Handler; /**< A handle for an event handler */
    typedef struct _Ecore_Event_Filter          Ecore_Event_Filter; /**< A handle for an event filter */
    typedef struct _Ecore_Event                 Ecore_Event; /**< A handle for an event */
-   typedef struct _Ecore_Animator              Ecore_Animator; /**< A handle for animators */
-   typedef struct _Ecore_Pipe                  Ecore_Pipe; /**< A handle for pipes */
-   typedef struct _Ecore_Poller                Ecore_Poller; /**< A handle for pollers */
    typedef struct _Ecore_Event_Signal_User     Ecore_Event_Signal_User; /**< User signal event */
    typedef struct _Ecore_Event_Signal_Hup      Ecore_Event_Signal_Hup; /**< Hup signal event */
    typedef struct _Ecore_Event_Signal_Exit     Ecore_Event_Signal_Exit; /**< Exit signal event */
    typedef struct _Ecore_Event_Signal_Power    Ecore_Event_Signal_Power; /**< Power signal event */
    typedef struct _Ecore_Event_Signal_Realtime Ecore_Event_Signal_Realtime; /**< Realtime signal event */
-   typedef struct _Ecore_Exe_Event_Add         Ecore_Exe_Event_Add; /**< Spawned Exe add event */
-   typedef struct _Ecore_Exe_Event_Del         Ecore_Exe_Event_Del; /**< Spawned Exe exit event */
-   typedef struct _Ecore_Exe_Event_Data_Line   Ecore_Exe_Event_Data_Line; /**< Lines from a child process */
-   typedef struct _Ecore_Exe_Event_Data        Ecore_Exe_Event_Data; /**< Data from a child process */
-   typedef struct _Ecore_Thread                Ecore_Thread; /**< A handle for threaded jobs */
 
    /**
     * @typedef Ecore_Data_Cb Ecore_Data_Cb
     * A callback which is used to return data to the main function
     */
    typedef void *(*Ecore_Data_Cb) (void *data);
+
    /**
     * @typedef Ecore_Filter_Cb
     * A callback used for filtering events from the main loop.
     */
    typedef Eina_Bool (*Ecore_Filter_Cb) (void *data, void *loop_data, int type, void *event);
-   /**
-    * @typedef Ecore_Eselect_Function Ecore_Eselect_Function
-    * A function which can be used to replace select() in the main loop
-    */
-   typedef int (*Ecore_Select_Function)(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
+
    /**
     * @typedef Ecore_End_Cb Ecore_End_Cb
-    * This is the callback which is called at the end of a function, usually for cleanup purposes.
+    * This is the callback which is called at the end of a function,
+    * usually for cleanup purposes.
     */
    typedef void (*Ecore_End_Cb) (void *user_data, void *func_data);
-   /**
-    * @typedef Ecore_Pipe_Cb Ecore_Pipe_Cb
-    * The callback that data written to the pipe is sent to.
-    */
-   typedef void (*Ecore_Pipe_Cb) (void *data, void *buffer, unsigned int nbyte);
-   /**
-    * @typedef Ecore_Exe_Cb Ecore_Exe_Cb
-    * A callback to run with the associated @ref Ecore_Exe, usually for cleanup purposes.
-    */
-   typedef void (*Ecore_Exe_Cb)(void *data, const Ecore_Exe *exe);
+
    /**
     * @typedef Ecore_Event_Handler_Cb Ecore_Event_Handler_Cb
-    * A callback used by the main loop to handle events of a specified type.
+    * A callback used by the main loop to handle events of a specified
+    * type.
     */
    typedef Eina_Bool (*Ecore_Event_Handler_Cb) (void *data, int type, void *event);
-   /**
-    * @typedef Ecore_Thread_Cb Ecore_Thread_Cb
-    * A callback used by Ecore_Thread helper.
-    */
-  typedef void (*Ecore_Thread_Cb) (void *data, Ecore_Thread *thread);
-   /**
-    * @typedef Ecore_Thread_Notify_Cb Ecore_Thread_Notify_Cb
-    * A callback used by the main loop to receive data sent by an @ref Ecore_Thread_Group.
-    */
-  typedef void (*Ecore_Thread_Notify_Cb) (void *data, Ecore_Thread *thread, void *msg_data);
-   /**
-    * @typedef Ecore_Task_Cb Ecore_Task_Cb
-    * A callback run for a task (timer, idler, poller, animator, etc)
-    */
-   typedef Eina_Bool (*Ecore_Task_Cb) (void *data);
-   /**
-    * @typedef Ecore_Timeline_Cb Ecore_Timeline_Cb
-    * A callback run for a task (animators with runtimes)
-    */
-   typedef Eina_Bool (*Ecore_Timeline_Cb) (void *data, double pos);
-   /**
-    * @typedef Ecore_Cb Ecore_Cb
-    * A generic callback called as a hook when a certain point in execution is reached.
-    */
-   typedef void (*Ecore_Cb) (void *data);
-   /**
-    * @typedef Ecore_Fd_Cb Ecore_Fd_Cb
-    * A callback used by an @ref Ecore_Fd_Handler.
-    */
-   typedef Eina_Bool (*Ecore_Fd_Cb) (void *data, Ecore_Fd_Handler *fd_handler);
-   /**
-    * @typedef Ecore_Fd_Prep_Cb Ecore_Fd_Prep_Cb
-    * A callback used by an @ref Ecore_Fd_Handler.
-    */
-   typedef void (*Ecore_Fd_Prep_Cb) (void *data, Ecore_Fd_Handler *fd_handler);
-   /**
-    * @typedef Ecore_Win32_Handle_Cb Ecore_Win32_Handle_Cb
-    * A callback used by an @ref Ecore_Win32_Handler.
-    */
-   typedef Eina_Bool (*Ecore_Win32_Handle_Cb) (void *data, Ecore_Win32_Handler *wh);
-
-
-   typedef struct _Ecore_Job Ecore_Job; /**< A job handle */
 
    struct _Ecore_Event_Signal_User /** User signal event */
      {
@@ -574,92 +556,112 @@ extern "C" {
 #endif
      };
 
-   struct _Ecore_Exe_Event_Add /** Process add event */
-     {
-        Ecore_Exe *exe; /**< The handle to the added process */
-        void      *ext_data; /**< Extension data - not used */
-     };
-
-   struct _Ecore_Exe_Event_Del /** Process exit event */
-     {
-        pid_t         pid; /**< The process ID of the process that exited */
-        int           exit_code; /**< The exit code of the process */
-        Ecore_Exe    *exe; /**< The handle to the exited process, or NULL if not found */
-        int           exit_signal; /** < The signal that caused the process to exit */
-        Eina_Bool  exited    : 1; /** < set to 1 if the process exited of its own accord */
-        Eina_Bool  signalled : 1; /** < set to 1 id the process exited due to uncaught signal */
-        void         *ext_data; /**< Extension data - not used */
-#ifndef _WIN32
-        siginfo_t     data; /**< Signal info */
-#endif
-     };
+   EAPI Ecore_Event_Handler *ecore_event_handler_add(int type, Ecore_Event_Handler_Cb func, const void *data);
+   EAPI void                *ecore_event_handler_del(Ecore_Event_Handler *event_handler);
+   EAPI Ecore_Event         *ecore_event_add(int type, void *ev, Ecore_End_Cb func_free, void *data);
+   EAPI void                *ecore_event_del(Ecore_Event *event);
+   EAPI void                *ecore_event_handler_data_get(Ecore_Event_Handler *eh);
+   EAPI void                *ecore_event_handler_data_set(Ecore_Event_Handler *eh, const void *data);
+   EAPI int                  ecore_event_type_new(void);
+   EAPI Ecore_Event_Filter  *ecore_event_filter_add(Ecore_Data_Cb func_start, Ecore_Filter_Cb func_filter, Ecore_End_Cb func_end, const void *data);
+   EAPI void                *ecore_event_filter_del(Ecore_Event_Filter *ef);
+   EAPI int                  ecore_event_current_type_get(void);
+   EAPI void                *ecore_event_current_event_get(void);
 
-   struct _Ecore_Exe_Event_Data_Line /**< Lines from a child process */
-      {
-         char *line;
-         int   size;
-      };
+   /**
+    * @}
+    */
 
-   struct _Ecore_Exe_Event_Data /** Data from a child process event */
-     {
-        Ecore_Exe *exe; /**< The handle to the process */
-        void *data; /**< the raw binary data from the child process that was received */
-        int   size; /**< the size of this data in bytes */
-        Ecore_Exe_Event_Data_Line *lines; /**< an array of line data if line buffered, the last one has it's line member set to NULL */
-     };
+    /**
+     * @defgroup Ecore_Exe_Group Process Spawning Functions
+     *
+     * Functions that deal with and send signals to spawned processes.
+     *
+     * @ingroup Ecore_Main_Loop_Group
+     *
+     * @{
+     */
 
-  /**
-   * @defgroup Ecore_Init_Group Ecore initialisation and shutdown functions.
-   */
+ #define ECORE_EXE_PRIORITY_INHERIT 9999
 
-   EAPI int  ecore_init(void);
-   EAPI int  ecore_shutdown(void);
+    EAPI extern int ECORE_EXE_EVENT_ADD; /**< A child process has been added */
+    EAPI extern int ECORE_EXE_EVENT_DEL; /**< A child process has been deleted (it exited, naming consistent with the rest of ecore). */
+   EAPI extern int ECORE_EXE_EVENT_DATA; /**< Data from a child process. */
+   EAPI extern int ECORE_EXE_EVENT_ERROR; /**< Errors from a child process. */
 
-  /**
-   * @}
-   */
+   enum _Ecore_Exe_Flags /* flags for executing a child with its stdin and/or stdout piped back */
+     {
+        ECORE_EXE_NONE = 0, /**< No exe flags at all */
+        ECORE_EXE_PIPE_READ = 1, /**< Exe Pipe Read mask */
+        ECORE_EXE_PIPE_WRITE = 2, /**< Exe Pipe Write mask */
+        ECORE_EXE_PIPE_ERROR = 4, /**< Exe Pipe error mask */
+        ECORE_EXE_PIPE_READ_LINE_BUFFERED = 8, /**< Reads are buffered until a newline and delivered 1 event per line */
+        ECORE_EXE_PIPE_ERROR_LINE_BUFFERED = 16, /**< Errors are buffered until a newline and delivered 1 event per line */
+        ECORE_EXE_PIPE_AUTO = 32, /**< stdout and stderr are buffered automatically */
+        ECORE_EXE_RESPAWN = 64, /**< FIXME: Exe is restarted if it dies */
+        ECORE_EXE_USE_SH = 128, /**< Use /bin/sh to run the command. */
+        ECORE_EXE_NOT_LEADER = 256 /**< Do not use setsid() to have the executed process be its own session leader */
+     };
+   typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags;
 
-  /**
-   * @defgroup Ecore_Application_Group Ecore Application functions
-   *
-   * @{
-   */
+   enum _Ecore_Exe_Win32_Priority
+     {
+       ECORE_EXE_WIN32_PRIORITY_IDLE, /**< Idle priority, for monitoring the system */
+       ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL, /**< Below default priority */
+       ECORE_EXE_WIN32_PRIORITY_NORMAL, /**< Default priority */
+       ECORE_EXE_WIN32_PRIORITY_ABOVE_NORMAL, /**< Above default priority */
+       ECORE_EXE_WIN32_PRIORITY_HIGH, /**< High priority, use with care as other threads in the system will not get processor time */
+       ECORE_EXE_WIN32_PRIORITY_REALTIME /**< Realtime priority, should be almost never used as it can interrupt system threads that manage mouse input, keyboard input, and background disk flushing */
+     };
+   typedef enum _Ecore_Exe_Win32_Priority Ecore_Exe_Win32_Priority;
 
-   EAPI void ecore_app_args_set(int argc, const char **argv);
-   EAPI void ecore_app_args_get(int *argc, char ***argv);
-   EAPI void ecore_app_restart(void);
+   typedef struct _Ecore_Exe                   Ecore_Exe; /**< A handle for spawned processes */
 
-  /**
-   * @}
-   */
+   /**
+    * @typedef Ecore_Exe_Cb Ecore_Exe_Cb
+    * A callback to run with the associated @ref Ecore_Exe, usually
+    * for cleanup purposes.
+    */
+   typedef void (*Ecore_Exe_Cb)(void *data, const Ecore_Exe *exe);
 
-  /**
-   * @defgroup Ecore_Event_Group Ecore Event functions
-   *
-   * @{
-   */
+   typedef struct _Ecore_Exe_Event_Add         Ecore_Exe_Event_Add; /**< Spawned Exe add event */
+   typedef struct _Ecore_Exe_Event_Del         Ecore_Exe_Event_Del; /**< Spawned Exe exit event */
+   typedef struct _Ecore_Exe_Event_Data_Line   Ecore_Exe_Event_Data_Line; /**< Lines from a child process */
+   typedef struct _Ecore_Exe_Event_Data        Ecore_Exe_Event_Data; /**< Data from a child process */
 
-   EAPI Ecore_Event_Handler *ecore_event_handler_add(int type, Ecore_Event_Handler_Cb func, const void *data);
-   EAPI void                *ecore_event_handler_del(Ecore_Event_Handler *event_handler);
-   EAPI Ecore_Event         *ecore_event_add(int type, void *ev, Ecore_End_Cb func_free, void *data);
-   EAPI void                *ecore_event_del(Ecore_Event *event);
-   EAPI void                *ecore_event_handler_data_get(Ecore_Event_Handler *eh);
-   EAPI void                *ecore_event_handler_data_set(Ecore_Event_Handler *eh, const void *data);
-   EAPI int                  ecore_event_type_new(void);
-   EAPI Ecore_Event_Filter  *ecore_event_filter_add(Ecore_Data_Cb func_start, Ecore_Filter_Cb func_filter, Ecore_End_Cb func_end, const void *data);
-   EAPI void                *ecore_event_filter_del(Ecore_Event_Filter *ef);
-   EAPI int                  ecore_event_current_type_get(void);
-   EAPI void                *ecore_event_current_event_get(void);
+   struct _Ecore_Exe_Event_Add /** Process add event */
+     {
+        Ecore_Exe *exe; /**< The handle to the added process */
+        void      *ext_data; /**< Extension data - not used */
+     };
 
-  /**
-   * @}
-   */
+   struct _Ecore_Exe_Event_Del /** Process exit event */
+     {
+        pid_t         pid; /**< The process ID of the process that exited */
+        int           exit_code; /**< The exit code of the process */
+        Ecore_Exe    *exe; /**< The handle to the exited process, or NULL if not found */
+        int           exit_signal; /** < The signal that caused the process to exit */
+        Eina_Bool  exited    : 1; /** < set to 1 if the process exited of its own accord */
+        Eina_Bool  signalled : 1; /** < set to 1 id the process exited due to uncaught signal */
+        void         *ext_data; /**< Extension data - not used */
+#ifndef _WIN32
+        siginfo_t     data; /**< Signal info */
+#endif
+     };
 
-  /**
-   * @defgroup Ecore_Exe_Group Process Spawning Functions
-   *
-   * @{
-   */
+   struct _Ecore_Exe_Event_Data_Line /**< Lines from a child process */
+      {
+         char *line;
+         int   size;
+      };
+
+   struct _Ecore_Exe_Event_Data /** Data from a child process event */
+     {
+        Ecore_Exe *exe; /**< The handle to the process */
+        void *data; /**< the raw binary data from the child process that was received */
+        int   size; /**< the size of this data in bytes */
+        Ecore_Exe_Event_Data_Line *lines; /**< an array of line data if line buffered, the last one has it's line member set to NULL */
+     };
 
    EAPI void        ecore_exe_run_priority_set(int pri);
    EAPI int         ecore_exe_run_priority_get(void);
@@ -688,46 +690,68 @@ extern "C" {
    EAPI void        ecore_exe_signal(Ecore_Exe *exe, int num);
    EAPI void        ecore_exe_hup(Ecore_Exe *exe);
 
-  /**
-   * @}
-   */
-
-  /**
-   * @defgroup Ecore_Idle_Group Ecore Idle functions
-   *
-   * @{
-   */
-
-   EAPI Ecore_Idler *ecore_idler_add(Ecore_Task_Cb func, const void *data);
-   EAPI void        *ecore_idler_del(Ecore_Idler *idler);
+   /**
+    * @}
+    */
 
-   EAPI Ecore_Idle_Enterer *ecore_idle_enterer_add(Ecore_Task_Cb func, const void *data);
-   EAPI Ecore_Idle_Enterer *ecore_idle_enterer_before_add(Ecore_Task_Cb func, const void *data);
-   EAPI void               *ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer);
+   /**
+    * @defgroup Ecore_FD_Handler_Group File Event Handling Functions
+    *
+    * Functions that deal with file descriptor handlers.
+    *
+    * The @ref Ecore_Fd_Handler can be used to watch a file descriptor
+    * for data available for reading, for the availability to write
+    * without blocking, and for errors on the file descriptor.
+    *
+    * ecore_main_fd_handler_add() is used to setup a handler for a
+    * given file descriptor. This file descriptor can be the standard
+    * input, a network socket, a stream received through some driver
+    * of a hardware decoder, etc. Thus it can contain errors, like a
+    * disconnection, a broken pipe, and so, and that's why it's
+    * possible to check for these errors with the @ref ECORE_FD_ERROR
+    * flag.
+    *
+    * An @ref Ecore_Fd_Handler can be used to watch on a file
+    * descriptor without blocking, still being able to receive events,
+    * expire timers, and other watch for other things that happen in
+    * the Ecore main loop.
+    *
+    * Example of use of a file descriptor handler:
+    * @li @ref ecore_fd_handler_example_c
+    *
+    * @ingroup Ecore_Main_Loop_Group
+    *
+    * @{
+    */
 
-   EAPI Ecore_Idle_Exiter *ecore_idle_exiter_add(Ecore_Task_Cb func, const void *data);
-   EAPI void              *ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
+   typedef struct _Ecore_Fd_Handler            Ecore_Fd_Handler; /**< A handle for Fd handlers */
 
-  /**
-   * @}
-   */
+   enum _Ecore_Fd_Handler_Flags
+     {
+        ECORE_FD_READ = 1, /**< Fd Read mask */
+        ECORE_FD_WRITE = 2, /**< Fd Write mask */
+        ECORE_FD_ERROR = 4 /**< Fd Error mask */
+     };
+   typedef enum _Ecore_Fd_Handler_Flags Ecore_Fd_Handler_Flags;
 
-  /**
-   * @defgroup Ecore_Main Loop_Group Ecore Main Loop functions
-   *
-   * @{
-   */
+   /**
+    * @typedef Ecore_Fd_Cb Ecore_Fd_Cb
+    * A callback used by an @ref Ecore_Fd_Handler.
+    */
+   typedef Eina_Bool (*Ecore_Fd_Cb) (void *data, Ecore_Fd_Handler *fd_handler);
 
-   EAPI void              ecore_main_loop_iterate(void);
+   /**
+    * @typedef Ecore_Fd_Prep_Cb Ecore_Fd_Prep_Cb
+    * A callback used by an @ref Ecore_Fd_Handler.
+    */
+   typedef void (*Ecore_Fd_Prep_Cb) (void *data, Ecore_Fd_Handler *fd_handler);
 
-   EAPI void              ecore_main_loop_select_func_set(Ecore_Select_Function func);
-   EAPI Ecore_Select_Function ecore_main_loop_select_func_get(void);
+   /**
+    * @typedef Ecore_Win32_Handle_Cb Ecore_Win32_Handle_Cb
+    * A callback used by an @ref Ecore_Win32_Handler.
+    */
+   typedef Eina_Bool (*Ecore_Win32_Handle_Cb) (void *data, Ecore_Win32_Handler *wh);
 
-   EAPI Eina_Bool         ecore_main_loop_glib_integrate(void);
-   EAPI void              ecore_main_loop_glib_always_integrate_disable(void);
-       
-   EAPI void              ecore_main_loop_begin(void);
-   EAPI void              ecore_main_loop_quit(void);
    EAPI Ecore_Fd_Handler *ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, Ecore_Fd_Cb func, const void *data,
                                                     Ecore_Fd_Cb buf_func, const void *buf_data);
    EAPI void              ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Prep_Cb func, const void *data);
@@ -739,1074 +763,1268 @@ extern "C" {
    EAPI Ecore_Win32_Handler *ecore_main_win32_handler_add(void *h, Ecore_Win32_Handle_Cb func, const void *data);
    EAPI void                *ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler);
 
+   /**
+    * @}
+    */
+
   /**
-   * @brief Call callback in the main loop.
+   * @defgroup Ecore_Poller_Group Ecore Poll functions
    *
-   * @param callback The callback to call in the main loop
-   * @param data The data to give to that call back
+   * These functions are for the need to poll information, but provide
+   * a shared abstracted API to pool such polling to minimise wakeup
+   * and ensure all the polling happens in as few spots as possible
+   * areound a core poll interval.  For now only 1 core poller type is
+   * supprted: ECORE_POLLER_CORE
    *
-   * For all call that need to happen in the main loop (most EFL functions do),
-   * this helper function provide the infrastructure needed to do it safely
-   * by avoind dead lock, race condition and properly wake up the main loop.
+   * Example of @ref Ecore_Poller:
+   * @li @ref ecore_poller_example_c
    *
-   * Remember after that function call, you should never touch again the @p data
-   * in the thread, it is owned by the main loop and you callback should take
-   * care of freeing it if necessary.
+   * @ingroup Ecore_Main_Loop_Group
+   *
+   * @{
    */
-   EAPI void                 ecore_main_loop_thread_safe_call(Ecore_Cb callback, void *data);
+
+   enum _Ecore_Poller_Type /* Poller types */
+     {
+        ECORE_POLLER_CORE = 0 /**< The core poller interval */
+     };
+   typedef enum _Ecore_Poller_Type Ecore_Poller_Type;
+
+   typedef struct _Ecore_Poller                Ecore_Poller; /**< A handle for pollers */
+
+   EAPI void          ecore_poller_poll_interval_set(Ecore_Poller_Type type, double poll_time);
+   EAPI double        ecore_poller_poll_interval_get(Ecore_Poller_Type type);
+   EAPI Eina_Bool     ecore_poller_poller_interval_set(Ecore_Poller *poller, int interval);
+   EAPI int           ecore_poller_poller_interval_get(Ecore_Poller *poller);
+   EAPI Ecore_Poller *ecore_poller_add(Ecore_Poller_Type type, int interval, Ecore_Task_Cb func, const void *data);
+   EAPI void         *ecore_poller_del(Ecore_Poller *poller);
 
   /**
    * @}
    */
 
   /**
-   * @defgroup Ecore_Pipe_Group Pipe wrapper
+   * @defgroup Ecore_Animator_Group Ecore Animator functions
+   *
+   * @brief Ecore animators are a helper to simplify creating
+   * animations.
+   *
+   * Creating an animation is as simple as saying for how long it
+   * should be run and having a callback that does the animation,
+   * something like this:
+   * @code
+   * static Eina_Bool
+   * _do_animation(void *data, double pos)
+   * {
+   *    evas_object_move(data, 100 * pos, 100 * pos);
+   *    ... do some more animating ...
+   * }
+   * ...
+   * ecore_animator_timeline_add(2, _do_animation, my_evas_object);
+   * @endcode
+   * In the sample above we create an animation to move
+   * @c my_evas_object from position (0,0) to (100,100) in 2 seconds.
+   *
+   * If your animation will run for an unspecified amount of time you
+   * can use ecore_animator_add(), which is like using
+   * ecore_timer_add() with the interval being the
+   * @ref ecore_animator_frametime_set "framerate". Note that this has
+   * tangible benefits to creating a timer for each animation in terms
+   * of performance.
+   *
+   * For a more detailed example that show several animation see
+   * @ref tutorial_ecore_animator.
+   *
+   * @ingroup Ecore_Main_Loop_Group
    *
    * @{
    */
 
-   EAPI Ecore_Pipe  *ecore_pipe_add(Ecore_Pipe_Cb handler, const void *data);
-   EAPI void        *ecore_pipe_del(Ecore_Pipe *p);
-   EAPI Eina_Bool    ecore_pipe_write(Ecore_Pipe *p, const void *buffer, unsigned int nbytes);
-   EAPI void         ecore_pipe_write_close(Ecore_Pipe *p);
-   EAPI void         ecore_pipe_read_close(Ecore_Pipe *p);
-   EAPI void         ecore_pipe_thaw(Ecore_Pipe *p);
-   EAPI void         ecore_pipe_freeze(Ecore_Pipe *p);
-   EAPI int          ecore_pipe_wait(Ecore_Pipe *p, int message_count, double wait);
+   typedef struct _Ecore_Animator              Ecore_Animator; /**< A handle for animators */
 
-  /**
-   * @}
-   */
+   enum _Ecore_Pos_Map /* Position mappings */
+     {
+        ECORE_POS_MAP_LINEAR,     /**< Linear 0.0 -> 1.0 */
+        ECORE_POS_MAP_ACCELERATE, /**< Start slow then speed up */
+        ECORE_POS_MAP_DECELERATE, /**< Start fast then slow down */
+        ECORE_POS_MAP_SINUSOIDAL, /**< Start slow, speed up then slow down at end */
+        ECORE_POS_MAP_ACCELERATE_FACTOR, /**< Start slow then speed up, v1 being a power factor, 0.0 being linear, 1.0 being normal accelerate, 2.0 being much more pronounced accelerate (squared), 3.0 being cubed, etc. */
+        ECORE_POS_MAP_DECELERATE_FACTOR, /**< Start fast then slow down, v1 being a power factor, 0.0 being linear, 1.0 being normal decelerate, 2.0 being much more pronounced decelerate (squared), 3.0 being cubed, etc. */
+        ECORE_POS_MAP_SINUSOIDAL_FACTOR, /**< Start slow, speed up then slow down at end, v1 being a power factor, 0.0 being linear, 1.0 being normal sinusoidal, 2.0 being much more pronounced sinusoidal (squared), 3.0 being cubed, etc. */
+        ECORE_POS_MAP_DIVISOR_INTERP, /**< Start at gradient * v1, interpolated via power of v2 curve */
+        ECORE_POS_MAP_BOUNCE, /**< Start at 0.0 then "drop" like a ball bouncing to the ground at 1.0, and bounce v2 times, with decay factor of v1 */
+        ECORE_POS_MAP_SPRING  /**< Start at 0.0 then "wobble" like a spring rest position 1.0, and wobble v2 times, with decay factor of v1 */
+     };
+   typedef enum _Ecore_Pos_Map Ecore_Pos_Map;
+
+   enum _Ecore_Animator_Source /* Timing sources for animators */
+     {
+        ECORE_ANIMATOR_SOURCE_TIMER, /**< The default system clock/timer based animator that ticks every "frametime" seconds */
+        ECORE_ANIMATOR_SOURCE_CUSTOM /**< A custom animator trigger that you need to call ecore_animator_trigger() to make it tick */
+     };
+   typedef enum _Ecore_Animator_Source Ecore_Animator_Source;
+
+   /**
+    * @typedef Ecore_Timeline_Cb Ecore_Timeline_Cb
+    * A callback run for a task (animators with runtimes)
+    */
+   typedef Eina_Bool (*Ecore_Timeline_Cb) (void *data, double pos);
 
   /**
-   * @defgroup Ecore_Thread_Group Ecore Thread functions
+   * @brief Add an animator to call @p func at every animaton tick during main
+   * loop execution.
    *
-   * Facilities to run heavy tasks in different threads to avoid blocking
-   * the main loop.
+   * @param func The function to call when it ticks off
+   * @param data The data to pass to the function
+   * @return A handle to the new animator
    *
-   * The EFL is, for the most part, not thread safe. This means that if you
-   * have some task running in another thread and you have, for example, an
-   * Evas object to show the status progress of this task, you cannot update
-   * the object from within the thread. This can only be done from the main
-   * thread, the one running the main loop. This problem can be solved
-   * by running a thread that sends messages to the main one using an
-   * @ref Ecore_Pipe_Group "Ecore_Pipe", but when you need to handle other
-   * things like cancelling the thread, your code grows in coplexity and gets
-   * much harder to maintain.
-   *
-   * Ecore Thread is here to solve that problem. It is @b not a simple wrapper
-   * around standard POSIX threads (or the equivalent in other systems) and
-   * it's not meant to be used to run parallel tasks throughout the entire
-   * duration of the program, especially when these tasks are performance
-   * critical, as Ecore manages these tasks using a pool of threads based on
-   * system configuration.
-   *
-   * What Ecore Thread does, is make it a lot easier to dispatch a worker
-   * function to perform some heavy task and then get the result once it
-   * completes, without blocking the application's UI. In addition, cancelling
-   * and rescheduling comes practically for free and the developer needs not
-   * worry about how many threads are launched, since Ecore will schedule
-   * them according to the number of processors the system has and maximum
-   * amount of concurrent threads set for the application.
-   *
-   * At the system level, Ecore will start a new thread on an as-needed basis
-   * until the maximum set is reached. When no more threads can be launched,
-   * new worker functions will be queued in a waiting list until a thread
-   * becomes available. This way, system threads will be shared throughout
-   * different worker functions, but running only one at a time. At the same
-   * time, a worker function that is rescheduled may be run on a different
-   * thread the next time.
-   *
-   * The ::Ecore_Thread handler has two meanings, depending on what context
-   * it is on. The one returned when starting a worker with any of the
-   * functions ecore_thread_run() or ecore_thread_feedback_run() is an
-   * identifier of that specific instance of the function and can be used from
-   * the main loop with the ecore_thread_cancel() and ecore_thread_check()
-   * functions. This handler must not be shared with the worker function
-   * function running in the thread. This same handler will be the one received
-   * on the @c end, @c cancel and @c feedback callbacks.
+   * This function adds a animator and returns its handle on success and NULL on
+   * failure. The function @p func will be called every N seconds where N is the
+   * @p frametime interval set by ecore_animator_frametime_set(). The function
+   * will be passed the @p data pointer as its parameter.
    *
-   * The worker function, that's the one running in the thread, also receives
-   * an ::Ecore_Thread handler that can be used with ecore_thread_cancel() and
-   * ecore_thread_check(), sharing the flag with the main loop. But this
-   * handler is also associated with the thread where the function is running.
-   * This has strong implications when working with thread local data.
-
-   * There are two kinds of worker threads Ecore handles: simple, or short,
-   * workers and feedback workers.
+   * When the animator @p func is called, it must return a value of either 1 or
+   * 0. If it returns 1 (or ECORE_CALLBACK_RENEW), it will be called again at
+   * the next tick, or if it returns 0 (or ECORE_CALLBACK_CANCEL) it will be
+   * deleted automatically making any references/handles for it invalid.
    *
-   * The first kind is for simple functions that perform a
-   * usually small but time consuming task. Ecore will run this function in
-   * a thread as soon as one becomes available and notify the calling user of
-   * its completion once the task is done.
+   * @note The default @p frametime value is 1/30th of a second.
    *
-   * The following image shows the flow of a program running four tasks on
-   * a pool of two threads.
+   * @see ecore_animator_timeline_add()
+   * @see ecore_animator_frametime_set()
+   */
+   EAPI Ecore_Animator *ecore_animator_add(Ecore_Task_Cb func, const void *data);
+  /**
+   * @brief Add a animator that runs for a limited time
    *
-   * @image html ecore_thread.png
-   * @image rtf ecore_thread.png
-   * @image latex ecore_thread.eps width=\textwidth
+   * @param runtime The time to run in seconds
+   * @param func The function to call when it ticks off
+   * @param data The data to pass to the function
+   * @return A handle to the new animator
    *
-   * For larger tasks that may require continuous communication with the main
-   * program, the feedback workers provide the same functionality plus a way
-   * for the function running in the thread to send messages to the main
-   * thread.
+   * This function is just like ecore_animator_add() except the animator only
+   * runs for a limited time specified in seconds by @p runtime. Once the
+   * runtime the animator has elapsed (animator finished) it will automatically
+   * be deleted. The callback function @p func can return ECORE_CALLBACK_RENEW
+   * to keep the animator running or ECORE_CALLBACK_CANCEL ro stop it and have
+   * it be deleted automatically at any time.
    *
-   * The next diagram omits some details shown in the previous one regarding
-   * how threads are spawned and tasks are queued, but illustrates how feedback
-   * jobs communicate with the main loop and the special case of threads
-   * running out of pool.
+   * The @p func will ALSO be passed a position parameter that will be in value
+   * from 0.0 to 1.0 to indicate where along the timeline (0.0 start, 1.0 end)
+   * the animator run is at. If the callback wishes not to have a linear
+   * transition it can "map" this value to one of several curves and mappings
+   * via ecore_animator_pos_map().
    *
-   * @image html ecore_thread_feedback.png
-   * @image rtf ecore_thread_feedback.png
-   * @image latex ecore_thread_feedback.eps width=\textwidth
+   * @note The default @p frametime value is 1/30th of a second.
    *
-   * See an overview example in @ref ecore_thread_example_c.
+   * @see ecore_animator_add()
+   * @see ecore_animator_pos_map()
+   * @since 1.1.0
+   */
+   EAPI Ecore_Animator *ecore_animator_timeline_add(double runtime, Ecore_Timeline_Cb func, const void *data);
+  /**
+   * @brief Delete the specified animator from the animator list.
    *
-   * @ingroup Ecore_Group
+   * @param animator The animator to delete
+   * @return The data pointer set for the animator on add
    *
-   * @{
+   * Delete the specified @p animator from the set of animators that are
+   * executed during main loop execution. This function returns the data
+   * parameter that was being passed to the callback on success, or NULL on
+   * failure. After this call returns the specified animator object @p animator
+   * is invalid and should not be used again. It will not get called again after
+   * deletion.
    */
-
+   EAPI void           *ecore_animator_del(Ecore_Animator *animator);
   /**
-   * Schedule a task to run in a parallel thread to avoid locking the main loop
+   * @brief Suspend the specified animator.
    *
-   * @param func_blocking The function that should run in another thread.
-   * @param func_end Function to call from main loop when @p func_blocking
-   * completes its task successfully (may be NULL)
-   * @param func_cancel Function to call from main loop if the thread running
-   * @p func_blocking is cancelled or fails to start (may be NULL)
-   * @param data User context data to pass to all callbacks.
-   * @return A new thread handler, or NULL on failure
+   * @param animator The animator to delete
    *
-   * This function will try to create a new thread to run @p func_blocking in,
-   * or if the maximum number of concurrent threads has been reached, will
-   * add it to the pending list, where it will wait until a thread becomes
-   * available. The return value will be an ::Ecore_Thread handle that can
-   * be used to cancel the thread before its completion.
+   * The specified @p animator will be temporarly removed from the set of
+   * animators that are executed during main loop.
    *
-   * @note This function should always return immediately, but in the rare
-   * case that Ecore is built with no thread support, @p func_blocking will
-   * be called here, actually blocking the main loop.
+   * @warning Freezing an animator doesn't freeze accounting of how long that
+   * animator has been running. Therefore if the animator was created with
+   * ecore_animator_timeline_add() the @p pos argument given to the callback
+   * will increase as if the animator hadn't been frozen and the animator may
+   * have it's execution halted if @p runtime elapsed.
+   */
+   EAPI void            ecore_animator_freeze(Ecore_Animator *animator);
+  /**
+   * @brief Restore execution of the specified animator.
    *
-   * Once a thread becomes available, @p func_blocking will be run in it until
-   * it finishes, then @p func_end is called from the thread containing the
-   * main loop to inform the user of its completion. While in @p func_blocking,
-   * no functions from the EFL can be used, except for those from Eina that are
-   * marked to be thread-safe. Even for the latter, caution needs to be taken
-   * if the data is shared across several threads.
+   * @param animator The animator to delete
    *
-   * @p func_end will be called from the main thread when @p func_blocking ends,
-   * so here it's safe to use anything from the EFL freely.
+   * The specified @p animator will be put back in the set of animators that are
+   * executed during main loop.
+   */
+   EAPI void            ecore_animator_thaw(Ecore_Animator *animator);
+  /**
+   * @brief Set the animator call interval in seconds.
    *
-   * The thread can also be cancelled before its completion calling
-   * ecore_thread_cancel(), either from the main thread or @p func_blocking.
-   * In this case, @p func_cancel will be called, also from the main thread
-   * to inform of this happening. If the thread could not be created, this
-   * function will be called and it's @c thread parameter will be NULL. It's
-   * also safe to call any EFL function here, as it will be running in the
-   * main thread.
+   * @param frametime The time in seconds in between animator ticks.
    *
-   * Inside @p func_blocking, it's possible to call ecore_thread_reschedule()
-   * to tell Ecore that this function should be called again.
+   * This function sets the time interval (in seconds) between animator ticks.
+   * At every tick the callback of every existing animator will be called.
    *
-   * Be aware that no assumptions can be made about the order in which the
-   * @p func_end callbacks for each task will be called. Once the function is
-   * running in a different thread, it's the OS that will handle its running
-   * schedule, and different functions may take longer to finish than others.
-   * Also remember that just starting several tasks together doesn't mean they
-   * will be running at the same time. Ecore will schedule them based on the
-   * number of threads available for the particular system it's running in,
-   * so some of the jobs started may be waiting until another one finishes
-   * before it can execute its own @p func_blocking.
+   * @warning Too small a value may cause performance issues and too high a
+   * value may cause your animation to seem "jerky".
    *
-   * @see ecore_thread_feedback_run()
-   * @see ecore_thread_cancel()
-   * @see ecore_thread_reschedule()
-   * @see ecore_thread_max_set()
+   * @note The default @p frametime value is 1/30th of a second.
    */
-   EAPI Ecore_Thread *ecore_thread_run(Ecore_Thread_Cb func_blocking,
-                                       Ecore_Thread_Cb func_end,
-                                       Ecore_Thread_Cb func_cancel,
-                                       const void *data);
+   EAPI void            ecore_animator_frametime_set(double frametime);
   /**
-   * Launch a thread to run a task than can talk back to the main thread
-   *
-   * @param func_heavy The function that should run in another thread.
-   * @param func_notify Function that receives the data sent from the thread
-   * @param func_end Function to call from main loop when @p func_heavy
-   * completes its task successfully
-   * @param func_cancel Function to call from main loop if the thread running
-   * @p func_heavy is cancelled or fails to start
-   * @param data User context data to pass to all callback.
-   * @param try_no_queue If you want to run outside of the thread pool.
-   * @return A new thread handler, or NULL on failure
-   *
-   * See ecore_thread_run() for a general description of this function.
-   *
-   * The difference with the above is that ecore_thread_run() is meant for
-   * tasks that don't need to communicate anything until they finish, while
-   * this function is provided with a new callback, @p func_notify, that will
-   * be called from the main thread for every message sent from @p func_heavy
-   * with ecore_thread_feedback().
+   * @brief Get the animator call interval in seconds.
    *
-   * Like with ecore_thread_run(), a new thread will be launched to run
-   * @p func_heavy unless the maximum number of simultaneous threadas has been
-   * reached, in which case the function will be scheduled to run whenever a
-   * running task ends and a thread becomes free. But if @p try_no_queue is
-   * set, Ecore will first try to launch a thread outside of the pool to run
-   * the task. If it fails, it will revert to the normal behaviour of using a
-   * thread from the pool as if @p try_no_queue had not been set.
+   * @return The time in second in between animator ticks.
    *
-   * Keep in mind that Ecore handles the thread pool based on the number of
-   * CPUs available, but running a thread outside of the pool doesn't count for
-   * this, so having too many of them may have drastic effects over the
-   * program's performance.
+   * This function retrieves the time in seconds between animator ticks.
    *
-   * @see ecore_thread_feedback()
-   * @see ecore_thread_run()
-   * @see ecore_thread_cancel()
-   * @see ecore_thread_reschedule()
-   * @see ecore_thread_max_set()
+   * @see ecore_animator_frametime_set()
    */
-   EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Cb func_heavy,
-                                                Ecore_Thread_Notify_Cb func_notify,
-                                                Ecore_Thread_Cb func_end,
-                                                Ecore_Thread_Cb func_cancel,
-                                                const void *data,
-                                                Eina_Bool try_no_queue);
+   EAPI double          ecore_animator_frametime_get(void);
   /**
-   * Cancel a running thread.
+   * @brief Maps an input position from 0.0 to 1.0 along a timeline to a
+   * position in a different curve.
    *
-   * @param thread The thread to cancel.
-   * @return Will return EINA_TRUE if the thread has been cancelled,
-   *         EINA_FALSE if it is pending.
+   * @param pos The input position to map
+   * @param map The mapping to use
+   * @param v1 A parameter use by the mapping (pass 0.0 if not used)
+   * @param v2 A parameter use by the mapping (pass 0.0 if not used)
+   * @return The mapped value
    *
-   * This function can be called both in the main loop or in the running thread.
+   * Takes an input position (0.0 to 1.0) and maps to a new position (normally
+   * between 0.0 and 1.0, but it may go above/below 0.0 or 1.0 to show that it
+   * has "overshot" the mark) using some interpolation (mapping) algorithm.
    *
-   * This function cancels a running thread. If @p thread can be immediately
-   * cancelled (it's still pending execution after creation or rescheduling),
-   * then the @c cancel callback will be called, @p thread will be freed and
-   * the function will return EINA_TRUE.
+   * This function useful to create non-linear animations. It offers a variety
+   * of possible animaton curves to be used:
+   * @li ECORE_POS_MAP_LINEAR - Linear, returns @p pos
+   * @li ECORE_POS_MAP_ACCELERATE - Start slow then speed up
+   * @li ECORE_POS_MAP_DECELERATE - Start fast then slow down
+   * @li ECORE_POS_MAP_SINUSOIDAL - Start slow, speed up then slow down at end
+   * @li ECORE_POS_MAP_ACCELERATE_FACTOR - Start slow then speed up, v1 being a
+   * power factor, 0.0 being linear, 1.0 being ECORE_POS_MAP_ACCELERATE, 2.0
+   * being much more pronounced accelerate (squared), 3.0 being cubed, etc.
+   * @li ECORE_POS_MAP_DECELERATE_FACTOR - Start fast then slow down, v1 being a
+   * power factor, 0.0 being linear, 1.0 being ECORE_POS_MAP_DECELERATE, 2.0
+   * being much more pronounced decelerate (squared), 3.0 being cubed, etc.
+   * @li ECORE_POS_MAP_SINUSOIDAL_FACTOR - Start slow, speed up then slow down
+   * at end, v1 being a power factor, 0.0 being linear, 1.0 being
+   * ECORE_POS_MAP_SINUSOIDAL, 2.0 being much more pronounced sinusoidal
+   * (squared), 3.0 being cubed, etc.
+   * @li ECORE_POS_MAP_DIVISOR_INTERP - Start at gradient * v1, interpolated via
+   * power of v2 curve
+   * @li ECORE_POS_MAP_BOUNCE - Start at 0.0 then "drop" like a ball bouncing to
+   * the ground at 1.0, and bounce v2 times, with decay factor of v1
+   * @li ECORE_POS_MAP_SPRING - Start at 0.0 then "wobble" like a spring rest
+   * position 1.0, and wobble v2 times, with decay factor of v1
+   * @note When not listed v1 and v2 have no effect.
    *
-   * If the thread is already running, then this function returns EINA_FALSE
-   * after marking the @p thread as pending cancellation. For the thread to
-   * actually be terminated, it needs to return from the user function back
-   * into Ecore control. This can happen in several ways:
-   * @li The function ends and returns normally. If it hadn't been cancelled,
-   * @c func_end would be called here, but instead @c func_cancel will happen.
-   * @li The function returns after requesting to be rescheduled with
-   * ecore_thread_reschedule().
-   * @li The function is prepared to leave early by checking if
-   * ecore_thread_check() returns EINA_TRUE.
+   * @image html ecore-pos-map.png
+   * @image latex ecore-pos-map.eps width=\textwidth
    *
-   * The user function can cancel itself by calling ecore_thread_cancel(), but
-   * it should always use the ::Ecore_Thread handle passed to it and never
-   * share it with the main loop thread by means of shared user data or any
-   * other way.
+   * One way to use this would be:
+   * @code
+   * double pos; // input position in a timeline from 0.0 to 1.0
+   * double out; // output position after mapping
+   * int x1, y1, x2, y2; // x1 & y1 are start position, x2 & y2 are end position
+   * int x, y; // x & y are the calculated position
    *
-   * @p thread will be freed and should not be used again if this function
-   * returns EINA_TRUE or after the @c func_cancel callback returns.
+   * out = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 1.8, 7);
+   * x = (x1 * out) + (x2 * (1.0 - out));
+   * y = (y1 * out) + (y2 * (1.0 - out));
+   * move_my_object_to(myobject, x, y);
+   * @endcode
+   * This will make an animaton that bounces 7 each times diminishing by a
+   * factor of 1.8.
    *
-   * @see ecore_thread_check()
+   * @see _Ecore_Pos_Map
+   *
+   * @since 1.1.0
    */
-   EAPI Eina_Bool     ecore_thread_cancel(Ecore_Thread *thread);
+   EAPI double          ecore_animator_pos_map(double pos, Ecore_Pos_Map map, double v1, double v2);
   /**
-   * Checks if a thread is pending cancellation
-   *
-   * @param thread The thread to test.
-   * @return EINA_TRUE if the thread is pending cancellation,
-   *         EINA_FALSE if it is not.
-   *
-   * This function can be called both in the main loop or in the running thread.
+   * @brief Set the source of animator ticks for the mainloop
    *
-   * When ecore_thread_cancel() is called on an already running task, the
-   * thread is marked as pending cancellation. This function returns EINA_TRUE
-   * if this mark is set for the given @p thread and can be used from the
-   * main loop thread to check if a still active thread has been cancelled,
-   * or from the user function running in the thread to check if it should
-   * stop doing what it's doing and return early, effectively cancelling the
-   * task.
+   * @param source The source of animator ticks to use
    *
-   * @see ecore_thread_cancel()
+   * This sets the source of animator ticks. When an animator is active the
+   * mainloop will "tick" over frame by frame calling all animators that are
+   * registered until none are. The mainloop will tick at a given rate based
+   * on the animator source. The default source is the system clock timer
+   * source - ECORE_ANIMATOR_SOURCE_TIMER. This source uses the system clock
+   * to tick over every N seconds (specified by ecore_animator_frametime_set(),
+   * with the default being 1/30th of a second unless set otherwise). You can
+   * set a custom tick source by setting the source to
+   * ECORE_ANIMATOR_SOURCE_CUSTOM and then drive it yourself based on some input
+   * tick source (like another application via ipc, some vertical blanking
+   * interrupt interrupt etc.) using
+   * ecore_animator_custom_source_tick_begin_callback_set() and
+   * ecore_animator_custom_source_tick_end_callback_set() to set the functions
+   * that will be called to start and stop the ticking source, which when it
+   * gets a "tick" should call ecore_animator_custom_tick() to make the "tick" over 1
+   * frame.
    */
-   EAPI Eina_Bool     ecore_thread_check(Ecore_Thread *thread);
+   EAPI void            ecore_animator_source_set(Ecore_Animator_Source source);
   /**
-   * Sends data from the worker thread to the main loop
-   *
-   * @param thread The current ::Ecore_Thread context to send data from
-   * @param msg_data Data to be transmitted to the main loop
-   * @return EINA_TRUE if @p msg_data was successfully sent to main loop,
-   *         EINA_FALSE if anything goes wrong.
-   *
-   * You should use this function only in the @c func_heavy call.
+   * @brief Get the animator source currently set.
    *
-   * Only the address to @p msg_data will be sent and once this function
-   * returns EINA_TRUE, the job running in the thread should never touch the
-   * contents of it again. The data sent should be malloc()'ed or something
-   * similar, as long as it's not memory local to the thread that risks being
-   * overwritten or deleted once it goes out of scope or the thread finishes.
+   * @return The current animator source
    *
-   * Care must be taken that @p msg_data is properly freed in the @c func_notify
-   * callback set when creating the thread.
+   * This gets the current animator source.
    *
-   * @see ecore_thread_feedback_run()
+   * @see ecore_animator_source_set()
    */
-   EAPI Eina_Bool     ecore_thread_feedback(Ecore_Thread *thread, const void *msg_data);
+   EAPI Ecore_Animator_Source ecore_animator_source_get(void);
   /**
-   * Asks for the function in the thread to be called again at a later time
-   *
-   * @param thread The current ::Ecore_Thread context to rescheduled
-   * @return EINA_TRUE if the task was successfully rescheduled,
-   *         EINA_FALSE if anything goes wrong.
-   *
-   * This function should be called only from the same function represented
-   * by @pthread.
+   * @brief Set the function that begins a custom animator tick source
    *
-   * Calling this function will mark the thread for a reschedule, so as soon
-   * as it returns, it will be added to the end of the list of pending tasks.
-   * If no other tasks are waiting or there are sufficient threads available,
-   * the rescheduled task will be launched again immediately.
+   * @param func The function to call when ticking is to begin
+   * @param data The data passed to the tick begin function as its parameter
    *
-   * This should never return EINA_FALSE, unless it was called from the wrong
-   * thread or with the wrong arguments.
+   * The Ecore Animator infrastructure handles tracking if animators are needed
+   * or not and which ones need to be called and when, but when the tick source
+   * is custom, you have to provide a tick source by calling
+   * ecore_animator_custom_tick() to indicate a frame tick happened. In order
+   * to allow the source of ticks to be dynamically enabled or disabled as
+   * needed, the @p func when set is called to enable the tick source to
+   * produce tick events that call ecore_animator_custom_tick(). If @p func
+   * is NULL then no function is called to begin custom ticking.
    *
-   * The @c func_end callback set when the thread is created will not be
-   * called until the function in the thread returns without being rescheduled.
-   * Similarly, if the @p thread is cancelled, the reschedule will not take
-   * effect.
+   * @see ecore_animator_source_set()
+   * @see ecore_animator_custom_source_tick_end_callback_set()
+   * @see ecore_animator_custom_tick()
    */
-   EAPI Eina_Bool     ecore_thread_reschedule(Ecore_Thread *thread);
+   EAPI void            ecore_animator_custom_source_tick_begin_callback_set(Ecore_Cb func, const void *data);
   /**
-   * Gets the number of active threads running jobs
+   * @brief Set the function that ends a custom animator tick source
    *
-   * @return Number of active threads running jobs
+   * @param func The function to call when ticking is to end
+   * @param data The data passed to the tick end function as its parameter
    *
-   * This returns the number of threads currently running jobs of any type
-   * through the Ecore_Thread API.
+   * This function is a matching pair to the function set by
+   * ecore_animator_custom_source_tick_begin_callback_set() and is called
+   * when ticking is to stop. If @p func is NULL then no function will be
+   * called to stop ticking. For more information please see
+   * ecore_animator_custom_source_tick_begin_callback_set().
    *
-   * @note Jobs started through the ecore_thread_feedback_run() function with
-   * the @c try_no_queue parameter set to EINA_TRUE will not be accounted for
-   * in the return of this function unless the thread creation fails and it
-   * falls back to using one from the pool.
+   * @see ecore_animator_source_set()
+   * @see ecore_animator_custom_source_tick_begin_callback_set()
+   * @see ecore_animator_custom_tick()
    */
-   EAPI int           ecore_thread_active_get(void);
+   EAPI void            ecore_animator_custom_source_tick_end_callback_set(Ecore_Cb func, const void *data);
   /**
-   * Gets the number of short jobs waiting for a thread to run
+   * @brief Trigger a custom animator tick
    *
-   * @return Number of pending threads running "short" jobs
+   * When animator source is set to ECORE_ANIMATOR_SOURCE_CUSTOM, then calling
+   * this function triggers a run of all animators currently registered with
+   * Ecore as this indicates a "frame tick" happened. This will do nothing if
+   * the animator source(set by ecore_animator_source_set()) is not set to
+   * ECORE_ANIMATOR_SOURCE_CUSTOM.
    *
-   * This returns the number of tasks started with ecore_thread_run() that are
-   * pending, waiting for a thread to become available to run them.
+   * @see ecore_animator_source_set()
+   * @see ecore_animator_custom_source_tick_begin_callback_set
+   * @see ecore_animator_custom_source_tick_end_callback_set()()
    */
-   EAPI int           ecore_thread_pending_get(void);
+   EAPI void            ecore_animator_custom_tick(void);
+
   /**
-   * Gets the number of feedback jobs waiting for a thread to run
-   *
-   * @return Number of pending threads running "feedback" jobs
-   *
-   * This returns the number of tasks started with ecore_thread_feedback_run()
-   * that are pending, waiting for a thread to become available to run them.
+   * @}
    */
-   EAPI int           ecore_thread_pending_feedback_get(void);
+
+   /**
+    * @defgroup Ecore_Time_Group Ecore Time functions
+    *
+    * Functions that deal with time. These functions include those
+    * that simply retrieve it in a given format, and those that create
+    * events based on it.
+    *
+    * The timer allows callbacks to be called at specific intervals.
+    *
+    * Examples with functions that deal with time:
+    * @li @ref ecore_time_functions_example_c
+    * @li @ref ecore_timer_example_c
+    *
+    * @ingroup Ecore_Main_Loop_Group
+    *
+    * @{
+    */
+
+   typedef struct _Ecore_Timer                 Ecore_Timer; /**< A handle for timers */
+
+   EAPI double ecore_time_get(void);
+   EAPI double ecore_time_unix_get(void);
+   EAPI double ecore_loop_time_get(void);
+
+   EAPI Ecore_Timer *ecore_timer_add(double in, Ecore_Task_Cb func, const void *data);
+   EAPI Ecore_Timer *ecore_timer_loop_add(double in, Ecore_Task_Cb func, const void *data);
+   EAPI void        *ecore_timer_del(Ecore_Timer *timer);
+   EAPI void         ecore_timer_interval_set(Ecore_Timer *timer, double in);
+   EAPI double       ecore_timer_interval_get(Ecore_Timer *timer);
+   EAPI void         ecore_timer_freeze(Ecore_Timer *timer);
+   EAPI void         ecore_timer_thaw(Ecore_Timer *timer);
+   EAPI void         ecore_timer_delay(Ecore_Timer *timer, double add);
+   EAPI double       ecore_timer_pending_get(Ecore_Timer *timer);
+   EAPI double       ecore_timer_precision_get(void);
+   EAPI void         ecore_timer_precision_set(double precision);
+   EAPI char        *ecore_timer_dump(void);
+
   /**
-   * Gets the total number of pending jobs
-   *
-   * @return Number of pending threads running jobs
-   *
-   * Same as the sum of ecore_thread_pending_get() and
-   * ecore_thread_pending_feedback_get().
+   * @}
    */
-   EAPI int           ecore_thread_pending_total_get(void);
+
+   /**
+    * @defgroup Ecore_Idle_Group Ecore Idle functions
+    *
+    * Callbacks that are called when the program enters or exits an
+    * idle state.
+    *
+    * The ecore main loop enters an idle state when it is waiting for
+    * timers to time out, data to come in on a file descriptor or any
+    * other event to occur.  You can set callbacks to be called when
+    * the main loop enters an idle state, during an idle state or just
+    * after the program wakes up.
+    *
+    * Enterer callbacks are good for updating your program's state, if
+    * it has a state engine.  Once all of the enterer handlers are
+    * called, the program will enter a "sleeping" state.
+    *
+    * Idler callbacks are called when the main loop has called all
+    * enterer handlers.  They are useful for interfaces that require
+    * polling and timers would be too slow to use.
+    *
+    * If no idler callbacks are specified, then the process literally
+    * goes to sleep.  Otherwise, the idler callbacks are called
+    * continuously while the loop is "idle", using as much CPU as is
+    * available to the process.
+    *
+    * Exiter callbacks are called when the main loop wakes up from an
+    * idle state.
+    *
+    * @note Idle state doesn't mean that the @b program is idle, but
+    * that the <b>main loop</b> is idle. It doesn't have any timers,
+    * events, fd handlers or anything else to process (which in most
+    * <em>event driven</em> programs also means that the @b program is
+    * idle too, but it's not a rule). The program itself may be doing
+    * a lot of processing in the idler, or in another thread, for
+    * example.
+    *
+    * Example with functions that deal with idle state:
+    *
+    * @li @ref ecore_idler_example_c
+    *
+    * @ingroup Ecore_Main_Loop_Group
+    *
+    * @{
+    */
+
+   typedef struct _Ecore_Idler                 Ecore_Idler; /**< A handle for idlers */
+   typedef struct _Ecore_Idle_Enterer          Ecore_Idle_Enterer; /**< A handle for idle enterers */
+   typedef struct _Ecore_Idle_Exiter           Ecore_Idle_Exiter; /**< A handle for idle exiters */
+
+   /**
+    * Add an idler handler.
+    * @param  func The function to call when idling.
+    * @param  data The data to be passed to this @p func call.
+    * @return A idler handle if successfully added.  NULL otherwise.
+    *
+    * Add an idler handle to the event loop, returning a handle on
+    * success and NULL otherwise.  The function @p func will be called
+    * repeatedly while no other events are ready to be processed, as
+    * long as it returns 1 (or ECORE_CALLBACK_RENEW). A return of 0
+    * (or ECORE_CALLBACK_CANCEL) deletes the idler.
+    *
+    * Idlers are useful for progressively prossessing data without blocking.
+    */
+   EAPI Ecore_Idler *ecore_idler_add(Ecore_Task_Cb func, const void *data);
+
+   /**
+    * Delete an idler callback from the list to be executed.
+    * @param  idler The handle of the idler callback to delete
+    * @return The data pointer passed to the idler callback on success.  NULL
+    *         otherwise.
+    */
+   EAPI void        *ecore_idler_del(Ecore_Idler *idler);
+
+   EAPI Ecore_Idle_Enterer *ecore_idle_enterer_add(Ecore_Task_Cb func, const void *data);
+   EAPI Ecore_Idle_Enterer *ecore_idle_enterer_before_add(Ecore_Task_Cb func, const void *data);
+   EAPI void               *ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer);
+
+   EAPI Ecore_Idle_Exiter *ecore_idle_exiter_add(Ecore_Task_Cb func, const void *data);
+   EAPI void              *ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
+
   /**
-   * Gets the maximum number of threads that can run simultaneously
-   *
-   * @return Max possible number of Ecore_Thread's running concurrently
-   *
-   * This returns the maximum number of Ecore_Thread's that may be running at
-   * the same time. If this number is reached, new jobs started by either
-   * ecore_thread_run() or ecore_thread_feedback_run() will be added to the
-   * respective pending queue until one of the running threads finishes its
-   * task and becomes available to run a new one.
-   *
-   * By default, this will be the number of available CPUs for the
-   * running program (as returned by eina_cpu_count()), or 1 if this value
-   * could not be fetched.
-   *
-   * @see ecore_thread_max_set()
-   * @see ecore_thread_max_reset()
-   */
-   EAPI int           ecore_thread_max_get(void);
-  /**
-   * Sets the maximum number of threads allowed to run simultaneously
-   *
-   * @param num The new maximum
-   *
-   * This sets a new value for the maximum number of concurrently running
-   * Ecore_Thread's. It @b must an integer between 1 and (2 * @c x), where @c x
-   * is the number for CPUs available.
-   *
-   * @see ecore_thread_max_get()
-   * @see ecore_thread_max_reset()
-   */
-   EAPI void          ecore_thread_max_set(int num);
-  /**
-   * Resets the maximum number of concurrently running threads to the default
-   *
-   * This resets the value returned by ecore_thread_max_get() back to its
-   * default.
-   *
-   * @see ecore_thread_max_get()
-   * @see ecore_thread_max_set()
-   */
-   EAPI void          ecore_thread_max_reset(void);
-  /**
-   * Gets the number of threads available for running tasks
-   *
-   * @return The number of available threads
-   *
-   * Same as doing ecore_thread_max_get() - ecore_thread_active_get().
-   *
-   * This function may return a negative number only in the case the user
-   * changed the maximum number of running threads while other tasks are
-   * running.
+   * @}
    */
-   EAPI int           ecore_thread_available_get(void);
+
   /**
-   * Adds some data to a hash local to the thread
+   * @defgroup Ecore_Thread_Group Ecore Thread functions
    *
-   * @param thread The thread context the data belongs to
-   * @param key The name under which the data will be stored
-   * @param value The data to add
-   * @param cb Function to free the data when removed from the hash
-   * @param direct If true, this will not copy the key string (like
-   * eina_hash_direct_add())
-   * @return EINA_TRUE on success, EINA_FALSE on failure
+   * Facilities to run heavy tasks in different threads to avoid blocking
+   * the main loop.
    *
-   * Ecore Thread has a mechanism to share data across several worker functions
-   * that run on the same system thread. That is, the data is stored per
-   * thread and for a worker function to have access to it, it must be run
-   * by the same thread that stored the data.
+   * The EFL is, for the most part, not thread safe. This means that if you
+   * have some task running in another thread and you have, for example, an
+   * Evas object to show the status progress of this task, you cannot update
+   * the object from within the thread. This can only be done from the main
+   * thread, the one running the main loop. This problem can be solved
+   * by running a thread that sends messages to the main one using an
+   * @ref Ecore_Pipe_Group "Ecore_Pipe", but when you need to handle other
+   * things like cancelling the thread, your code grows in coplexity and gets
+   * much harder to maintain.
    *
-   * When there are no more workers pending, the thread will be destroyed
-   * along with the internal hash and any data left in it will be freed with
-   * the @p cb function given.
+   * Ecore Thread is here to solve that problem. It is @b not a simple wrapper
+   * around standard POSIX threads (or the equivalent in other systems) and
+   * it's not meant to be used to run parallel tasks throughout the entire
+   * duration of the program, especially when these tasks are performance
+   * critical, as Ecore manages these tasks using a pool of threads based on
+   * system configuration.
    *
-   * This set of functions is useful to share things around several instances
-   * of a function when that thing is costly to create and can be reused, but
-   * may only be used by one function at a time.
+   * What Ecore Thread does, is make it a lot easier to dispatch a worker
+   * function to perform some heavy task and then get the result once it
+   * completes, without blocking the application's UI. In addition, cancelling
+   * and rescheduling comes practically for free and the developer needs not
+   * worry about how many threads are launched, since Ecore will schedule
+   * them according to the number of processors the system has and maximum
+   * amount of concurrent threads set for the application.
    *
-   * For example, if you have a program doing requisitions to a database,
-   * these requisitions can be done in threads so that waiting for the
-   * database to respond doesn't block the UI. Each of these threads will
-   * run a function, and each function will be dependent on a connection to
-   * the database, which may not be able to handle more than one request at
-   * a time so for each running function you will need one connection handle.
-   * The options then are:
-   * @li Each function opens a connection when it's called, does the work and
-   * closes the connection when it finishes. This may be costly, wasting a lot
-   * of time on resolving hostnames, negotiating permissions and allocating
-   * memory.
-   * @li Open the connections in the main loop and pass it to the threads
-   * using the data pointer. Even worse, it's just as costly as before and now
-   * it may even be kept with connections open doing nothing until a thread
-   * becomes available to run the function.
-   * @li Have a way to share connection handles, so that each instance of the
-   * function can check if an available connection exists, and if it doesn't,
-   * create one and add it to the pool. When no more connections are needed,
-   * they are all closed.
+   * At the system level, Ecore will start a new thread on an as-needed basis
+   * until the maximum set is reached. When no more threads can be launched,
+   * new worker functions will be queued in a waiting list until a thread
+   * becomes available. This way, system threads will be shared throughout
+   * different worker functions, but running only one at a time. At the same
+   * time, a worker function that is rescheduled may be run on a different
+   * thread the next time.
    *
-   * The last option is the most efficient, but it requires a lot of work to
-   * implement properly. Using thread local data helps to achieve the same
-   * result while avoiding doing all the tracking work on your code. The way
-   * to use it would be, at the worker function, to ask for the connection
-   * with ecore_thread_local_data_find() and if it doesn't exist, then open
-   * a new one and save it with ecore_thread_local_data_add(). Do the work and
-   * forget about the connection handle, when everything is done the function
-   * just ends. The next worker to run on that thread will check if a
-   * connection exists and find that it does, so the process of opening a
-   * new one has been spared. When no more workers exist, the thread is
-   * destroyed and the callback used when saving the connection will be called
-   * to close it.
+   * The ::Ecore_Thread handler has two meanings, depending on what context
+   * it is on. The one returned when starting a worker with any of the
+   * functions ecore_thread_run() or ecore_thread_feedback_run() is an
+   * identifier of that specific instance of the function and can be used from
+   * the main loop with the ecore_thread_cancel() and ecore_thread_check()
+   * functions. This handler must not be shared with the worker function
+   * function running in the thread. This same handler will be the one received
+   * on the @c end, @c cancel and @c feedback callbacks.
    *
-   * This function adds the data @p value to the thread data under the given
-   * @p key.
-   * No other value in the hash may have the same @p key. If you need to
-   * change the value under a @p key, or you don't know if one exists already,
-   * you can use ecore_thread_local_data_set().
+   * The worker function, that's the one running in the thread, also receives
+   * an ::Ecore_Thread handler that can be used with ecore_thread_cancel() and
+   * ecore_thread_check(), sharing the flag with the main loop. But this
+   * handler is also associated with the thread where the function is running.
+   * This has strong implications when working with thread local data.
    *
-   * Neither @p key nor @p value may be NULL and @p key will be copied in the
-   * hash, unless @p direct is set, in which case the string used should not
-   * be freed until the data is removed from the hash.
+   * There are two kinds of worker threads Ecore handles: simple, or short,
+   * workers and feedback workers.
    *
-   * The @p cb function will be called when the data in the hash needs to be
-   * freed, be it because it got deleted with ecore_thread_local_data_del() or
-   * because @p thread was terminated and the hash destroyed. This parameter
-   * may be NULL, in which case @p value needs to be manually freed after
-   * removing it from the hash with either ecore_thread_local_data_del() or
-   * ecore_thread_local_data_set(), but it's very unlikely that this is what
-   * you want.
+   * The first kind is for simple functions that perform a
+   * usually small but time consuming task. Ecore will run this function in
+   * a thread as soon as one becomes available and notify the calling user of
+   * its completion once the task is done.
    *
-   * This function, and all of the others in the @c ecore_thread_local_data
-   * family of functions, can only be called within the worker function running
-   * in the thread. Do not call them from the main loop or from a thread
-   * other than the one represented by @p thread.
+   * The following image shows the flow of a program running four tasks on
+   * a pool of two threads.
    *
-   * @see ecore_thread_local_data_set()
-   * @see ecore_thread_local_data_find()
-   * @see ecore_thread_local_data_del()
-   */
-   EAPI Eina_Bool     ecore_thread_local_data_add(Ecore_Thread *thread, const char *key, void *value, Eina_Free_Cb cb, Eina_Bool direct);
-  /**
-   * Sets some data in the hash local to the given thread
+   * @image html ecore_thread.png
+   * @image rtf ecore_thread.png
+   * @image latex ecore_thread.eps width=\textwidth
    *
-   * @param thread The thread context the data belongs to
-   * @param key The name under which the data will be stored
-   * @param value The data to add
-   * @param cb Function to free the data when removed from the hash
+   * For larger tasks that may require continuous communication with the main
+   * program, the feedback workers provide the same functionality plus a way
+   * for the function running in the thread to send messages to the main
+   * thread.
    *
-   * If no data exists in the hash under the @p key, this function adds
-   * @p value in the hash under the given @p key and returns NULL.
-   * The key itself is copied.
+   * The next diagram omits some details shown in the previous one regarding
+   * how threads are spawned and tasks are queued, but illustrates how feedback
+   * jobs communicate with the main loop and the special case of threads
+   * running out of pool.
    *
-   * If the hash already contains something under @p key, the data will be
-   * replaced by @p value and the old value will be returned.
+   * @image html ecore_thread_feedback.png
+   * @image rtf ecore_thread_feedback.png
+   * @image latex ecore_thread_feedback.eps width=\textwidth
    *
-   * NULL will also be returned if either @p key or @p value are NULL, or if
-   * an error occurred.
+   * See an overview example in @ref ecore_thread_example_c.
    *
-   * This function, and all of the others in the @c ecore_thread_local_data
-   * family of functions, can only be called within the worker function running
-   * in the thread. Do not call them from the main loop or from a thread
-   * other than the one represented by @p thread.
+   * @ingroup Ecore_Main_Loop_Group
    *
-   * @see ecore_thread_local_data_add()
-   * @see ecore_thread_local_data_del()
-   * @see ecore_thread_local_data_find()
+   * @{
    */
-   EAPI void         *ecore_thread_local_data_set(Ecore_Thread *thread, const char *key, void *value, Eina_Free_Cb cb);
+
+   typedef struct _Ecore_Thread                Ecore_Thread; /**< A handle for threaded jobs */
+
+   /**
+    * @typedef Ecore_Thread_Cb Ecore_Thread_Cb
+    * A callback used by Ecore_Thread helper.
+    */
+  typedef void (*Ecore_Thread_Cb) (void *data, Ecore_Thread *thread);
+   /**
+    * @typedef Ecore_Thread_Notify_Cb Ecore_Thread_Notify_Cb
+    * A callback used by the main loop to receive data sent by an
+    * @ref Ecore_Thread_Group.
+    */
+  typedef void (*Ecore_Thread_Notify_Cb) (void *data, Ecore_Thread *thread, void *msg_data);
+
   /**
-   * Gets data stored in the hash local to the given thread
+   * Schedule a task to run in a parallel thread to avoid locking the main loop
    *
-   * @param thread The thread context the data belongs to
-   * @param key The name under which the data is stored
-   * @return The value under the given key, or NULL on error
+   * @param func_blocking The function that should run in another thread.
+   * @param func_end Function to call from main loop when @p func_blocking
+   * completes its task successfully (may be NULL)
+   * @param func_cancel Function to call from main loop if the thread running
+   * @p func_blocking is cancelled or fails to start (may be NULL)
+   * @param data User context data to pass to all callbacks.
+   * @return A new thread handler, or NULL on failure
    *
-   * Finds and return the data stored in the shared hash under the key @p key.
+   * This function will try to create a new thread to run @p func_blocking in,
+   * or if the maximum number of concurrent threads has been reached, will
+   * add it to the pending list, where it will wait until a thread becomes
+   * available. The return value will be an ::Ecore_Thread handle that can
+   * be used to cancel the thread before its completion.
    *
-   * This function, and all of the others in the @c ecore_thread_local_data
-   * family of functions, can only be called within the worker function running
-   * in the thread. Do not call them from the main loop or from a thread
-   * other than the one represented by @p thread.
+   * @note This function should always return immediately, but in the rare
+   * case that Ecore is built with no thread support, @p func_blocking will
+   * be called here, actually blocking the main loop.
    *
-   * @see ecore_thread_local_data_add()
-   * @see ecore_thread_local_data_wait()
-   */
-   EAPI void         *ecore_thread_local_data_find(Ecore_Thread *thread, const char *key);
-  /**
-   * Deletes from the thread's hash the data corresponding to the given key
+   * Once a thread becomes available, @p func_blocking will be run in it until
+   * it finishes, then @p func_end is called from the thread containing the
+   * main loop to inform the user of its completion. While in @p func_blocking,
+   * no functions from the EFL can be used, except for those from Eina that are
+   * marked to be thread-safe. Even for the latter, caution needs to be taken
+   * if the data is shared across several threads.
    *
-   * @param thread The thread context the data belongs to
-   * @param key The name under which the data is stored
-   * @return EINA_TRUE on success, EINA_FALSE on failure
+   * @p func_end will be called from the main thread when @p func_blocking ends,
+   * so here it's safe to use anything from the EFL freely.
    *
-   * If there's any data stored associated with @p key in the global hash,
-   * this function will remove it from it and return EINA_TRUE. If no data
-   * exists or an error occurs, it returns EINA_FALSE.
+   * The thread can also be cancelled before its completion calling
+   * ecore_thread_cancel(), either from the main thread or @p func_blocking.
+   * In this case, @p func_cancel will be called, also from the main thread
+   * to inform of this happening. If the thread could not be created, this
+   * function will be called and it's @c thread parameter will be NULL. It's
+   * also safe to call any EFL function here, as it will be running in the
+   * main thread.
    *
-   * If the data was added to the hash with a free function, then it will
-   * also be freed after removing it from the hash, otherwise it requires
-   * to be manually freed by the user, which means that if no other reference
-   * to it exists before calling this function, it will result in a memory
-   * leak.
+   * Inside @p func_blocking, it's possible to call ecore_thread_reschedule()
+   * to tell Ecore that this function should be called again.
    *
-   * This function, and all of the others in the @c ecore_thread_local_data
-   * family of functions, can only be called within the worker function running
-   * in the thread. Do not call them from the main loop or from a thread
-   * other than the one represented by @p thread.
+   * Be aware that no assumptions can be made about the order in which the
+   * @p func_end callbacks for each task will be called. Once the function is
+   * running in a different thread, it's the OS that will handle its running
+   * schedule, and different functions may take longer to finish than others.
+   * Also remember that just starting several tasks together doesn't mean they
+   * will be running at the same time. Ecore will schedule them based on the
+   * number of threads available for the particular system it's running in,
+   * so some of the jobs started may be waiting until another one finishes
+   * before it can execute its own @p func_blocking.
    *
-   * @see ecore_thread_local_data_add()
+   * @see ecore_thread_feedback_run()
+   * @see ecore_thread_cancel()
+   * @see ecore_thread_reschedule()
+   * @see ecore_thread_max_set()
    */
-   EAPI Eina_Bool     ecore_thread_local_data_del(Ecore_Thread *thread, const char *key);
-
+   EAPI Ecore_Thread *ecore_thread_run(Ecore_Thread_Cb func_blocking,
+                                       Ecore_Thread_Cb func_end,
+                                       Ecore_Thread_Cb func_cancel,
+                                       const void *data);
   /**
-   * Adds some data to a hash shared by all threads
-   *
-   * @param key The name under which the data will be stored
-   * @param value The data to add
-   * @param cb Function to free the data when removed from the hash
-   * @param direct If true, this will not copy the key string (like
-   * eina_hash_direct_add())
-   * @return EINA_TRUE on success, EINA_FALSE on failure
+   * Launch a thread to run a task than can talk back to the main thread
    *
-   * Ecore Thread keeps a hash that can be used to share data across several
-   * threads, including the main loop one, without having to manually handle
-   * mutexes to do so safely.
+   * @param func_heavy The function that should run in another thread.
+   * @param func_notify Function that receives the data sent from the thread
+   * @param func_end Function to call from main loop when @p func_heavy
+   * completes its task successfully
+   * @param func_cancel Function to call from main loop if the thread running
+   * @p func_heavy is cancelled or fails to start
+   * @param data User context data to pass to all callback.
+   * @param try_no_queue If you want to run outside of the thread pool.
+   * @return A new thread handler, or NULL on failure
    *
-   * This function adds the data @p value to this hash under the given @p key.
-   * No other value in the hash may have the same @p key. If you need to
-   * change the value under a @p key, or you don't know if one exists already,
-   * you can use ecore_thread_global_data_set().
+   * See ecore_thread_run() for a general description of this function.
    *
-   * Neither @p key nor @p value may be NULL and @p key will be copied in the
-   * hash, unless @p direct is set, in which case the string used should not
-   * be freed until the data is removed from the hash.
+   * The difference with the above is that ecore_thread_run() is meant for
+   * tasks that don't need to communicate anything until they finish, while
+   * this function is provided with a new callback, @p func_notify, that will
+   * be called from the main thread for every message sent from @p func_heavy
+   * with ecore_thread_feedback().
    *
-   * The @p cb function will be called when the data in the hash needs to be
-   * freed, be it because it got deleted with ecore_thread_global_data_del() or
-   * because Ecore Thread was shut down and the hash destroyed. This parameter
-   * may be NULL, in which case @p value needs to be manually freed after
-   * removing it from the hash with either ecore_thread_global_data_del() or
-   * ecore_thread_global_data_set().
+   * Like with ecore_thread_run(), a new thread will be launched to run
+   * @p func_heavy unless the maximum number of simultaneous threadas has been
+   * reached, in which case the function will be scheduled to run whenever a
+   * running task ends and a thread becomes free. But if @p try_no_queue is
+   * set, Ecore will first try to launch a thread outside of the pool to run
+   * the task. If it fails, it will revert to the normal behaviour of using a
+   * thread from the pool as if @p try_no_queue had not been set.
    *
-   * Manually freeing any data that was added to the hash with a @p cb function
-   * is likely to produce a segmentation fault, or any other strange
-   * happenings, later on in the program.
+   * Keep in mind that Ecore handles the thread pool based on the number of
+   * CPUs available, but running a thread outside of the pool doesn't count for
+   * this, so having too many of them may have drastic effects over the
+   * program's performance.
    *
-   * @see ecore_thread_global_data_del()
-   * @see ecore_thread_global_data_set()
-   * @see ecore_thread_global_data_find()
+   * @see ecore_thread_feedback()
+   * @see ecore_thread_run()
+   * @see ecore_thread_cancel()
+   * @see ecore_thread_reschedule()
+   * @see ecore_thread_max_set()
    */
-   EAPI Eina_Bool     ecore_thread_global_data_add(const char *key, void *value, Eina_Free_Cb cb, Eina_Bool direct);
+   EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Cb func_heavy,
+                                                Ecore_Thread_Notify_Cb func_notify,
+                                                Ecore_Thread_Cb func_end,
+                                                Ecore_Thread_Cb func_cancel,
+                                                const void *data,
+                                                Eina_Bool try_no_queue);
   /**
-   * Sets some data in the hash shared by all threads
+   * Cancel a running thread.
    *
-   * @param key The name under which the data will be stored
-   * @param value The data to add
-   * @param cb Function to free the data when removed from the hash
+   * @param thread The thread to cancel.
+   * @return Will return EINA_TRUE if the thread has been cancelled,
+   *         EINA_FALSE if it is pending.
    *
-   * If no data exists in the hash under the @p key, this function adds
-   * @p value in the hash under the given @p key and returns NULL.
-   * The key itself is copied.
+   * This function can be called both in the main loop or in the running thread.
    *
-   * If the hash already contains something under @p key, the data will be
-   * replaced by @p value and the old value will be returned.
+   * This function cancels a running thread. If @p thread can be immediately
+   * cancelled (it's still pending execution after creation or rescheduling),
+   * then the @c cancel callback will be called, @p thread will be freed and
+   * the function will return EINA_TRUE.
    *
-   * NULL will also be returned if either @p key or @p value are NULL, or if
-   * an error occurred.
+   * If the thread is already running, then this function returns EINA_FALSE
+   * after marking the @p thread as pending cancellation. For the thread to
+   * actually be terminated, it needs to return from the user function back
+   * into Ecore control. This can happen in several ways:
+   * @li The function ends and returns normally. If it hadn't been cancelled,
+   * @c func_end would be called here, but instead @c func_cancel will happen.
+   * @li The function returns after requesting to be rescheduled with
+   * ecore_thread_reschedule().
+   * @li The function is prepared to leave early by checking if
+   * ecore_thread_check() returns EINA_TRUE.
    *
-   * @see ecore_thread_global_data_add()
-   * @see ecore_thread_global_data_del()
-   * @see ecore_thread_global_data_find()
+   * The user function can cancel itself by calling ecore_thread_cancel(), but
+   * it should always use the ::Ecore_Thread handle passed to it and never
+   * share it with the main loop thread by means of shared user data or any
+   * other way.
+   *
+   * @p thread will be freed and should not be used again if this function
+   * returns EINA_TRUE or after the @c func_cancel callback returns.
+   *
+   * @see ecore_thread_check()
    */
-   EAPI void         *ecore_thread_global_data_set(const char *key, void *value, Eina_Free_Cb cb);
+   EAPI Eina_Bool     ecore_thread_cancel(Ecore_Thread *thread);
   /**
-   * Gets data stored in the hash shared by all threads
+   * Checks if a thread is pending cancellation
    *
-   * @param key The name under which the data is stored
-   * @return The value under the given key, or NULL on error
+   * @param thread The thread to test.
+   * @return EINA_TRUE if the thread is pending cancellation,
+   *         EINA_FALSE if it is not.
    *
-   * Finds and return the data stored in the shared hash under the key @p key.
+   * This function can be called both in the main loop or in the running thread.
    *
-   * Keep in mind that the data returned may be used by more than one thread
-   * at the same time and no reference counting is done on it by Ecore.
-   * Freeing the data or modifying its contents may require additional
-   * precautions to be considered, depending on the application's design.
+   * When ecore_thread_cancel() is called on an already running task, the
+   * thread is marked as pending cancellation. This function returns EINA_TRUE
+   * if this mark is set for the given @p thread and can be used from the
+   * main loop thread to check if a still active thread has been cancelled,
+   * or from the user function running in the thread to check if it should
+   * stop doing what it's doing and return early, effectively cancelling the
+   * task.
    *
-   * @see ecore_thread_global_data_add()
-   * @see ecore_thread_global_data_wait()
+   * @see ecore_thread_cancel()
    */
-   EAPI void         *ecore_thread_global_data_find(const char *key);
+   EAPI Eina_Bool     ecore_thread_check(Ecore_Thread *thread);
   /**
-   * Deletes from the shared hash the data corresponding to the given key
+   * Sends data from the worker thread to the main loop
    *
-   * @param key The name under which the data is stored
-   * @return EINA_TRUE on success, EINA_FALSE on failure
+   * @param thread The current ::Ecore_Thread context to send data from
+   * @param msg_data Data to be transmitted to the main loop
+   * @return EINA_TRUE if @p msg_data was successfully sent to main loop,
+   *         EINA_FALSE if anything goes wrong.
    *
-   * If there's any data stored associated with @p key in the global hash,
-   * this function will remove it from it and return EINA_TRUE. If no data
-   * exists or an error occurs, it returns EINA_FALSE.
+   * You should use this function only in the @c func_heavy call.
    *
-   * If the data was added to the hash with a free function, then it will
-   * also be freed after removing it from the hash, otherwise it requires
-   * to be manually freed by the user, which means that if no other reference
-   * to it exists before calling this function, it will result in a memory
-   * leak.
+   * Only the address to @p msg_data will be sent and once this function
+   * returns EINA_TRUE, the job running in the thread should never touch the
+   * contents of it again. The data sent should be malloc()'ed or something
+   * similar, as long as it's not memory local to the thread that risks being
+   * overwritten or deleted once it goes out of scope or the thread finishes.
    *
-   * Note, also, that freeing data that other threads may be using will result
-   * in a crash, so appropriate care must be taken by the application when
-   * that possibility exists.
+   * Care must be taken that @p msg_data is properly freed in the @c func_notify
+   * callback set when creating the thread.
    *
-   * @see ecore_thread_global_data_add()
+   * @see ecore_thread_feedback_run()
    */
-   EAPI Eina_Bool     ecore_thread_global_data_del(const char *key);
+   EAPI Eina_Bool     ecore_thread_feedback(Ecore_Thread *thread, const void *msg_data);
   /**
-   * Gets data stored in the shared hash, or wait for it if it doesn't exist
-   *
-   * @param key The name under which the data is stored
-   * @param seconds The amount of time in seconds to wait for the data.
-   * @return The value under the given key, or NULL on error
+   * Asks for the function in the thread to be called again at a later time
    *
-   * Finds and return the data stored in the shared hash under the key @p key.
+   * @param thread The current ::Ecore_Thread context to rescheduled
+   * @return EINA_TRUE if the task was successfully rescheduled,
+   *         EINA_FALSE if anything goes wrong.
    *
-   * If there's nothing in the hash under the given @p key, the function
-   * will block and wait up to @p seconds seconds for some other thread to
-   * add it with either ecore_thread_global_data_add() or
-   * ecore_thread_global_data_set(). If after waiting there's still no data
-   * to get, NULL will be returned.
+   * This function should be called only from the same function represented
+   * by @pthread.
    *
-   * If @p seconds is 0, then no waiting will happen and this function works
-   * like ecore_thread_global_data_find(). If @p seconds is less than 0, then
-   * the function will wait indefinitely.
+   * Calling this function will mark the thread for a reschedule, so as soon
+   * as it returns, it will be added to the end of the list of pending tasks.
+   * If no other tasks are waiting or there are sufficient threads available,
+   * the rescheduled task will be launched again immediately.
    *
-   * Keep in mind that the data returned may be used by more than one thread
-   * at the same time and no reference counting is done on it by Ecore.
-   * Freeing the data or modifying its contents may require additional
-   * precautions to be considered, depending on the application's design.
+   * This should never return EINA_FALSE, unless it was called from the wrong
+   * thread or with the wrong arguments.
    *
-   * @see ecore_thread_global_data_add()
-   * @see ecore_thread_global_data_find()
+   * The @c func_end callback set when the thread is created will not be
+   * called until the function in the thread returns without being rescheduled.
+   * Similarly, if the @p thread is cancelled, the reschedule will not take
+   * effect.
    */
-   EAPI void         *ecore_thread_global_data_wait(const char *key, double seconds);
-
-   /**
-    * @}
-    */
-
+   EAPI Eina_Bool     ecore_thread_reschedule(Ecore_Thread *thread);
   /**
-   * @defgroup Ecore_Time_Group Ecore Time functions
+   * Gets the number of active threads running jobs
    *
-   * @{
-   */
-
-   EAPI double ecore_time_get(void);
-   EAPI double ecore_time_unix_get(void);
-   EAPI double ecore_loop_time_get(void);
-
-   EAPI Ecore_Timer *ecore_timer_add(double in, Ecore_Task_Cb func, const void *data);
-   EAPI Ecore_Timer *ecore_timer_loop_add(double in, Ecore_Task_Cb func, const void *data);
-   EAPI void        *ecore_timer_del(Ecore_Timer *timer);
-   EAPI void         ecore_timer_interval_set(Ecore_Timer *timer, double in);
-   EAPI double       ecore_timer_interval_get(Ecore_Timer *timer);
-   EAPI void         ecore_timer_freeze(Ecore_Timer *timer);
-   EAPI void         ecore_timer_thaw(Ecore_Timer *timer);
-   EAPI void         ecore_timer_delay(Ecore_Timer *timer, double add);
-   EAPI double       ecore_timer_pending_get(Ecore_Timer *timer);
-   EAPI double       ecore_timer_precision_get(void);
-   EAPI void         ecore_timer_precision_set(double precision);
-   EAPI char        *ecore_timer_dump(void);
-
-  /**
-   * @}
-   */
-
-  /**
-   * @defgroup Ecore_Animator_Group Ecore Animator functions
+   * @return Number of active threads running jobs
    *
-   * @brief Ecore animators are a helper to simplify creating animations.
+   * This returns the number of threads currently running jobs of any type
+   * through the Ecore_Thread API.
    *
-   * Creating an animation is as simple as saying for how long it should be run
-   * and having a callback that does the animation, something like this:
-   * @code
-   * static Eina_Bool
-   * _do_animation(void *data, double pos)
-   * {
-   *    evas_object_move(data, 100 * pos, 100 * pos);
-   *    ... do some more animating ...
-   * }
-   * ...
-   * ecore_animator_timeline_add(2, _do_animation, my_evas_object);
-   * @endcode
-   * In the sample above we create an animation to move @p my_evas_object from
-   * position (0,0) to (100,100) in 2 seconds.
+   * @note Jobs started through the ecore_thread_feedback_run() function with
+   * the @c try_no_queue parameter set to EINA_TRUE will not be accounted for
+   * in the return of this function unless the thread creation fails and it
+   * falls back to using one from the pool.
+   */
+   EAPI int           ecore_thread_active_get(void);
+  /**
+   * Gets the number of short jobs waiting for a thread to run
    *
-   * If your animation will run for an unspecified amount of time you can use
-   * ecore_animator_add(), which is like using ecore_timer_add() with the
-   * interval being the @ref ecore_animator_frametime_set "framerate". Note that
-   * this has tangible benefits to creating a timer for each animation in terms
-   * of performance.
+   * @return Number of pending threads running "short" jobs
    *
-   * For a more detailed example that show several animation see @ref
-   * tutorial_ecore_animator.
-   * @{
+   * This returns the number of tasks started with ecore_thread_run() that are
+   * pending, waiting for a thread to become available to run them.
    */
-
+   EAPI int           ecore_thread_pending_get(void);
   /**
-   * @brief Add an animator to call @p func at every animaton tick during main
-   * loop execution.
-   *
-   * @param func The function to call when it ticks off
-   * @param data The data to pass to the function
-   * @return A handle to the new animator
+   * Gets the number of feedback jobs waiting for a thread to run
    *
-   * This function adds a animator and returns its handle on success and NULL on
-   * failure. The function @p func will be called every N seconds where N is the
-   * @p frametime interval set by ecore_animator_frametime_set(). The function
-   * will be passed the @p data pointer as its parameter.
+   * @return Number of pending threads running "feedback" jobs
    *
-   * When the animator @p func is called, it must return a value of either 1 or
-   * 0. If it returns 1 (or ECORE_CALLBACK_RENEW), it will be called again at
-   * the next tick, or if it returns 0 (or ECORE_CALLBACK_CANCEL) it will be
-   * deleted automatically making any references/handles for it invalid.
+   * This returns the number of tasks started with ecore_thread_feedback_run()
+   * that are pending, waiting for a thread to become available to run them.
+   */
+   EAPI int           ecore_thread_pending_feedback_get(void);
+  /**
+   * Gets the total number of pending jobs
    *
-   * @note The default @p frametime value is 1/30th of a second.
+   * @return Number of pending threads running jobs
    *
-   * @see ecore_animator_timeline_add()
-   * @see ecore_animator_frametime_set()
+   * Same as the sum of ecore_thread_pending_get() and
+   * ecore_thread_pending_feedback_get().
    */
-   EAPI Ecore_Animator *ecore_animator_add(Ecore_Task_Cb func, const void *data);
+   EAPI int           ecore_thread_pending_total_get(void);
   /**
-   * @brief Add a animator that runs for a limited time
-   *
-   * @param runtime The time to run in seconds
-   * @param func The function to call when it ticks off
-   * @param data The data to pass to the function
-   * @return A handle to the new animator
+   * Gets the maximum number of threads that can run simultaneously
    *
-   * This function is just like ecore_animator_add() except the animator only
-   * runs for a limited time specified in seconds by @p runtime. Once the
-   * runtime the animator has elapsed (animator finished) it will automatically
-   * be deleted. The callback function @p func can return ECORE_CALLBACK_RENEW
-   * to keep the animator running or ECORE_CALLBACK_CANCEL ro stop it and have
-   * it be deleted automatically at any time.
+   * @return Max possible number of Ecore_Thread's running concurrently
    *
-   * The @p func will ALSO be passed a position parameter that will be in value
-   * from 0.0 to 1.0 to indicate where along the timeline (0.0 start, 1.0 end)
-   * the animator run is at. If the callback wishes not to have a linear
-   * transition it can "map" this value to one of several curves and mappings
-   * via ecore_animator_pos_map().
+   * This returns the maximum number of Ecore_Thread's that may be running at
+   * the same time. If this number is reached, new jobs started by either
+   * ecore_thread_run() or ecore_thread_feedback_run() will be added to the
+   * respective pending queue until one of the running threads finishes its
+   * task and becomes available to run a new one.
    *
-   * @note The default @p frametime value is 1/30th of a second.
+   * By default, this will be the number of available CPUs for the
+   * running program (as returned by eina_cpu_count()), or 1 if this value
+   * could not be fetched.
    *
-   * @see ecore_animator_add()
-   * @see ecore_animator_pos_map()
-   * @since 1.1.0
+   * @see ecore_thread_max_set()
+   * @see ecore_thread_max_reset()
    */
-   EAPI Ecore_Animator *ecore_animator_timeline_add(double runtime, Ecore_Timeline_Cb func, const void *data);
+   EAPI int           ecore_thread_max_get(void);
   /**
-   * @brief Delete the specified animator from the animator list.
+   * Sets the maximum number of threads allowed to run simultaneously
    *
-   * @param animator The animator to delete
-   * @return The data pointer set for the animator on add
+   * @param num The new maximum
    *
-   * Delete the specified @p animator from the set of animators that are
-   * executed during main loop execution. This function returns the data
-   * parameter that was being passed to the callback on success, or NULL on
-   * failure. After this call returns the specified animator object @p animator
-   * is invalid and should not be used again. It will not get called again after
-   * deletion.
+   * This sets a new value for the maximum number of concurrently running
+   * Ecore_Thread's. It @b must an integer between 1 and (2 * @c x), where @c x
+   * is the number for CPUs available.
+   *
+   * @see ecore_thread_max_get()
+   * @see ecore_thread_max_reset()
    */
-   EAPI void           *ecore_animator_del(Ecore_Animator *animator);
+   EAPI void          ecore_thread_max_set(int num);
   /**
-   * @brief Suspend the specified animator.
-   *
-   * @param animator The animator to delete
+   * Resets the maximum number of concurrently running threads to the default
    *
-   * The specified @p animator will be temporarly removed from the set of
-   * animators that are executed during main loop.
+   * This resets the value returned by ecore_thread_max_get() back to its
+   * default.
    *
-   * @warning Freezing an animator doesn't freeze accounting of how long that
-   * animator has been running. Therefore if the animator was created with
-   * ecore_animator_timeline_add() the @p pos argument given to the callback
-   * will increase as if the animator hadn't been frozen and the animator may
-   * have it's execution halted if @p runtime elapsed.
+   * @see ecore_thread_max_get()
+   * @see ecore_thread_max_set()
    */
-   EAPI void            ecore_animator_freeze(Ecore_Animator *animator);
+   EAPI void          ecore_thread_max_reset(void);
   /**
-   * @brief Restore execution of the specified animator.
+   * Gets the number of threads available for running tasks
    *
-   * @param animator The animator to delete
+   * @return The number of available threads
    *
-   * The specified @p animator will be put back in the set of animators that are
-   * executed during main loop.
+   * Same as doing ecore_thread_max_get() - ecore_thread_active_get().
+   *
+   * This function may return a negative number only in the case the user
+   * changed the maximum number of running threads while other tasks are
+   * running.
    */
-   EAPI void            ecore_animator_thaw(Ecore_Animator *animator);
+   EAPI int           ecore_thread_available_get(void);
   /**
-   * @brief Set the animator call interval in seconds.
+   * Adds some data to a hash local to the thread
    *
-   * @param frametime The time in seconds in between animator ticks.
+   * @param thread The thread context the data belongs to
+   * @param key The name under which the data will be stored
+   * @param value The data to add
+   * @param cb Function to free the data when removed from the hash
+   * @param direct If true, this will not copy the key string (like
+   * eina_hash_direct_add())
+   * @return EINA_TRUE on success, EINA_FALSE on failure
    *
-   * This function sets the time interval (in seconds) between animator ticks.
-   * At every tick the callback of every existing animator will be called.
+   * Ecore Thread has a mechanism to share data across several worker functions
+   * that run on the same system thread. That is, the data is stored per
+   * thread and for a worker function to have access to it, it must be run
+   * by the same thread that stored the data.
    *
-   * @warning Too small a value may cause performance issues and too high a
-   * value may cause your animation to seem "jerky".
+   * When there are no more workers pending, the thread will be destroyed
+   * along with the internal hash and any data left in it will be freed with
+   * the @p cb function given.
    *
-   * @note The default @p frametime value is 1/30th of a second.
+   * This set of functions is useful to share things around several instances
+   * of a function when that thing is costly to create and can be reused, but
+   * may only be used by one function at a time.
+   *
+   * For example, if you have a program doing requisitions to a database,
+   * these requisitions can be done in threads so that waiting for the
+   * database to respond doesn't block the UI. Each of these threads will
+   * run a function, and each function will be dependent on a connection to
+   * the database, which may not be able to handle more than one request at
+   * a time so for each running function you will need one connection handle.
+   * The options then are:
+   * @li Each function opens a connection when it's called, does the work and
+   * closes the connection when it finishes. This may be costly, wasting a lot
+   * of time on resolving hostnames, negotiating permissions and allocating
+   * memory.
+   * @li Open the connections in the main loop and pass it to the threads
+   * using the data pointer. Even worse, it's just as costly as before and now
+   * it may even be kept with connections open doing nothing until a thread
+   * becomes available to run the function.
+   * @li Have a way to share connection handles, so that each instance of the
+   * function can check if an available connection exists, and if it doesn't,
+   * create one and add it to the pool. When no more connections are needed,
+   * they are all closed.
+   *
+   * The last option is the most efficient, but it requires a lot of work to
+   * implement properly. Using thread local data helps to achieve the same
+   * result while avoiding doing all the tracking work on your code. The way
+   * to use it would be, at the worker function, to ask for the connection
+   * with ecore_thread_local_data_find() and if it doesn't exist, then open
+   * a new one and save it with ecore_thread_local_data_add(). Do the work and
+   * forget about the connection handle, when everything is done the function
+   * just ends. The next worker to run on that thread will check if a
+   * connection exists and find that it does, so the process of opening a
+   * new one has been spared. When no more workers exist, the thread is
+   * destroyed and the callback used when saving the connection will be called
+   * to close it.
+   *
+   * This function adds the data @p value to the thread data under the given
+   * @p key.
+   * No other value in the hash may have the same @p key. If you need to
+   * change the value under a @p key, or you don't know if one exists already,
+   * you can use ecore_thread_local_data_set().
+   *
+   * Neither @p key nor @p value may be NULL and @p key will be copied in the
+   * hash, unless @p direct is set, in which case the string used should not
+   * be freed until the data is removed from the hash.
+   *
+   * The @p cb function will be called when the data in the hash needs to be
+   * freed, be it because it got deleted with ecore_thread_local_data_del() or
+   * because @p thread was terminated and the hash destroyed. This parameter
+   * may be NULL, in which case @p value needs to be manually freed after
+   * removing it from the hash with either ecore_thread_local_data_del() or
+   * ecore_thread_local_data_set(), but it's very unlikely that this is what
+   * you want.
+   *
+   * This function, and all of the others in the @c ecore_thread_local_data
+   * family of functions, can only be called within the worker function running
+   * in the thread. Do not call them from the main loop or from a thread
+   * other than the one represented by @p thread.
+   *
+   * @see ecore_thread_local_data_set()
+   * @see ecore_thread_local_data_find()
+   * @see ecore_thread_local_data_del()
    */
-   EAPI void            ecore_animator_frametime_set(double frametime);
+   EAPI Eina_Bool     ecore_thread_local_data_add(Ecore_Thread *thread, const char *key, void *value, Eina_Free_Cb cb, Eina_Bool direct);
   /**
-   * @brief Get the animator call interval in seconds.
+   * Sets some data in the hash local to the given thread
    *
-   * @return The time in second in between animator ticks.
+   * @param thread The thread context the data belongs to
+   * @param key The name under which the data will be stored
+   * @param value The data to add
+   * @param cb Function to free the data when removed from the hash
    *
-   * This function retrieves the time in seconds between animator ticks.
+   * If no data exists in the hash under the @p key, this function adds
+   * @p value in the hash under the given @p key and returns NULL.
+   * The key itself is copied.
    *
-   * @see ecore_animator_frametime_set()
+   * If the hash already contains something under @p key, the data will be
+   * replaced by @p value and the old value will be returned.
+   *
+   * NULL will also be returned if either @p key or @p value are NULL, or if
+   * an error occurred.
+   *
+   * This function, and all of the others in the @c ecore_thread_local_data
+   * family of functions, can only be called within the worker function running
+   * in the thread. Do not call them from the main loop or from a thread
+   * other than the one represented by @p thread.
+   *
+   * @see ecore_thread_local_data_add()
+   * @see ecore_thread_local_data_del()
+   * @see ecore_thread_local_data_find()
    */
-   EAPI double          ecore_animator_frametime_get(void);
+   EAPI void         *ecore_thread_local_data_set(Ecore_Thread *thread, const char *key, void *value, Eina_Free_Cb cb);
   /**
-   * @brief Maps an input position from 0.0 to 1.0 along a timeline to a
-   * position in a different curve.
+   * Gets data stored in the hash local to the given thread
    *
-   * @param pos The input position to map
-   * @param map The mapping to use
-   * @param v1 A parameter use by the mapping (pass 0.0 if not used)
-   * @param v2 A parameter use by the mapping (pass 0.0 if not used)
-   * @return The mapped value
+   * @param thread The thread context the data belongs to
+   * @param key The name under which the data is stored
+   * @return The value under the given key, or NULL on error
    *
-   * Takes an input position (0.0 to 1.0) and maps to a new position (normally
-   * between 0.0 and 1.0, but it may go above/below 0.0 or 1.0 to show that it
-   * has "overshot" the mark) using some interpolation (mapping) algorithm.
+   * Finds and return the data stored in the shared hash under the key @p key.
    *
-   * This function useful to create non-linear animations. It offers a variety
-   * of possible animaton curves to be used:
-   * @li ECORE_POS_MAP_LINEAR - Linear, returns @p pos
-   * @li ECORE_POS_MAP_ACCELERATE - Start slow then speed up
-   * @li ECORE_POS_MAP_DECELERATE - Start fast then slow down
-   * @li ECORE_POS_MAP_SINUSOIDAL - Start slow, speed up then slow down at end
-   * @li ECORE_POS_MAP_ACCELERATE_FACTOR - Start slow then speed up, v1 being a
-   * power factor, 0.0 being linear, 1.0 being ECORE_POS_MAP_ACCELERATE, 2.0
-   * being much more pronounced accelerate (squared), 3.0 being cubed, etc.
-   * @li ECORE_POS_MAP_DECELERATE_FACTOR - Start fast then slow down, v1 being a
-   * power factor, 0.0 being linear, 1.0 being ECORE_POS_MAP_DECELERATE, 2.0
-   * being much more pronounced decelerate (squared), 3.0 being cubed, etc.
-   * @li ECORE_POS_MAP_SINUSOIDAL_FACTOR - Start slow, speed up then slow down
-   * at end, v1 being a power factor, 0.0 being linear, 1.0 being
-   * ECORE_POS_MAP_SINUSOIDAL, 2.0 being much more pronounced sinusoidal
-   * (squared), 3.0 being cubed, etc.
-   * @li ECORE_POS_MAP_DIVISOR_INTERP - Start at gradient * v1, interpolated via
-   * power of v2 curve
-   * @li ECORE_POS_MAP_BOUNCE - Start at 0.0 then "drop" like a ball bouncing to
-   * the ground at 1.0, and bounce v2 times, with decay factor of v1
-   * @li ECORE_POS_MAP_SPRING - Start at 0.0 then "wobble" like a spring rest
-   * position 1.0, and wobble v2 times, with decay factor of v1
-   * @note When not listed v1 and v2 have no effect.
+   * This function, and all of the others in the @c ecore_thread_local_data
+   * family of functions, can only be called within the worker function running
+   * in the thread. Do not call them from the main loop or from a thread
+   * other than the one represented by @p thread.
+   *
+   * @see ecore_thread_local_data_add()
+   * @see ecore_thread_local_data_wait()
+   */
+   EAPI void         *ecore_thread_local_data_find(Ecore_Thread *thread, const char *key);
+  /**
+   * Deletes from the thread's hash the data corresponding to the given key
    *
-   * @image html ecore-pos-map.png
-   * @image latex ecore-pos-map.eps width=\textwidth
+   * @param thread The thread context the data belongs to
+   * @param key The name under which the data is stored
+   * @return EINA_TRUE on success, EINA_FALSE on failure
    *
-   * One way to use this would be:
-   * @code
-   * double pos; // input position in a timeline from 0.0 to 1.0
-   * double out; // output position after mapping
-   * int x1, y1, x2, y2; // x1 & y1 are start position, x2 & y2 are end position
-   * int x, y; // x & y are the calculated position
+   * If there's any data stored associated with @p key in the global hash,
+   * this function will remove it from it and return EINA_TRUE. If no data
+   * exists or an error occurs, it returns EINA_FALSE.
    *
-   * out = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 1.8, 7);
-   * x = (x1 * out) + (x2 * (1.0 - out));
-   * y = (y1 * out) + (y2 * (1.0 - out));
-   * move_my_object_to(myobject, x, y);
-   * @endcode
-   * This will make an animaton that bounces 7 each times diminishing by a
-   * factor of 1.8.
+   * If the data was added to the hash with a free function, then it will
+   * also be freed after removing it from the hash, otherwise it requires
+   * to be manually freed by the user, which means that if no other reference
+   * to it exists before calling this function, it will result in a memory
+   * leak.
    *
-   * @see _Ecore_Pos_Map
+   * This function, and all of the others in the @c ecore_thread_local_data
+   * family of functions, can only be called within the worker function running
+   * in the thread. Do not call them from the main loop or from a thread
+   * other than the one represented by @p thread.
    *
-   * @since 1.1.0
+   * @see ecore_thread_local_data_add()
    */
-   EAPI double          ecore_animator_pos_map(double pos, Ecore_Pos_Map map, double v1, double v2);
+   EAPI Eina_Bool     ecore_thread_local_data_del(Ecore_Thread *thread, const char *key);
+
   /**
-   * @brief Set the source of animator ticks for the mainloop
+   * Adds some data to a hash shared by all threads
    *
-   * @param source The source of animator ticks to use
+   * @param key The name under which the data will be stored
+   * @param value The data to add
+   * @param cb Function to free the data when removed from the hash
+   * @param direct If true, this will not copy the key string (like
+   * eina_hash_direct_add())
+   * @return EINA_TRUE on success, EINA_FALSE on failure
    *
-   * This sets the source of animator ticks. When an animator is active the
-   * mainloop will "tick" over frame by frame calling all animators that are
-   * registered until none are. The mainloop will tick at a given rate based
-   * on the animator source. The default source is the system clock timer
-   * source - ECORE_ANIMATOR_SOURCE_TIMER. This source uses the system clock
-   * to tick over every N seconds (specified by ecore_animator_frametime_set(),
-   * with the default being 1/30th of a second unless set otherwise). You can
-   * set a custom tick source by setting the source to
-   * ECORE_ANIMATOR_SOURCE_CUSTOM and then drive it yourself based on some input
-   * tick source (like another application via ipc, some vertical blanking
-   * interrupt interrupt etc.) using
-   * ecore_animator_custom_source_tick_begin_callback_set() and
-   * ecore_animator_custom_source_tick_end_callback_set() to set the functions
-   * that will be called to start and stop the ticking source, which when it
-   * gets a "tick" should call ecore_animator_custom_tick() to make the "tick" over 1
-   * frame.
+   * Ecore Thread keeps a hash that can be used to share data across several
+   * threads, including the main loop one, without having to manually handle
+   * mutexes to do so safely.
+   *
+   * This function adds the data @p value to this hash under the given @p key.
+   * No other value in the hash may have the same @p key. If you need to
+   * change the value under a @p key, or you don't know if one exists already,
+   * you can use ecore_thread_global_data_set().
+   *
+   * Neither @p key nor @p value may be NULL and @p key will be copied in the
+   * hash, unless @p direct is set, in which case the string used should not
+   * be freed until the data is removed from the hash.
+   *
+   * The @p cb function will be called when the data in the hash needs to be
+   * freed, be it because it got deleted with ecore_thread_global_data_del() or
+   * because Ecore Thread was shut down and the hash destroyed. This parameter
+   * may be NULL, in which case @p value needs to be manually freed after
+   * removing it from the hash with either ecore_thread_global_data_del() or
+   * ecore_thread_global_data_set().
+   *
+   * Manually freeing any data that was added to the hash with a @p cb function
+   * is likely to produce a segmentation fault, or any other strange
+   * happenings, later on in the program.
+   *
+   * @see ecore_thread_global_data_del()
+   * @see ecore_thread_global_data_set()
+   * @see ecore_thread_global_data_find()
    */
-   EAPI void            ecore_animator_source_set(Ecore_Animator_Source source);
+   EAPI Eina_Bool     ecore_thread_global_data_add(const char *key, void *value, Eina_Free_Cb cb, Eina_Bool direct);
   /**
-   * @brief Get the animator source currently set.
+   * Sets some data in the hash shared by all threads
    *
-   * @return The current animator source
+   * @param key The name under which the data will be stored
+   * @param value The data to add
+   * @param cb Function to free the data when removed from the hash
    *
-   * This gets the current animator source.
+   * If no data exists in the hash under the @p key, this function adds
+   * @p value in the hash under the given @p key and returns NULL.
+   * The key itself is copied.
    *
-   * @see ecore_animator_source_set()
+   * If the hash already contains something under @p key, the data will be
+   * replaced by @p value and the old value will be returned.
+   *
+   * NULL will also be returned if either @p key or @p value are NULL, or if
+   * an error occurred.
+   *
+   * @see ecore_thread_global_data_add()
+   * @see ecore_thread_global_data_del()
+   * @see ecore_thread_global_data_find()
    */
-   EAPI Ecore_Animator_Source ecore_animator_source_get(void);
+   EAPI void         *ecore_thread_global_data_set(const char *key, void *value, Eina_Free_Cb cb);
   /**
-   * @brief Set the function that begins a custom animator tick source
+   * Gets data stored in the hash shared by all threads
    *
-   * @param func The function to call when ticking is to begin
-   * @param data The data passed to the tick begin function as its parameter
+   * @param key The name under which the data is stored
+   * @return The value under the given key, or NULL on error
    *
-   * The Ecore Animator infrastructure handles tracking if animators are needed
-   * or not and which ones need to be called and when, but when the tick source
-   * is custom, you have to provide a tick source by calling
-   * ecore_animator_custom_tick() to indicate a frame tick happened. In order
-   * to allow the source of ticks to be dynamically enabled or disabled as
-   * needed, the @p func when set is called to enable the tick source to
-   * produce tick events that call ecore_animator_custom_tick(). If @p func
-   * is NULL then no function is called to begin custom ticking.
+   * Finds and return the data stored in the shared hash under the key @p key.
    *
-   * @see ecore_animator_source_set()
-   * @see ecore_animator_custom_source_tick_end_callback_set()
-   * @see ecore_animator_custom_tick()
+   * Keep in mind that the data returned may be used by more than one thread
+   * at the same time and no reference counting is done on it by Ecore.
+   * Freeing the data or modifying its contents may require additional
+   * precautions to be considered, depending on the application's design.
+   *
+   * @see ecore_thread_global_data_add()
+   * @see ecore_thread_global_data_wait()
    */
-   EAPI void            ecore_animator_custom_source_tick_begin_callback_set(Ecore_Cb func, const void *data);
+   EAPI void         *ecore_thread_global_data_find(const char *key);
   /**
-   * @brief Set the function that ends a custom animator tick source
+   * Deletes from the shared hash the data corresponding to the given key
    *
-   * @param func The function to call when ticking is to end
-   * @param data The data passed to the tick end function as its parameter
+   * @param key The name under which the data is stored
+   * @return EINA_TRUE on success, EINA_FALSE on failure
    *
-   * This function is a matching pair to the function set by
-   * ecore_animator_custom_source_tick_begin_callback_set() and is called
-   * when ticking is to stop. If @p func is NULL then no function will be
-   * called to stop ticking. For more information please see
-   * ecore_animator_custom_source_tick_begin_callback_set().
+   * If there's any data stored associated with @p key in the global hash,
+   * this function will remove it from it and return EINA_TRUE. If no data
+   * exists or an error occurs, it returns EINA_FALSE.
    *
-   * @see ecore_animator_source_set()
-   * @see ecore_animator_custom_source_tick_begin_callback_set()
-   * @see ecore_animator_custom_tick()
+   * If the data was added to the hash with a free function, then it will
+   * also be freed after removing it from the hash, otherwise it requires
+   * to be manually freed by the user, which means that if no other reference
+   * to it exists before calling this function, it will result in a memory
+   * leak.
+   *
+   * Note, also, that freeing data that other threads may be using will result
+   * in a crash, so appropriate care must be taken by the application when
+   * that possibility exists.
+   *
+   * @see ecore_thread_global_data_add()
    */
-   EAPI void            ecore_animator_custom_source_tick_end_callback_set(Ecore_Cb func, const void *data);
+   EAPI Eina_Bool     ecore_thread_global_data_del(const char *key);
   /**
-   * @brief Trigger a custom animator tick
+   * Gets data stored in the shared hash, or wait for it if it doesn't exist
    *
-   * When animator source is set to ECORE_ANIMATOR_SOURCE_CUSTOM, then calling
-   * this function triggers a run of all animators currently registered with
-   * Ecore as this indicates a "frame tick" happened. This will do nothing if
-   * the animator source(set by ecore_animator_source_set()) is not set to
-   * ECORE_ANIMATOR_SOURCE_CUSTOM.
+   * @param key The name under which the data is stored
+   * @param seconds The amount of time in seconds to wait for the data.
+   * @return The value under the given key, or NULL on error
    *
-   * @see ecore_animator_source_set()
-   * @see ecore_animator_custom_source_tick_begin_callback_set
-   * @see ecore_animator_custom_source_tick_end_callback_set()()
+   * Finds and return the data stored in the shared hash under the key @p key.
+   *
+   * If there's nothing in the hash under the given @p key, the function
+   * will block and wait up to @p seconds seconds for some other thread to
+   * add it with either ecore_thread_global_data_add() or
+   * ecore_thread_global_data_set(). If after waiting there's still no data
+   * to get, NULL will be returned.
+   *
+   * If @p seconds is 0, then no waiting will happen and this function works
+   * like ecore_thread_global_data_find(). If @p seconds is less than 0, then
+   * the function will wait indefinitely.
+   *
+   * Keep in mind that the data returned may be used by more than one thread
+   * at the same time and no reference counting is done on it by Ecore.
+   * Freeing the data or modifying its contents may require additional
+   * precautions to be considered, depending on the application's design.
+   *
+   * @see ecore_thread_global_data_add()
+   * @see ecore_thread_global_data_find()
    */
-   EAPI void            ecore_animator_custom_tick(void);
-         
+   EAPI void         *ecore_thread_global_data_wait(const char *key, double seconds);
+
   /**
    * @}
    */
 
   /**
-   * @defgroup Ecore_Poller_Group Ecore Poll functions
+   * @defgroup Ecore_Pipe_Group Pipe wrapper
+   *
+   * These functions wrap the pipe / write / read functions to easily
+   * integrate its use into ecore's main loop.
+   *
+   * The ecore_pipe_add() function creates file descriptors (sockets
+   * on Windows) and attach a handle to the ecore main loop. That
+   * handle is called when data is read in the pipe. To write data in
+   * the pipe, just call ecore_pipe_write(). When you are done, just
+   * call ecore_pipe_del().
+   *
+   * For examples see here:
+   * @li @ref tutorial_ecore_pipe_gstreamer_example
+   * @li @ref tutorial_ecore_pipe_simple_example
+   *
+   * @ingroup Ecore_Main_Loop_Group
    *
    * @{
    */
 
-   EAPI void          ecore_poller_poll_interval_set(Ecore_Poller_Type type, double poll_time);
-   EAPI double        ecore_poller_poll_interval_get(Ecore_Poller_Type type);
-   EAPI Eina_Bool     ecore_poller_poller_interval_set(Ecore_Poller *poller, int interval);
-   EAPI int           ecore_poller_poller_interval_get(Ecore_Poller *poller);
-   EAPI Ecore_Poller *ecore_poller_add(Ecore_Poller_Type type, int interval, Ecore_Task_Cb func, const void *data);
-   EAPI void         *ecore_poller_del(Ecore_Poller *poller);
+   typedef struct _Ecore_Pipe                  Ecore_Pipe; /**< A handle for pipes */
+
+   /**
+    * @typedef Ecore_Pipe_Cb Ecore_Pipe_Cb
+    * The callback that data written to the pipe is sent to.
+    */
+   typedef void (*Ecore_Pipe_Cb) (void *data, void *buffer, unsigned int nbyte);
+
+   EAPI Ecore_Pipe  *ecore_pipe_add(Ecore_Pipe_Cb handler, const void *data);
+   EAPI void        *ecore_pipe_del(Ecore_Pipe *p);
+   EAPI Eina_Bool    ecore_pipe_write(Ecore_Pipe *p, const void *buffer, unsigned int nbytes);
+   EAPI void         ecore_pipe_write_close(Ecore_Pipe *p);
+   EAPI void         ecore_pipe_read_close(Ecore_Pipe *p);
+   EAPI void         ecore_pipe_thaw(Ecore_Pipe *p);
+   EAPI void         ecore_pipe_freeze(Ecore_Pipe *p);
+   EAPI int          ecore_pipe_wait(Ecore_Pipe *p, int message_count, double wait);
 
   /**
    * @}
    */
 
-  /**
-   * @defgroup Ecore_Job_Group Ecore Job functions
-   *
-   * @{
-   */
+   /**
+    * @defgroup Ecore_Job_Group Ecore Job functions
+    *
+    * You can queue jobs that are to be done by the main loop when the
+    * current event is dealt with.
+    *
+    * Jobs are processed by the main loop similarly to events. They
+    * also will be executed in the order in which they were added.
+    *
+    * A good use for them is when you don't want to execute an action
+    * immeditately, but want to give the control back to the main loop
+    * so that it will call your job callback when jobs start being
+    * processed (and if there are other jobs added before yours, they
+    * will be processed first). This also gives the chance to other
+    * actions in your program to cancel the job before it is started.
+    *
+    * Examples of using @ref Ecore_Job:
+    * @li @ref ecore_job_example_c
+    *
+    * @ingroup Ecore_Main_Loop_Group
+    *
+    * @{
+    */
+
+   typedef struct _Ecore_Job Ecore_Job; /**< A job handle */
 
    EAPI Ecore_Job *ecore_job_add(Ecore_Cb func, const void *data);
    EAPI void      *ecore_job_del(Ecore_Job *job);
@@ -1816,22 +2034,29 @@ extern "C" {
    */
 
   /**
+   * @defgroup Ecore_Application_Group Ecore Application functions
+   *
+   * @{
+   */
+
+   EAPI void ecore_app_args_set(int argc, const char **argv);
+   EAPI void ecore_app_args_get(int *argc, char ***argv);
+   EAPI void ecore_app_restart(void);
+
+  /**
    * @}
    */
 
   /**
    * @defgroup Ecore_Throttle_Group Ecore Throttle functions
    *
+   * @ingroup Ecore_Main_Loop_Group
+   *
    * @{
    */
 
    EAPI void       ecore_throttle_adjust(double amount );
    EAPI double     ecore_throttle_get(void);
-         
-   
-  /**
-   * @}
-   */
 
   /**
    * @}
index a1d0d3c..7f3ff58 100644 (file)
@@ -74,7 +74,7 @@ static Eina_Lock _thread_safety;
 #endif
 
 /**
- * @addtogroup Ecore_Init_Group Ecore initialisation and shutdown functions.
+ * @addtogroup Ecore_Init_Group
  *
  * @{
  */
@@ -221,6 +221,10 @@ ecore_shutdown(void)
    return _ecore_init_count;
 }
 
+/**
+ * @}
+ */
+
 EAPI void
 ecore_main_loop_thread_safe_call(Ecore_Cb callback, void *data)
 {
@@ -249,10 +253,6 @@ ecore_main_loop_thread_safe_call(Ecore_Cb callback, void *data)
    eina_lock_release(&_thread_safety);
 }
 
-/**
- * @}
- */
-
 EAPI void
 ecore_print_warning(const char *function, const char *sparam)
 {
index c29480a..296698b 100644 (file)
@@ -21,13 +21,7 @@ static int app_argc = 0;
 static char **app_argv = NULL;
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Application_Group Ecore Application functions
+ * @addtogroup Ecore_Application_Group
  *
  * @{
  */
@@ -95,7 +89,3 @@ ecore_app_restart(void)
 /**
  * @}
  */
-
-/**
- * @}
- */
index 7f21771..a982d72 100644 (file)
@@ -73,43 +73,7 @@ static void *_ecore_event_del(Ecore_Event *event);
 
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Event_Group Ecore Event functions
- *
- * Ecore events are used to wake up the Ecore main loop to warn about state
- * changes, tasks completed, data available for reading or writing, etc. They
- * are the base of the event oriented programming.
- *
- * The idea is to write many functions (callbacks) that will be registered to
- * specific events, and called when these events happen. This way, when the
- * system state changes (a mouse click is detected, a key is pressed, or the
- * content of a file changes, for example), the respective callbacks will be
- * called with some information about that event. Usually the function/callback
- * will have a data pointer to the event info (the position in the screen where
- * the mouse was clicked, the name of the key that was pressed, or the name of
- * the file that has changed).
- *
- * The basic usage, when one needs to watch for an existing event, is to
- * register a callback to it using ecore_event_add(). Of course it's necessary
- * to know beforehand what are the types of events that the system/library will
- * emmit.  This should be available with the documentation from that
- * system/library.
- *
- * When writing a library or group of functions that need to inform about
- * something, and you already are running on top of a main loop, it is usually a
- * good approach to use events. This way you allow others to register as many
- * callbacks as necessary to this event, and don't have to care about who is
- * registering to it. The functions ecore_event_type_new() and ecore_event_add()
- * are available for this purpose.
- *
- * Example that deals with events:
- *
- * @li @ref ecore_event_example_c
+ * @addtogroup Ecore_Event_Group
  *
  * @{
  */
@@ -477,10 +441,6 @@ ecore_event_current_event_get(void)
  * @}
  */
 
-/**
- * @}
- */
-
 void
 _ecore_event_shutdown(void)
 {
index d5a626d..12027bf 100644 (file)
@@ -299,17 +299,8 @@ _ecore_exe_check_errno(int result, const char *file, int line)
    return result;
 }
 
-
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Exe_Group Process Spawning Functions
- *
- * Functions that deal with and send signals to spawned processes.
+ * @addtogroup Ecore_Exe_Group
  *
  * @{
  */
@@ -1318,10 +1309,6 @@ ecore_exe_hup(Ecore_Exe *exe)
  * @}
  */
 
-/**
- * @}
- */
-
 static Ecore_Exe *
 _ecore_exe_is_it_alive(pid_t pid)
 {
index dcc88df..71288e6 100644 (file)
@@ -220,13 +220,7 @@ _ecore_glib_shutdown(void)
 }
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Main_Loop_Group Ecore Main Loop functions
+ * @addtogroup Ecore_Main_Loop_Group
  *
  * @}
  */
@@ -321,7 +315,3 @@ ecore_main_loop_glib_always_integrate_disable(void)
 /**
  * @}
  */
-
-/**
- * @}
- */
index c4a1915..aa0b4a6 100644 (file)
@@ -27,13 +27,7 @@ static void *
 _ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer);
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Idle_Group Ecore Idle functions
+ * @addtogroup Ecore_Idle_Group
  *
  * @{
  */
@@ -123,10 +117,6 @@ ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer)
  * @}
  */
 
-/**
- * @}
- */
-
 static void *
 _ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer)
 {
index d7d52f4..fc41f92 100644 (file)
@@ -27,13 +27,7 @@ static void *
 _ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Idle_Group Ecore Idle functions
+ * @addtogroup Ecore_Idle_Group
  *
  * @{
  */
@@ -92,10 +86,6 @@ ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
  * @}
  */
 
-/**
- * @}
- */
-
 static void *
 _ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
 {
index 672aff2..f39999f 100644 (file)
@@ -26,66 +26,6 @@ static int          idlers_delete_me = 0;
 static void *
 _ecore_idler_del(Ecore_Idler *idler);
 
-/**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Idle_Group Ecore Idle functions
- *
-Callbacks that are called when the program enters or exits an idle state.
-
-The ecore main loop enters an idle state when it is waiting for timers
-to time out, data to come in on a file descriptor or any other event
-to occur.  You can set callbacks to be called when the main loop
-enters an idle state, during an idle state or just after the program
-wakes up.
-
-Enterer callbacks are good for updating your program's state, if it
-has a state engine.  Once all of the enterer handlers are called, the
-program will enter a "sleeping" state.
-
-Idler callbacks are called when the main loop has called all enterer
-handlers.  They are useful for interfaces that require polling and
-timers would be too slow to use.
-
-If no idler callbacks are specified, then the process literally goes
-to sleep.  Otherwise, the idler callbacks are called continuously
-while the loop is "idle", using as much CPU as is available to the
-process.
-
-Exiter callbacks are called when the main loop wakes up from an idle
-state.
-
-@note Idle state doesn't mean that the @b program is idle, but that the <b>main
-loop</b> is idle. It doesn't have any timers, events, fd handlers or anything
-else to process (which in most <em>event driven</em> programs also means that the @b
-program is idle too, but it's not a rule). The program itself may be doing a lot of
-processing in the idler, or in another thread, for example.
-
-Example with functions that deal with idle state:
-
-@li @ref ecore_idler_example_c
-
- * @{
- */
-
-/**
- * Add an idler handler.
- * @param  func The function to call when idling.
- * @param  data The data to be passed to this @p func call.
- * @return A idler handle if successfully added.  NULL otherwise.
- *
- * Add an idler handle to the event loop, returning a handle on success and
- * NULL otherwise.  The function @p func will be called repeatedly while
- * no other events are ready to be processed, as long as it returns 1
- * (or ECORE_CALLBACK_RENEW). A return of 0 (or ECORE_CALLBACK_CANCEL) deletes
- * the idler.
- *
- * Idlers are useful for progressively prossessing data without blocking.
- */
 EAPI Ecore_Idler *
 ecore_idler_add(Ecore_Task_Cb func, const void *data)
 {
@@ -104,12 +44,6 @@ unlock:
    return ie;
 }
 
-/**
- * Delete an idler callback from the list to be executed.
- * @param  idler The handle of the idler callback to delete
- * @return The data pointer passed to the idler callback on success.  NULL
- *         otherwise.
- */
 EAPI void *
 ecore_idler_del(Ecore_Idler *idler)
 {
index 446547b..b4a7079 100644 (file)
@@ -36,28 +36,7 @@ _ecore_job_shutdown(void)
 }
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Job_Group Ecore Job functions
- *
- * You can queue jobs that are to be done by the main loop when the current
- * event is dealt with.
- *
- * Jobs are processed by the main loop similarly to events. They also will be
- * executed in the order which they were added.
- *
- * A good use for them is when you don't want to execute an action immeditately,
- * but want to give the control back to the main loop so that it will call your
- * job callback when jobs start being processed (and if there are other jobs
- * added before yours, they will be processed first). This also gives the chance
- * to other actions in your program to cancel the job before it is started.
- *
- * Examples of using @ref Ecore_Job:
- * @li @ref ecore_job_example_c
+ * @addtogroup Ecore_Job_Group
  *
  * @{
  */
@@ -118,10 +97,6 @@ ecore_job_del(Ecore_Job *job)
  * @}
  */
 
-/**
- * @}
- */
-
 static Eina_Bool
 _ecore_job_event_handler(void *data __UNUSED__, int type __UNUSED__, void *ev)
 {
index 688c2c5..edce31d 100644 (file)
@@ -790,29 +790,7 @@ _ecore_main_loop_shutdown(void)
 }
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Main_Loop_Group Ecore Main Loop functions
- *
- * These functions control the Ecore event handling loop.  This loop is
- * designed to work on embedded systems all the way to large and
- * powerful mutli-cpu workstations.
- *
- * It serialises all system signals and events into a single event
- * queue, that can be easily processed without needing to worry about
- * concurrency.  A properly written, event-driven program using this
- * kind of programming does not need threads.  It makes the program very
- * robust and easy to follow.
- *
- * Here is an example of simple program and its basic event loop flow:
- * @image html prog_flow.png
- *
- * For examples of setting up and using a main loop, see @ref
- * Ecore_Main_Loop_Page.
+ * @addtogroup Ecore_Main_Loop_Group
  *
  * @{
  */
@@ -918,29 +896,6 @@ ecore_main_loop_select_func_get(void)
 }
 
 /**
- * @defgroup Ecore_FD_Handler_Group File Event Handling Functions
- *
- * Functions that deal with file descriptor handlers.
- *
- * The @ref Ecore_Fd_Handler can be used to watch a file descriptor for data
- * available for reading, for the availability to write without blocking, and
- * for errors on the file descriptor.
- *
- * ecore_main_fd_handler_add() is used to setup a handler for a given file
- * descriptor. This file descriptor can be the standard input, a network socket,
- * a stream received through some driver of a hardware decoder, etc. Thus it can
- * contain errors, like a disconnection, a broken pipe, and so, and that's why
- * it's possible to check for these errors with the @ref ECORE_FD_ERROR flag.
- *
- * An @ref Ecore_Fd_Handler can be used to watch on a file descriptor without
- * blocking, still being able to receive events, expire timers, and other watch
- * for other things that happen in the Ecore main loop.
- *
- * Example of use of a file descriptor handler:
- * @li @ref ecore_fd_handler_example_c
- */
-
-/**
  * Adds a callback for activity on the given file descriptor.
  *
  * @p func will be called during the execution of @ref ecore_main_loop_begin
@@ -1236,10 +1191,6 @@ unlock:
  * @}
  */
 
-/**
- * @}
- */
-
 void
 _ecore_main_shutdown(void)
 {
index d3ac605..9e290de 100644 (file)
@@ -89,30 +89,13 @@ struct _Ecore_Pipe
 
 static Eina_Bool _ecore_pipe_read(void *data, Ecore_Fd_Handler *fd_handler);
 
-/**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
 
 /**
- * @addtogroup Ecore_Pipe_Group Pipe wrapper
- *
- * These functions wrap the pipe / write / read functions to easily integrate
- * its use into ecore's main loop.
- *
- * The ecore_pipe_add() function creates file descriptors (sockets on
- * Windows) and attach an handle to the ecore main loop. That handle is
- * called when data is read in the pipe. To write data in the pipe,
- * just call ecore_pipe_write(). When you are done, just call
- * ecore_pipe_del().
+ * @addtogroup Ecore_Pipe_Group
  *
- * For examples see here:
- * @li @ref tutorial_ecore_pipe_gstreamer_example
- * @li @ref tutorial_ecore_pipe_simple_example
+ * @{
  */
 
-
 /**
  * Create two file descriptors (sockets on Windows). Add
  * a callback that will be called when the file descriptor that
@@ -464,10 +447,6 @@ ecore_pipe_write(Ecore_Pipe *p, const void *buffer, unsigned int nbytes)
  * @}
  */
 
-/**
- * @}
- */
-
 /* Private function */
 static void
 _ecore_pipe_unhandle(Ecore_Pipe *p)
index d1ff9ac..cc0ada6 100644 (file)
@@ -191,21 +191,7 @@ _ecore_poller_cb_timer(void *data __UNUSED__)
 }
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Poller_Group Ecore Poll functions
- *
- * These functions are for the need to poll information, but provide a shared
- * abstracted API to pool such polling to minimise wakeup and ensure all the
- * polling happens in as few spots as possible areound a core poll interval.
- * For now only 1 core poller type is supprted: ECORE_POLLER_CORE
- *
- * Example of @ref Ecore_Poller:
- * @li @ref ecore_poller_example_c
+ * @addtogroup Ecore_Poller_Group
  *
  * @{
  */
@@ -434,10 +420,6 @@ ecore_poller_del(Ecore_Poller *poller)
  * @}
  */
 
-/**
- * @}
- */
-
 void
 _ecore_poller_shutdown(void)
 {
index 4f8ae8d..1f972ab 100644 (file)
 static int throttle_val = 0;
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
  * @addtogroup Ecore_Throttle_Group Ecore Throttle functions
  *
  * @{
@@ -96,10 +90,6 @@ ecore_throttle_get(void)
  * @}
  */
 
-/**
- * @}
- */
-
 void
 _ecore_throttle(void)
 {
index 2bd5fa6..fd24446 100644 (file)
@@ -29,13 +29,7 @@ static double _ecore_time_clock_conversion = 1e-9;
 double _ecore_time_loop_time = -1.0;
 
 /**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
-
-/**
- * @addtogroup Ecore_Time_Group Ecore Time functions
+ * @addtogroup Ecore_Time_Group
  *
  * @{
  */
@@ -133,10 +127,6 @@ ecore_loop_time_get(void)
  * @}
  */
 
-/**
- * @}
- */
-
 
 /**********************   Internal methods   ********************************/
 
index d190c7a..9aee32f 100644 (file)
@@ -48,23 +48,9 @@ static Ecore_Timer *suspended = NULL;
 static double       last_check = 0.0;
 static double       precision = 10.0 / 1000000.0;
 
-/**
- * @addtogroup Ecore_Group Ecore - Main Loop and Job Functions.
- *
- * @{
- */
 
 /**
- * @addtogroup Ecore_Time_Group Ecore Time functions
- *
- * Functions that deal with time.  These functions include those that simply
- * retrieve it in a given format, and those that create events based on it.
- *
- * The timer allows callbacks to be called at specific intervals.
- *
- * Examples with functions that deal with time:
- * @li @ref ecore_time_functions_example_c
- * @li @ref ecore_timer_example_c
+ * @addtogroup Ecore_Time_Group
  *
  * @{
  */
@@ -463,10 +449,6 @@ ecore_timer_dump(void)
  * @}
  */
 
-/**
- * @}
- */
-
 Ecore_Timer *
 _ecore_timer_loop_add(double in, Ecore_Task_Cb func, const void *data)
 {