Am Thu, 8 Feb 2007 01:14:05 +0100 schrieb Andreas Volz:

Hello,

it seems perhaps I found the problem. :-)

The problem was a bug in my application. Since fixing it I got no more
problems with the pipe.

See:

> Here is the code:
> 
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <stdint.h>
> #include <fcntl.h>
> #include <Ecore.h>
> #include <Evas.h>
> #include <Ecore_Evas.h>
> #include <Edje.h>
> #include <stdbool.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <math.h>
> #include <gps.h>
> 
> 
> 
> Ecore_Evas *ee;
> Evas *evas;
> 
> Evas_Object *o_bg;
> Evas_Object *o_edje;
> Evas_Object *poly;
> 
> pthread_t gps_thread;
> pthread_mutex_t gps_mutex = PTHREAD_MUTEX_INITIALIZER;
> 
> void resize_cb(Ecore_Evas *ee);
> void print_help (char *app_name);
> void gps_callback (struct gps_data_t *gps_data, char *buf,  size_t
> len, int level);
> 
> int _fd_dp_active(void *data, Ecore_Fd_Handler *fdh);
> void dispatcher_init ();
> void dispatcher_signal ();
> 
> struct _Dispatcher
> {
>   int fd_read;
>   int fd_write;
>   void *data;
>   Ecore_Fd_Handler *fd_handler;
>   // callback function??
> };
> 
> typedef struct _Dispatcher Dispatcher;
> 
> Dispatcher dp;
> char edje_signal[13+3]; // holds up to 999 images; should be enough;

13 + 3 = 16

> int main(int argc, char **argv)
> {
>   Evas_Object *o;
>   int edje_w = 240;
>   int edje_h = 240;
>   char *theme;
>   struct stat stat_buf;
>   bool theme_default;
>   char theme_default_name[] = "../data/empass.edj";
>   struct gps_data_t *gpsData;
>   
>   switch (argc)
>   {
>   case 1:
>     theme_default = !stat (theme_default_name, &stat_buf);
>     if (theme_default)
>       theme = theme_default_name;
>     else
>       print_help (argv[0]);
>     break;
>   case 2:
>     theme = argv[1];
>     break;
>   default:
>     print_help (argv[0]);
>     break;
>   }
> 
>   gpsData = gps_open ("localhost", "2947");
> 
>   if (gpsData)
>   {
>     gps_query (gpsData, "rw\n");
>     gps_query (gpsData, "j=1\n");
> 
>     gps_set_callback (gpsData, &gps_callback, &gps_thread);
>   }
>   else
>   {
>     fprintf (stderr, "Warning: running without gpsd support!\n");
>   }
> 
>   if (!ecore_init ())
>   {
>     fprintf (stderr, "Error while initializing Ecore!\n");
>     exit (1);
>   }
>   
>   ecore_app_args_set(argc, (const char **)argv);
>  
>   if (!ecore_evas_init ())
>   {
>     fprintf (stderr, "Error while initializing Ecore_Evas!\n");
>     exit (1);
>   }
> 
>   if (!edje_init())
>   {
>     fprintf (stderr, "Error while initializing Evas!\n");
>     exit (1);
>   }
> 
>   dispatcher_init ();
> 
>   // TODO: warum geht Xrender auf dem Latop nicht?
>    /*if
> (ecore_evas_engine_type_supported_get(ECORE_EVAS_ENGINE_XRENDER_X11))
> ee = ecore_evas_xrender_x11_new(NULL, 0, 0, 0, edje_w, edje_h); else
>     {*/
>   if
> (ecore_evas_engine_type_supported_get(ECORE_EVAS_ENGINE_SOFTWARE_X11))
> ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, edje_w, edje_h); //}
>   if (!ee)
>   {
>     if
> (ecore_evas_engine_type_supported_get(ECORE_EVAS_ENGINE_SOFTWARE_FB))
> ee = ecore_evas_fb_new(NULL, 270, edje_w, edje_h); if (!ee)
>       ee = ecore_evas_gl_x11_new(NULL, 0, 0, 0, edje_w, edje_h);
>     if (!ee)
>     {
>       fprintf(stderr, "Cannot create Canvas!\n");
>       exit(-1);
>     }
>   }
> 
>   ecore_evas_shaped_set (ee, 1);
>   ecore_evas_title_set (ee, "empass");
> 
>   //ecore_evas_borderless_set(ee, 1);
>   ecore_evas_sticky_set(ee, 1);
> 
>   evas = ecore_evas_get(ee);
>   evas_image_cache_set(evas, 8192 * 1024);
>   evas_font_cache_set(evas, 512 * 1024);
> 
>   o = evas_object_rectangle_add(evas);
>   evas_object_move(o, 0, 0);
>   evas_object_resize(o, edje_w, edje_h);
> 
>   evas_object_color_set(o, 0, 0, 0, 0);
>   evas_object_focus_set(o, 1);
> 
>   evas_object_show(o);
>   o_bg = o;
> 
>   o = edje_object_add(evas);
> 
>   edje_object_file_set(o, theme, "main");
>   evas_object_move(o, 0, 0);
>   evas_object_resize(o, edje_w, edje_h);
> 
>   evas_object_show(o);
>   o_edje = o;
> 
>   ecore_evas_callback_resize_set(ee, resize_cb);
>   ecore_evas_show(ee);
> 
>   ecore_main_loop_begin();
> 
>   edje_shutdown();
>   ecore_evas_shutdown();
>   ecore_shutdown();
> 
>   return 0;
> }
> 
> void dispatcher_init ()
> {
>   int fd[2];
> 
>    /* Create the file descriptors */
>   if (pipe(fd) == 0) 
>   {
>     dp.fd_read = fd[0];
>     dp.fd_write = fd[1];
>     fcntl(dp.fd_read, F_SETFL, O_NONBLOCK);
>     dp.fd_handler = ecore_main_fd_handler_add (dp.fd_read,
>                                                ECORE_FD_READ,
>                                                _fd_dp_active,
>                                                &dp,
>                                                NULL, NULL);
>     ecore_main_fd_handler_active_set(dp.fd_handler, ECORE_FD_READ);
>   }
>   else
>   {
>     fprintf (stderr, "pipe() failed\n");
>     exit (1);
>   }
> }
> 
> int _fd_dp_active (void *data, Ecore_Fd_Handler *fdh)
> {
>   int fd;
>   int len;
>   char buf[1];
>   char edje_signal_local[13+3];
>   unsigned char *frame_data;
>   Dispatcher *dp;
> 
>   printf ("asynchronous data arrived\n");
> 
>   dp = data;
>   fd = ecore_main_fd_handler_fd_get(fdh);
> 
>   // reads all events and use only one
>   while (read (fd, buf, sizeof (buf)) > 0);
> 
>   pthread_mutex_lock (&gps_mutex);
>   strncpy (edje_signal_local, edje_signal, 13+3);

13 + 3 = 16

>   pthread_mutex_unlock (&gps_mutex);
>  
>   edje_object_signal_emit (o_edje, edje_signal_local, "degree");
> 
>   return 1;
> }
> 
> void dispatcher_signal ()
> {
>   write(dp.fd_write, "1", 2);
> }
> 
> void gps_callback (struct gps_data_t *gps_data, char *buf,  size_t
> len, int level) {
>   struct gps_fix_t *gps_fix;
>   double track;
>   int track_part;
>   char *gps_buf[2];
> 
>   gps_fix = &gps_data->fix;
>   track = gps_fix->track;
> 
>   // test if track != NaN
> 
>   track_part = (int) ceil (track); // use round()  
> 
>   // TODO: only update if new GPS position and direction!
> 
>   // dangerous -> use sprintf and length check later!

-> I meant "snprintf" here and better I had done it. This had saved me
some hours of searching this bug...

>   pthread_mutex_lock (&gps_mutex);
>   sprintf (edje_signal, "signal_degree%.3d", track_part);

length ("signal_degree%.3d") ==>  17 !!

I forgot to calculate the '\0' :-)

>   pthread_mutex_unlock (&gps_mutex);
> 
>   printf ("degree: %s\n", edje_signal);
>     
>   dispatcher_signal ();
> 
>   printf ("Track: %f\n", track);
> }
> 
> void print_help (char *app_name)
> {
>   printf("Usage: %s <default.edj>\n", app_name);
>   exit(-1);
> }
> 
> void resize_cb(Ecore_Evas *ee)
> {
>   Evas_Coord x, y, w, h;
> 
>   ecore_evas_geometry_get (ee, &x, &y, &w, &h);
> 
>   if (w < h)
>   {
>     evas_object_resize(o_bg, w, w);
>     evas_object_resize(o_edje, w, w);
>   }
>   else
>   {
>     evas_object_resize(o_bg, h, h);
>     evas_object_resize(o_edje, h, h);
>   }
> }

So I think I destroyed some internal fd data with writing over the
array bounds.

regards
Andreas

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to