[gmime-devel] thread safety and g_mime_init()



Title: thread safety and g_mime_init()

Hi, there,

  In my code, I call g_mime_init() at the start of the process, and then spawn multiple threads to do the parsing with code like this

    fd = open(...)

    gm_stream = g_mime_stream_fs_new(fd);
    gm_parser = g_mime_parser_new_with_stream(gm_stream);
    g_object_unref(gm_stream);

    gm_msg = g_mime_parser_construct_message(gm_parser);
    g_object_unref(gm_parser);

  Once in a while I got
    (process:2547): GLib-GObject-WARNING **: cannot register existing type `GMimeFilterBasic'

  I realized that there is a race condition in g_mime_stream_fs_get_type() which is called from g_mime_stream_fs_new(). If both threads got there at the same time and both got type 0, we would get the above warning. I believe this part of the code is the same in 2.4 through current 2.6.

  I thought g_mime_init() should initialize this type by calling g_mime_stream_fs_get_type() as it does for some other types, and I wonder what is the reason not to include some of the types and what should be the recommended calling sequence here.

  Thanks in advance.

- Junping



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]