Fd_Flags flags;
Fd_Watch_Cb callback;
const void *user_data;
+ Eina_Bool deleted : 1;
};
typedef struct _Watch_Data Watch_Data;
static int inotify_fd = -1;
static struct sockaddr_un socket_local;
static Eina_Hash *watch_list;
+static Eina_List *deleted_watch_list;
static Eina_Hash *inotify_path_hash;
static Eina_Hash *inotify_id_hash;
static Eina_Bool running;
static void
_watch_data_free_cb(void *data)
{
- free(data);
+ Watch_Data *wd = data;
+ wd->deleted = EINA_TRUE;
+ deleted_watch_list = eina_list_append(deleted_watch_list, wd);
}
Eina_Bool
void
cserve2_main_loop_finish(void)
{
+ Watch_Data *wd;
+
_socketfd_finish();
_signalfd_finish();
_inotifyfd_finish();
eina_hash_free(watch_list);
+ EINA_LIST_FREE(deleted_watch_list, wd)
+ free(wd);
close(epoll_fd);
}
{
struct epoll_event events[MAX_EPOLL_EVENTS];
int n, nfds;
+ Watch_Data *data;
if (terminate)
break;
for (n = 0; n < nfds; n++)
{
- Watch_Data *data = events[n].data.ptr;
+ data = events[n].data.ptr;
Fd_Flags flags = 0;
if (!data)
continue;
+ if (data->deleted)
+ continue;
+
if (!data->callback)
continue;
data->callback(data->fd, flags, (void *)data->user_data);
}
+ EINA_LIST_FREE(deleted_watch_list, data)
+ free(data);
+
_update_timeout();
}