static gboolean port_events_process_cb(gpointer user_data) { node_event_t *ev; G_LOCK (fen_lock); /* Processing g_eventq */ while ((ev = (node_event_t*)g_queue_pop_head (g_eventq)) != NULL) { /* FK_W ("[%s] 0x%p %s\n", __func__, ev, _event_string (ev->e)); */ { gchar *log = _event_strings(ev->e); FK_W ("%s %s %s\n", __func__, NODE_NAME(ev->user_data), log); g_free(log); } #ifdef GIO_COMPILATION /* Use the parent node as a hash, because only the dir_subs in the * parent node should receive MOVE event. */ if (NODE_PARENT(ev->user_data)) { if (ev->e == FILE_RENAME_TO) { g_hash_table_insert(renamed_hash, NODE_PARENT(ev->user_data), ev); g_time_val_add(&ev->rename_tv, RENAME_EVENTS_INTERVAL); continue; } if (ev->e == FILE_RENAME_FROM) { node_event_t *pair_ev; pair_ev = g_hash_table_lookup(renamed_hash, NODE_PARENT(ev->user_data)); if (pair_ev && node_timeval_lt(&ev->ctv, &pair_ev->rename_tv)) { g_hash_table_remove(renamed_hash, NODE_PARENT(ev->user_data)); pair_ev->pair_data = ev->user_data; /* Free ev, exchange pair_ev and ev. */ node_event_delete(ev); ev = pair_ev; } } } #endif #if 0 node_add_event(ev->user_data, ev); #else user_process_events_cb(ev->user_data, ev); #endif } /* Processing the events in renamed_hash. TODO we should delay it and wait * for more possible pair. */ g_hash_table_foreach_remove(renamed_hash, process_renamed_hash_cb, NULL); G_UNLOCK (fen_lock); process_port_event_id = 0; return FALSE; }
/* * node_add_event: * */ static void node_add_event (node_t *f, node_event_t *ev) { FN_W ("%s %d\n", __func__, ev->e); /* Clean the events flag early, because all received events need be * processed in this function. */ NODE_CLE_STATE(f, NODE_STATE_HAS_EVENTS); /* * Node the node has been created, so we can delete create event in * optimizing. To reduce the statings, we add it to Port on discoving * it then emit CREATED event. So we don't need to do anything here. */ if (NODE_NEED_MONITOR(f)) { if (HAS_NO_EXCEPTION_EVENTS(ev->e)) { if (NODE_HAS_STATE(f, NODE_STATE_ASSOCIATED) || port_add(f) == 0) { if ((ev->e & FILE_MODIFIED) && NODE_HAS_FLAG(f, NODE_FLAG_DIR)) { if (f->dir_subs) { node_create_children_snapshot(f, FN_EVENT_CREATED, TRUE); } else { g_hash_table_foreach(f->children, foreach_known_children_scan, NULL); } } } else { /* Emit delete event */ ev->e |= FILE_DELETE; node_adjust_deleted(f); } } else { node_adjust_deleted(f); } /* Send events to clients. */ node_emit_events (f, ev); } else { /* Send events to clients. */ node_emit_events (f, ev); node_try_delete(f); } if (ev->pair_data) { node_t *from = ev->pair_data; g_assert(ev->e == FILE_RENAME_TO); if (NODE_NEED_MONITOR(from)) { /* Clean the events flag, since it may block free this node. */ NODE_CLE_STATE(from, NODE_STATE_HAS_EVENTS); node_adjust_deleted(from); } else { node_try_delete(from); } } node_event_delete (ev); }