在GLib中创建一个新的GSource

时间:2014-01-29 14:57:01

标签: c glib

我试图理解当我致电g_source_new时的含义。最新的API文档(此时为2.38.2)on the call只是说:

  

创建一个新的GSource结构。指定大小以允许创建从GSource派生的包含其他数据的结构。传入的大小必须至少为sizeof(GSource)。

我试图了解调用此API是否意味着我正在实例化GSource的新实例,或者是否打算注册新的GSource类型。

基本问题是:我是否允许使用GSource创建一个新的g_source_new,然后将其应用于任意数量的上下文(通过g_source_attach)?或者,即使尝试将我已定义的GSource应用于多个上下文,我是否必须同时使用这两个函数?

1 个答案:

答案 0 :(得分:4)

从源定义看起来,您只能将GSource附加到一个GMainContext

struct _GSource
{
  /*< private >*/
  gpointer callback_data;
  GSourceCallbackFuncs *callback_funcs;

  const GSourceFuncs *source_funcs;
  guint ref_count;

  GMainContext *context;    // <<<<<

  gint priority;
  guint flags;
  guint source_id;

  GSList *poll_fds;

  GSource *prev;
  GSource *next;

  char    *name;

  GSourcePrivate *priv;
};

看看

static guint
g_source_attach_unlocked (GSource      *source,
                      GMainContext *context,
                      gboolean      do_wakeup)

会告诉您只会关联相关的GMainContext

派生GSource用法示例:https://github.com/chergert/iris/blob/master/iris/iris-gsource.c