54 static GSourceFuncs _netgsource_gsourcefuncs = {
75 GDestroyNotify notify,
79 GMainContext* context,
93 *gsf = _netgsource_gsourcefuncs;
95 gsret = g_source_new(gsf, objsize);
98 g_return_val_if_reached(NULL);
111 ret->
_gfd.events = G_IO_IN|G_IO_ERR|G_IO_HUP;
112 ret->
_gfd.revents = 0;
117 g_source_add_poll(gsret, &ret->
_gfd);
118 g_source_set_priority(gsret, priority);
119 g_source_set_can_recurse(gsret, can_recurse);
121 ret->
_gsourceid = g_source_attach(gsret, context);
125 g_source_remove_poll(gsret, &ret->
_gfd);
126 memset(ret, 0,
sizeof(*ret));
127 g_source_unref(gsret);
130 g_return_val_if_reached(NULL);
143 (void)source; (void)timeout;
156 return ((0 != self->_gfd.revents) || self->_netio->input_queued(self->_netio));
165 GSourceFunc ignore_callback,
166 gpointer ignore_userdata)
171 (void)ignore_callback; (void)ignore_userdata;
172 if ((self->_gfd.revents & (G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL|G_IO_PRI)) == 0) {
173 DEBUGMSG(
"%s.%d: Dispatched due to UNKNOWN REASON: 0x%04x"
176 while(NULL != (gsl = self->_netio->recvframesets(self->_netio, &srcaddr))) {
177 for (; NULL != gsl; gsl = gsl->next) {
180 disp = g_hash_table_lookup(self->_dispatchers, GUINT_TO_POINTER((
size_t)fs->
fstype));
187 g_warning(
"No dispatcher for FrameSet type %d", fs->
fstype);
200 # define __FUNCTION__ "_netgsource_finalize"
204 if (self->_finalize) {
207 self->_finalize(self->_userdata);
209 if (self->_userdata) {
213 self->_userdata = NULL;
217 if (self->_gsfuncs) {
219 self->_gsfuncs = NULL;
222 g_hash_table_unref(self->_dispatchers);
231 NetIO* nio =
self->_netio;
240 NetIO* nio =
self->_netio;
251 g_hash_table_replace(self->_dispatchers, GUINT_TO_POINTER((
size_t)fstype), disp);