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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel