Problem using g_io_add_watch

View: New views
5 Messages — Rating Filter:   Alert me  

Problem using g_io_add_watch

by sinsedrix :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello,

I'm having trouble using GIOChannel g_io_add_watch function.

* A sub-library I use opens and writes to a file like this:

    FILE * f = fopen("./LogFile", "w+");
    ...
    fprintf(f, "LogMessage\n");

* In my library, I get a GIOChannel on this file and try to add a watch on
it like this:

    GIOChannel * io = g_io_channel_win32_new_fd(fileno(f));
    ...
    g_io_add_watch(io, G_IO_IN, io_func, data);

Problem: When I call g_io_add_watch my application is crashing with no
explanation.

Goal: I'd like to update a GtkTextBuffer with a GIOFunc ("io_func").

(If I do not call this function, GIOChannel works fine)

Configuration:
- OS: Windows Vista (please do not whip me or tell me to go under linux).
- IDE: Eclipse
- Compiler: mingw32-gcc
- Make: mingw32-make

PS: I had a problem with GIOChannel before because I was using Cygwin gcc to
compile (linking with kernel32 and user32) and I read somewhere that I
should use MinGW gcc (linking with wsock32) instead, is it wright ?
And sorry for my english, I am French.


Thanks in advance.
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@...
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Re: Problem using g_io_add_watch

by Tor Lillqvist :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

> Problem: When I call g_io_add_watch my application is crashing with no explanation.

Can you provide a *minimal* but *complete* sample program (just one
source file) that crashes in the same way?

> PS: I had a problem with GIOChannel before because I was using Cygwin gcc to
> compile (linking with kernel32 and user32) and I read somewhere that I
> should use MinGW gcc

If you use the Windows GLib packages from ftp.gnome.org, then yes,
they are not for use by Cygwin programs, so you should use mingw to
compile code that uses them.

>  (linking with wsock32) instead, is it right ?

wsock32 in particular has little to do with it. Cygwin is just a
completely different operating system (even if it happens to run on
top of Windows), so you should not use non-Cygwin libraries in Cygwin
programs. (Unless in very special cases when you know exactly what you
are doing. GLib is not such a case.)

--tml
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@...
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Re: Problem using g_io_add_watch

by sinsedrix :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello,

Problem: When I call g_io_add_watch my application is crashing with no
explanation.

Here is the shorter file I could write to expose my probem using
g_io_add_watch :

==========================================================
#include <stdio.h>

#include <gtk/gtk.h>

static FILE * MyLogFile = NULL;

void write_in_file(GtkButton * b, gpointer user_data) {
    static int i = 0;
    fprintf(MyLogFile, "Something written %d\n", i);
    i++;
}

gboolean            on_buffer_in                        (GIOChannel *source,
                                                         GIOCondition
condition,
                                                         gpointer data) {
    gchar ** str_return = NULL;
    gsize * length = NULL;
    GtkTextIter end;
    GError * error = NULL;
    GtkTextBuffer * buffer = (GtkTextBuffer *)data;

    g_io_channel_read_to_end(source, str_return, length, &error);
    gtk_text_buffer_get_end_iter (buffer, &end);
    gtk_text_buffer_insert(buffer, &end, *str_return, *length);

    return FALSE;
}

void my_exit() {
    fclose(MyLogFile);
    gtk_exit(0);
}

GtkWidget * create_window(void) {
    GtkWidget *window;
    GtkWidget *vbox_win;
    GtkWidget *button;

    GtkWidget *log_view;
    GtkTextBuffer *log_buffer;
    GIOChannel * log_channel;

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "TestGIO");

    vbox_win = gtk_vbox_new (FALSE, 5);
    gtk_widget_show (vbox_win);
    gtk_container_add (GTK_CONTAINER (window), vbox_win);

    log_buffer = gtk_text_buffer_new(NULL);
    log_view = gtk_text_view_new_with_buffer(log_buffer);
    gtk_widget_show(log_view);
    gtk_text_view_set_editable(GTK_TEXT_VIEW(log_view), FALSE);
    gtk_box_pack_start (GTK_BOX (vbox_win), log_view, TRUE, TRUE, 0);

#ifdef MSDOS
    log_channel = g_io_channel_win32_new_fd(fileno(MyLogFile));
    g_debug("Windows Log file %d %p", fileno(MyLogFile), log_channel);
#else
    log_channel = g_io_channel_unix_new (fileno(MyLogFile));
    g_debug("Unix Log file %d %p", fileno(MyLogFile), log_channel);
#endif

    // The line that crashes :
    g_io_add_watch(log_channel, G_IO_IN, on_buffer_in, (gpointer)
log_buffer);

    button = gtk_button_new_with_label("Write something");
    gtk_widget_show(button);
    gtk_box_pack_start (GTK_BOX (vbox_win), button, FALSE, FALSE, 0);

    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK
(write_in_file), NULL);

    return window;
}

int
main (int argc, char *argv[])
{
  GtkWidget *window;

  gtk_set_locale ();
  gtk_init (&argc, &argv);

  MyLogFile = fopen("./MyLogFile.txt", "w+");
  g_debug("Log file number : %d", fileno(MyLogFile));

  window = create_window ();
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK (my_exit), NULL);
  gtk_widget_show (window);

  gtk_main ();
  return 0;
}
========================================================

2008/6/19 Tor Lillqvist <tml@...>:

> > Problem: When I call g_io_add_watch my application is crashing with no
> explanation.
>
> Can you provide a *minimal* but *complete* sample program (just one
> source file) that crashes in the same way?
>
> > PS: I had a problem with GIOChannel before because I was using Cygwin gcc
> to
> > compile (linking with kernel32 and user32) and I read somewhere that I
> > should use MinGW gcc
>
> If you use the Windows GLib packages from ftp.gnome.org, then yes,
> they are not for use by Cygwin programs, so you should use mingw to
> compile code that uses them.
>
> >  (linking with wsock32) instead, is it right ?
>
> wsock32 in particular has little to do with it. Cygwin is just a
> completely different operating system (even if it happens to run on
> top of Windows), so you should not use non-Cygwin libraries in Cygwin
> programs. (Unless in very special cases when you know exactly what you
> are doing. GLib is not such a case.)
>
> --tml
>
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@...
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Re: Problem using g_io_add_watch

by sinsedrix :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Oups,

I realised that my IO callback function was not well written, so I wrote a
new one.

PROBLEM : Now the problem is that this IO callback is called continuously in
main loop even if nothing
is written in the watched file.

I noticed that if I return FALSE, the callback is called once but is no
longer called on a
write on the watched file.

Should I do some SEEK operation on the file or on the GIOChannel ?

Thanks

Here is the new callback :

======================================================
gboolean
io_callback_end(GIOChannel *source, GIOCondition condition, gpointer data) {
    gchar * str_return;
    gsize length;
    GtkTextIter end;
    GError * error = NULL;
    GtkTextBuffer * buffer = (GtkTextBuffer *)data;

    if(condition == G_IO_IN) {
        GIOStatus status = g_io_channel_read_to_end(source, &str_return,
&length, &error);
        gtk_text_buffer_get_end_iter (buffer, &end);
        gtk_text_buffer_insert(buffer, &end, str_return, length);

        switch(status) {
        case G_IO_STATUS_ERROR:
            g_debug("G_IO_STATUS_ERROR : on_buffer_in");
            break;
        case G_IO_STATUS_NORMAL:
            g_debug("G_IO_STATUS_NORMAL : on_buffer_in %s", str_return);
            break;
        default:
            g_debug("Should not be here : on_buffer_in");
        }

        g_free(str_return);
    }
    return TRUE;
}
======================================================


2008/6/25 sinsedrix <sinsedrix@...>:

> Hello,
>
> Problem: When I call g_io_add_watch my application is crashing with no
> explanation.
>
> Here is the shorter file I could write to expose my probem using
> g_io_add_watch :
>
> ==========================================================
> #include <stdio.h>
>
> #include <gtk/gtk.h>
>
> static FILE * MyLogFile = NULL;
>
> void write_in_file(GtkButton * b, gpointer user_data) {
>     static int i = 0;
>     fprintf(MyLogFile, "Something written %d\n", i);
>     i++;
> }
>
> gboolean            on_buffer_in                        (GIOChannel
> *source,
>                                                          GIOCondition
> condition,
>                                                          gpointer data) {
>     gchar ** str_return = NULL;
>     gsize * length = NULL;
>     GtkTextIter end;
>     GError * error = NULL;
>     GtkTextBuffer * buffer = (GtkTextBuffer *)data;
>
>     g_io_channel_read_to_end(source, str_return, length, &error);
>     gtk_text_buffer_get_end_iter (buffer, &end);
>     gtk_text_buffer_insert(buffer, &end, *str_return, *length);
>
>     return FALSE;
> }
>
> void my_exit() {
>     fclose(MyLogFile);
>     gtk_exit(0);
> }
>
> GtkWidget * create_window(void) {
>     GtkWidget *window;
>     GtkWidget *vbox_win;
>     GtkWidget *button;
>
>     GtkWidget *log_view;
>     GtkTextBuffer *log_buffer;
>     GIOChannel * log_channel;
>
>     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
>     gtk_window_set_title (GTK_WINDOW (window), "TestGIO");
>
>     vbox_win = gtk_vbox_new (FALSE, 5);
>     gtk_widget_show (vbox_win);
>     gtk_container_add (GTK_CONTAINER (window), vbox_win);
>
>     log_buffer = gtk_text_buffer_new(NULL);
>     log_view = gtk_text_view_new_with_buffer(log_buffer);
>     gtk_widget_show(log_view);
>     gtk_text_view_set_editable(GTK_TEXT_VIEW(log_view), FALSE);
>     gtk_box_pack_start (GTK_BOX (vbox_win), log_view, TRUE, TRUE, 0);
>
> #ifdef MSDOS
>     log_channel = g_io_channel_win32_new_fd(fileno(MyLogFile));
>     g_debug("Windows Log file %d %p", fileno(MyLogFile), log_channel);
> #else
>     log_channel = g_io_channel_unix_new (fileno(MyLogFile));
>     g_debug("Unix Log file %d %p", fileno(MyLogFile), log_channel);
> #endif
>
>     // The line that crashes :
>     g_io_add_watch(log_channel, G_IO_IN, on_buffer_in, (gpointer)
> log_buffer);
>
>     button = gtk_button_new_with_label("Write something");
>     gtk_widget_show(button);
>     gtk_box_pack_start (GTK_BOX (vbox_win), button, FALSE, FALSE, 0);
>
>     g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK
> (write_in_file), NULL);
>
>     return window;
> }
>
> int
> main (int argc, char *argv[])
> {
>   GtkWidget *window;
>
>   gtk_set_locale ();
>   gtk_init (&argc, &argv);
>
>   MyLogFile = fopen("./MyLogFile.txt", "w+");
>   g_debug("Log file number : %d", fileno(MyLogFile));
>
>   window = create_window ();
>   g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK (my_exit),
> NULL);
>   gtk_widget_show (window);
>
>   gtk_main ();
>   return 0;
> }
> ========================================================
>
> 2008/6/19 Tor Lillqvist <tml@...>:
>
> > Problem: When I call g_io_add_watch my application is crashing with no
>> explanation.
>>
>> Can you provide a *minimal* but *complete* sample program (just one
>> source file) that crashes in the same way?
>>
>> > PS: I had a problem with GIOChannel before because I was using Cygwin
>> gcc to
>> > compile (linking with kernel32 and user32) and I read somewhere that I
>> > should use MinGW gcc
>>
>> If you use the Windows GLib packages from ftp.gnome.org, then yes,
>> they are not for use by Cygwin programs, so you should use mingw to
>> compile code that uses them.
>>
>> >  (linking with wsock32) instead, is it right ?
>>
>> wsock32 in particular has little to do with it. Cygwin is just a
>> completely different operating system (even if it happens to run on
>> top of Windows), so you should not use non-Cygwin libraries in Cygwin
>> programs. (Unless in very special cases when you know exactly what you
>> are doing. GLib is not such a case.)
>>
>> --tml
>>
>
>
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@...
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Re: Problem using g_io_add_watch

by Rosfran Borges :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi,
I can see something wrong in your code: you do not have to check the
GIOCondition using the "==" operator, just because its content is a XORed
sequence of integers. If you do something like this: if ( ( condition &
G_IO_IN ) != 0 ), everything will gonna be alright. The condition variable
is a kind of "bit field", and G_IO_IN may be one of the checked bits, among
many others (G_IO_OUT, G_IO_PRI, G_IO_ERR).

Yet, I suggest you to do the following: add the G_IO_HUP to the command
g_io_add_watch, and return the function if this buffer condition had been
received. For example:

g_io_add_watch(log_channel, G_IO_IN | G_IO_HUP, on_buffer_in,
(gpointer)log_buffer);

And inside the iochannel callback, check for the G_IO_HUP and return if this
condition is checked...

[]'s
Rosfran Borges

On Wed, Jun 25, 2008 at 2:45 PM, sinsedrix <sinsedrix@...> wrote:

> Oups,
>
> I realised that my IO callback function was not well written, so I wrote a
> new one.
>
> PROBLEM : Now the problem is that this IO callback is called continuously
> in
> main loop even if nothing
> is written in the watched file.
>
> I noticed that if I return FALSE, the callback is called once but is no
> longer called on a
> write on the watched file.
>
> Should I do some SEEK operation on the file or on the GIOChannel ?
>
> Thanks
>
> Here is the new callback :
>
> ======================================================
> gboolean
> io_callback_end(GIOChannel *source, GIOCondition condition, gpointer data)
> {
>    gchar * str_return;
>    gsize length;
>     GtkTextIter end;
>    GError * error = NULL;
>    GtkTextBuffer * buffer = (GtkTextBuffer *)data;
>
>     if(condition == G_IO_IN) {
>        GIOStatus status = g_io_channel_read_to_end(source, &str_return,
> &length, &error);
>        gtk_text_buffer_get_end_iter (buffer, &end);
>        gtk_text_buffer_insert(buffer, &end, str_return, length);
>
>         switch(status) {
>        case G_IO_STATUS_ERROR:
>            g_debug("G_IO_STATUS_ERROR : on_buffer_in");
>            break;
>        case G_IO_STATUS_NORMAL:
>            g_debug("G_IO_STATUS_NORMAL : on_buffer_in %s", str_return);
>            break;
>        default:
>            g_debug("Should not be here : on_buffer_in");
>        }
>
>        g_free(str_return);
>    }
>    return TRUE;
> }
> ======================================================
>
>
> 2008/6/25 sinsedrix <sinsedrix@...>:
>
> > Hello,
> >
> > Problem: When I call g_io_add_watch my application is crashing with no
> > explanation.
> >
> > Here is the shorter file I could write to expose my probem using
> > g_io_add_watch :
> >
> > ==========================================================
> > #include <stdio.h>
> >
> > #include <gtk/gtk.h>
> >
> > static FILE * MyLogFile = NULL;
> >
> > void write_in_file(GtkButton * b, gpointer user_data) {
> >     static int i = 0;
> >     fprintf(MyLogFile, "Something written %d\n", i);
> >     i++;
> > }
> >
> > gboolean            on_buffer_in                        (GIOChannel
> > *source,
> >                                                          GIOCondition
> > condition,
> >                                                          gpointer data) {
> >     gchar ** str_return = NULL;
> >     gsize * length = NULL;
> >     GtkTextIter end;
> >     GError * error = NULL;
> >     GtkTextBuffer * buffer = (GtkTextBuffer *)data;
> >
> >     g_io_channel_read_to_end(source, str_return, length, &error);
> >     gtk_text_buffer_get_end_iter (buffer, &end);
> >     gtk_text_buffer_insert(buffer, &end, *str_return, *length);
> >
> >     return FALSE;
> > }
> >
> > void my_exit() {
> >     fclose(MyLogFile);
> >     gtk_exit(0);
> > }
> >
> > GtkWidget * create_window(void) {
> >     GtkWidget *window;
> >     GtkWidget *vbox_win;
> >     GtkWidget *button;
> >
> >     GtkWidget *log_view;
> >     GtkTextBuffer *log_buffer;
> >     GIOChannel * log_channel;
> >
> >     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
> >     gtk_window_set_title (GTK_WINDOW (window), "TestGIO");
> >
> >     vbox_win = gtk_vbox_new (FALSE, 5);
> >     gtk_widget_show (vbox_win);
> >     gtk_container_add (GTK_CONTAINER (window), vbox_win);
> >
> >     log_buffer = gtk_text_buffer_new(NULL);
> >     log_view = gtk_text_view_new_with_buffer(log_buffer);
> >     gtk_widget_show(log_view);
> >     gtk_text_view_set_editable(GTK_TEXT_VIEW(log_view), FALSE);
> >     gtk_box_pack_start (GTK_BOX (vbox_win), log_view, TRUE, TRUE, 0);
> >
> > #ifdef MSDOS
> >     log_channel = g_io_channel_win32_new_fd(fileno(MyLogFile));
> >     g_debug("Windows Log file %d %p", fileno(MyLogFile), log_channel);
> > #else
> >     log_channel = g_io_channel_unix_new (fileno(MyLogFile));
> >     g_debug("Unix Log file %d %p", fileno(MyLogFile), log_channel);
> > #endif
> >
> >     // The line that crashes :
> >     g_io_add_watch(log_channel, G_IO_IN, on_buffer_in, (gpointer)
> > log_buffer);
> >
> >     button = gtk_button_new_with_label("Write something");
> >     gtk_widget_show(button);
> >     gtk_box_pack_start (GTK_BOX (vbox_win), button, FALSE, FALSE, 0);
> >
> >     g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK
> > (write_in_file), NULL);
> >
> >     return window;
> > }
> >
> > int
> > main (int argc, char *argv[])
> > {
> >   GtkWidget *window;
> >
> >   gtk_set_locale ();
> >   gtk_init (&argc, &argv);
> >
> >   MyLogFile = fopen("./MyLogFile.txt", "w+");
> >   g_debug("Log file number : %d", fileno(MyLogFile));
> >
> >   window = create_window ();
> >   g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK (my_exit),
> > NULL);
> >   gtk_widget_show (window);
> >
> >   gtk_main ();
> >   return 0;
> > }
> > ========================================================
> >
> > 2008/6/19 Tor Lillqvist <tml@...>:
> >
> > > Problem: When I call g_io_add_watch my application is crashing with no
> >> explanation.
> >>
> >> Can you provide a *minimal* but *complete* sample program (just one
> >> source file) that crashes in the same way?
> >>
> >> > PS: I had a problem with GIOChannel before because I was using Cygwin
> >> gcc to
> >> > compile (linking with kernel32 and user32) and I read somewhere that I
> >> > should use MinGW gcc
> >>
> >> If you use the Windows GLib packages from ftp.gnome.org, then yes,
> >> they are not for use by Cygwin programs, so you should use mingw to
> >> compile code that uses them.
> >>
> >> >  (linking with wsock32) instead, is it right ?
> >>
> >> wsock32 in particular has little to do with it. Cygwin is just a
> >> completely different operating system (even if it happens to run on
> >> top of Windows), so you should not use non-Cygwin libraries in Cygwin
> >> programs. (Unless in very special cases when you know exactly what you
> >> are doing. GLib is not such a case.)
> >>
> >> --tml
> >>
> >
> >
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@...
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@...
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list