hey,

The attached patch add the method ecore_pipe_read() to ecore.

During the creation of the Ecore_Pipe the handler can be null. In this case
the readable side of the pipe will block. I use it to pause a thread during
an operation.
The thread send a data to the main_loop with a pipe. Then the thread use
ecore_pipe_read() and will block. When the main loop has terminate his
operation, it write a data in the pipe and the thread is unblock.
Consequently the main loop can works on a data used by the thread as the
thread is in pause.


Please review the patch, maybe you want to do this in an other way.

-- 
Regards.
Index: ecore_pipe.c
===================================================================
--- ecore_pipe.c        (revision 42487)
+++ ecore_pipe.c        (working copy)
@@ -1,4 +1,47 @@
 /*
+pe" 
============================================================================
+" Netrw Directory Listing                                        (netrw v125)
+"   /home/Watchwolf/Projects/e/trunk/ecore/src/lib/ecore
+"   Sorted by      name
+"   Sort sequence: 
[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
+"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:exec
+" ============================================================================
+../
+.svn/
+Ecore.h
+Ecore_Data.h
+Ecore_Getopt.h
+Ecore_Str.h
+ecore_private.h
+ecore.c
+ecore_anim.c
+ecore_app.c
+ecore_events.c
+ecore_exe.c
+ecore_getopt.c
+ecore_hash.c
+ecore_idle_enterer.c
+ecore_idle_exiter.c
+ecore_idler.c
+ecore_list.c
+ecore_main.c
+ecore_path.c
+ecore_pipe.c
+ecore_plugin.c
+ecore_poll.c
+ecore_sheap.c
+ecore_signal.c
+ecore_str.c
+ecore_strbuf.c
+ecore_strings.c
+ecore_thread.c
+ecore_time.c
+ecore_timer.c
+ecore_tree.c
+ecore_value.c
+.cvsignore
+Makefile.am
+.Ecore.h.swp
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
 
@@ -273,7 +316,13 @@
  * Create two file descriptors (sockets on Windows). Add
  * a callback that will be called when the file descriptor that
  * is listened receives data. An event is also put in the event
- * queue when data is received.
+ * queue when data is received. <br>
+ * If handler is null, no handler will be set and the function
+ * ecore_pipe_read() can be used to read the pipe. In this case
+ * the read operation is block until there is something to read.
+ * This configuration can be used to send information from the
+ * main loop to a thread. As the read operation block, the thread
+ * will be in pause until the main loop send a data.
  *
  * @param handler The handler called when data is received.
  * @param data    Data to pass to @p handler when it is called.
@@ -288,8 +337,6 @@
    Ecore_Pipe *p;
    int         fds[2];
 
-   if (!handler) return NULL;
-
    p = (Ecore_Pipe *)calloc(1, sizeof(Ecore_Pipe));
    if (!p) return NULL;
 
@@ -306,13 +353,15 @@
    p->data = data;
 
 #ifndef _WIN32
-   fcntl(p->fd_read, F_SETFL, O_NONBLOCK);
+   if(handler)
+     fcntl(p->fd_read, F_SETFL, O_NONBLOCK);
 #endif /* _WIN32 */
-   p->fd_handler = ecore_main_fd_handler_add(p->fd_read,
-                                          ECORE_FD_READ,
-                                          _ecore_pipe_read,
-                                          p,
-                                          NULL, NULL);
+   if(handler)
+     p->fd_handler = ecore_main_fd_handler_add(p->fd_read,
+          ECORE_FD_READ,
+          _ecore_pipe_read,
+          p,
+          NULL, NULL);
    return p;
 }
 
@@ -445,7 +494,7 @@
        ret = pipe_write(p->fd_write,
                          ((unsigned char *)buffer) + already_written,
                          nbytes - already_written);
-        
+
        if (ret == (ssize_t)(nbytes - already_written))
          return TRUE;
        else if (ret >= 0)
@@ -474,6 +523,61 @@
    return FALSE;
 }
 
+/**
+ * Read the data from the file descriptor. The operation block
+ * until a data is received.
+ *
+ * @param p      The Ecore_Pipe object.
+ * @param buffer The data read from the pipe.
+ * @param nbytes The size of the @p buffer in bytes.
+ * @return       Returns the size of the data read
+ * @ingroup Ecore_Pipe_Group
+ */
+EAPI int
+ecore_pipe_read(Ecore_Pipe *p, void *buffer, unsigned int nbytes)
+{
+   ssize_t ret = 0;
+
+   if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
+     {
+       ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_write");
+       return FALSE;
+     }
+
+   if (p->fd_read == PIPE_FD_INVALID) return FALSE;
+
+   ret = pipe_read(p->fd_read,
+        ((unsigned char *)buffer),
+        nbytes);
+
+   if (ret >= 0)
+     {
+       return ret;
+     }
+   else if (ret == 0)
+     {
+       pipe_close(p->fd_read);
+       p->fd_read = PIPE_FD_INVALID;
+       return FALSE;
+     }
+   else if (ret == PIPE_FD_ERROR && errno == EPIPE)
+     {
+       pipe_close(p->fd_read);
+       p->fd_read = PIPE_FD_INVALID;
+       return FALSE;
+     }
+   else if ((ret == PIPE_FD_ERROR) && ((errno == EINTR) || (errno == EAGAIN)))
+     printf("WAIT ?\n");
+   else
+     {
+       fprintf(stderr, "An unhandled error (ret: %d errno: %d)"
+             "occured while reading to the pipe the length\n",
+             ret, errno);
+     }
+
+   return FALSE;
+}
+
 /* Private function */
 
 static int
@@ -532,7 +636,7 @@
        ret = pipe_read(p->fd_read,
                         ((unsigned char *)p->passed_data) + p->already_read,
                         p->len - p->already_read);
-        
+
        /* catch the non error case first */
        if (ret == (ssize_t)(p->len - p->already_read))
          {
@@ -567,6 +671,6 @@
          }
      }
    while (ecore_time_get() - start_time < ecore_animator_frametime_get());
-   
+
    return ECORE_CALLBACK_RENEW;
 }
Index: Ecore.h
===================================================================
--- Ecore.h     (revision 42487)
+++ Ecore.h     (working copy)
@@ -85,7 +85,7 @@
 #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 consistant with the rest of ecore). */
    EAPI extern int ECORE_EXE_EVENT_DATA; /**< Data from a child process. */
@@ -299,6 +299,7 @@
    EAPI Ecore_Pipe  *ecore_pipe_add(void (*handler) (void *data, void *buffer, 
unsigned int nbyte), const void *data);
    EAPI void        *ecore_pipe_del(Ecore_Pipe *p);
    EAPI int          ecore_pipe_write(Ecore_Pipe *p, const void *buffer, 
unsigned int nbytes);
+   EAPI int          ecore_pipe_read(Ecore_Pipe *p, void *buffer, unsigned int 
nbytes);
    EAPI void         ecore_pipe_write_close(Ecore_Pipe *p);
    EAPI void         ecore_pipe_read_close(Ecore_Pipe *p);
 
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to