On Thu, Apr 24, 2008 at 1:57 PM, Cedric BAIL <[EMAIL PROTECTED]> wrote:
> On Wed, Apr 23, 2008 at 4:45 PM, The Rasterman Carsten Haitzler
>  <[EMAIL PROTECTED]> wrote:
>  > On Tue, 15 Apr 2008 13:15:13 -0300 "Gustavo Sverzut Barbieri"
>  >  <[EMAIL PROTECTED]> babbled:
>  >  > For simplicity, I would just process one message per callback from
>  >  > ecore_fd_main... but we can also use a poll/select inside this
>  >  > function and do what you want, without the need to fcntl to
>  >  > NONBLOCKING.
>  >
>  >  just read a buffer of messages - if we don't get a complete message, 
> store the
>  >  partial one and keep it until the next call to process events then 
> complete the
>  >  message fetch.
>
>  Ok. Here is an updated patch. The fd is still nonblocking and on
>  partial read, it should be able to just restart cleany at a later
>  time. You will now pass a function pointer so that you can call
>  whatever kind of code you want (I doubt we really need something else
>  than evas_object_event_callback). I also make it optional. Some more
>  comments ?

configure: s/build_async/build_async_events/g; make it default on (use
"auto" to check for pthread, "yes" would fail without pthread and "no"
is... well no).


   +static pthread_mutex_t _mutex;

i think it's safer to just initialize the mutex here using (and remove
the destroy call):

   static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER;


evas_async_events_process(void):

   +   if (_fd_read != -1)
   +     do

reverse this logic: if (_d_read == -1) return 0;
this will avoid the unnecessary nesting and would remove the bug that
it have today: "check" might be uninitialized in this function.
    Actually write the whole function like (more beautiful imho):

   if (_fd_read == -1)
     return -1;

   count = 0;
   while ((check = read(_fd_read, ((char *)&current) + size,
sizeof(current) - size)) > 0)
     {
        size += check;
        if (size < sizeof(current))
          continue;

        if (current.func)
          current.func(current.target, current.type, current.event_info);
         size = 0;
          count++;
     }
   if (check < 0) {
       ...;
       _fd_read = -1;
   }
   return count;


For evas_async_events_put, also reverse the logic, I'd write:

   if (!func) return 0;
   if (_fd_write == -1) return 0;

   ...
   pthread_mutex_lock(&_mutex);
   do { ... } while ( ... )
   pthread_mutex_unlock(&_mutex);

this would not do unneeded locks and avoid nested code.
Also, note that the function return "Evas_Bool" but in the version
without BUILD_ASYNC_EVENTS you return -1.


Aside these minor, mostly cosmetic, things, it's ready for inclusion :-)

-- 
Gustavo Sverzut Barbieri
http://profusion.mobi
Embedded Systems
--------------------------------------
MSN: [EMAIL PROTECTED]
Skype: gsbarbieri
Mobile: +55 (81) 9927 0010

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to