From: Enlightenment S. <no-...@en...> - 2012-02-27 20:58:33
|
Log: eio: finish eio fallback monitor. NOTE: this make Eio now officially in Alpha stage. API and ABI should remain stable until the coming release. Only bug fixes and highly needed api change will make in. Author: cedric Date: 2012-02-27 12:58:26 -0800 (Mon, 27 Feb 2012) New Revision: 68479 Trac: http://trac.enlightenment.org/e/changeset/68479 Modified: trunk/eio/src/lib/eio_poll.c Modified: trunk/eio/src/lib/eio_poll.c =================================================================== --- trunk/eio/src/lib/eio_poll.c 2012-02-27 20:09:53 UTC (rev 68478) +++ trunk/eio/src/lib/eio_poll.c 2012-02-27 20:58:26 UTC (rev 68479) @@ -20,15 +20,29 @@ #include "eio_private.h" #include "Eio.h" +typedef struct _Eio_Monitor_Stat Eio_Monitor_Stat; +struct _Eio_Monitor_Stat +{ + Eina_Stat buffer; + int version; +}; + struct _Eio_Monitor_Backend { Eio_Monitor *parent; + Eina_Stat self; + Eina_Hash *children; + Ecore_Timer *timer; Ecore_Idler *idler; Ecore_Thread *work; + int version; + Eina_Bool delete_me : 1; + Eina_Bool initialised : 1; + Eina_Bool destroyed : 1; }; static Eina_Bool _eio_monitor_fallback_timer_cb(void *data); @@ -56,11 +70,155 @@ static void _eio_monitor_fallback_heavy_cb(void *data, Ecore_Thread *thread) { - /* FIXME : copy ecore_file_monitor_poll here */ + Eio_Monitor_Backend *backend = data; + Eina_Iterator *it; + Eina_Stat *est; + Eina_File_Direct_Info *info; + struct stat st; + /* FIXME : copy ecore_file_monitor_poll here */ + + if (!backend->initialised) + est = &backend->self; + else + est = alloca(sizeof (Eina_Stat)); + + if (!backend->parent) + return ; + + if (stat(backend->parent->path, &st)) + { + if (backend->initialised && !backend->destroyed) + { + ecore_thread_main_loop_begin(); + _eio_monitor_send(backend->parent, backend->parent->path, EIO_MONITOR_SELF_DELETED); + ecore_thread_main_loop_end(); + backend->destroyed = EINA_TRUE; + } + return ; + } + + backend->destroyed = EINA_FALSE; + + est->dev = st.st_dev; + est->ino = st.st_ino; + est->mode = st.st_mode; + est->nlink = st.st_nlink; + est->uid = st.st_uid; + est->gid = st.st_gid; + est->rdev = st.st_rdev; + est->size = st.st_size; + est->blksize = st.st_blksize; + est->blocks = st.st_blocks; + est->atime = st.st_atime; + est->mtime = st.st_mtime; + est->ctime = st.st_ctime; +#ifdef _STAT_VER_LINUX +# if (defined __USE_MISC && defined st_mtime) + est->atimensec = st.st_atim.tv_nsec; + est->mtimensec = st.st_mtim.tv_nsec; + est->ctimensec = st.st_ctim.tv_nsec; +# else + est->atimensec = st.st_atimensec; + est->mtimensec = st.st_mtimensec; + est->ctimensec = st.st_ctimensec; +# endif +#else + est->atimensec = 0; + est->mtimensec = 0; + est->ctimensec = 0; +#endif + + if (memcmp(est, &backend->self, sizeof (Eina_Stat)) != 0) + { + ecore_thread_main_loop_begin(); + _eio_monitor_send(backend->parent, backend->parent->path, EIO_MONITOR_SELF_DELETED); + ecore_thread_main_loop_end(); + } + + it = eina_file_direct_ls(backend->parent->path); + EINA_ITERATOR_FOREACH(it, info) + { + Eio_Monitor_Stat *cmp; + Eio_Monitor_Stat buffer; + + if (!backend->initialised) + cmp = calloc(1, sizeof (Eio_Monitor_Stat)); + else + cmp = &buffer; + + if (eina_file_statat(eina_iterator_container_get(it), info, &cmp->buffer)) + { + if (!backend->initialised) free(cmp); + continue ; + } + + if (!backend->initialised) + { + eina_hash_add(backend->children, info->path + info->name_start, cmp); + } + else + { + cmp = eina_hash_find(backend->children, info->path + info->name_start); + if (!cmp) + { + /* New file or new directory added */ + ecore_thread_main_loop_begin(); + _eio_monitor_send(backend->parent, info->path + info->name_start, + info->type != EINA_FILE_DIR ? EIO_MONITOR_FILE_CREATED : EIO_MONITOR_DIRECTORY_CREATED); + ecore_thread_main_loop_end(); + + cmp = malloc(sizeof (Eio_Monitor_Stat)); + memcpy(cmp, &buffer, sizeof (Eina_Stat)); + + eina_hash_add(backend->children, info->path + info->name_start, cmp); + } + else if (memcmp(cmp, &buffer, sizeof (Eina_Stat)) != 0) + { + /* file has been modified */ + ecore_thread_main_loop_begin(); + _eio_monitor_send(backend->parent, info->path + info->name_start, + info->type != EINA_FILE_DIR ? EIO_MONITOR_FILE_MODIFIED : EIO_MONITOR_DIRECTORY_MODIFIED); + ecore_thread_main_loop_end(); + + memcpy(cmp, &buffer, sizeof (Eina_Stat)); + } + } + + cmp->version = backend->version; + if (ecore_thread_check(thread)) goto out; + } + out: + eina_iterator_free(it); + + if (backend->initialised && !ecore_thread_check(thread)) + { + Eina_Hash_Tuple *tuple; + + it = eina_hash_iterator_tuple_new(backend->children); + ecore_thread_main_loop_begin(); + + EINA_ITERATOR_FOREACH(it, tuple) + { + Eio_Monitor_Stat *cmp = tuple->data; + + if (cmp->version != backend->version) + { + _eio_monitor_send(backend->parent, tuple->key, + eio_file_is_dir(&cmp->buffer) ? EIO_MONITOR_DIRECTORY_DELETED : EIO_MONITOR_FILE_DELETED); + eina_hash_del(backend->children, tuple->key, tuple->data); + } + } + + ecore_thread_main_loop_end(); + eina_iterator_free(it); + } + + backend->version++; + backend->initialised = EINA_TRUE; } static void -_eio_monitor_fallback_end_cb(void *data, Ecore_Thread *thread) +_eio_monitor_fallback_end_cb(void *data, Ecore_Thread *thread __UNUSED__) { Eio_Monitor_Backend *backend = data; @@ -69,7 +227,7 @@ } static void -_eio_monitor_fallback_cancel_cb(void *data, Ecore_Thread *thread) +_eio_monitor_fallback_cancel_cb(void *data, Ecore_Thread *thread __UNUSED__) { Eio_Monitor_Backend *backend = data; @@ -126,9 +284,13 @@ backend = calloc(1, sizeof (Eio_Monitor_Backend)); if (!backend) return ; + backend->children = eina_hash_string_superfast_new(free); backend->parent = monitor; monitor->backend = backend; - backend->timer = ecore_timer_add(60.0, _eio_monitor_fallback_timer_cb, backend); + backend->work = ecore_thread_run(_eio_monitor_fallback_heavy_cb, + _eio_monitor_fallback_end_cb, + _eio_monitor_fallback_cancel_cb, + backend); } void |
From: Enlightenment S. <no-...@en...> - 2012-03-10 13:27:50
|
Log: eio: that was a work around... Author: cedric Date: 2012-03-10 05:27:44 -0800 (Sat, 10 Mar 2012) New Revision: 69173 Trac: http://trac.enlightenment.org/e/changeset/69173 Modified: trunk/eio/src/lib/eio_single.c Modified: trunk/eio/src/lib/eio_single.c =================================================================== --- trunk/eio/src/lib/eio_single.c 2012-03-10 12:47:54 UTC (rev 69172) +++ trunk/eio/src/lib/eio_single.c 2012-03-10 13:27:44 UTC (rev 69173) @@ -337,7 +337,7 @@ end_cb, cancel_cb, common, - EINA_TRUE); + EINA_FALSE); if (thread) common->thread = thread; return !!thread; } |
From: Enlightenment S. <no-...@en...> - 2012-09-05 07:16:21
|
Log: eio: fix typos. Author: cedric Date: 2012-09-05 00:16:10 -0700 (Wed, 05 Sep 2012) New Revision: 76169 Trac: http://trac.enlightenment.org/e/changeset/76169 Modified: trunk/eio/src/lib/Eio.h Modified: trunk/eio/src/lib/Eio.h =================================================================== --- trunk/eio/src/lib/Eio.h 2012-09-05 07:15:10 UTC (rev 76168) +++ trunk/eio/src/lib/Eio.h 2012-09-05 07:16:10 UTC (rev 76169) @@ -1105,7 +1105,7 @@ */ EAPI extern int EIO_MONITOR_FILE_CREATED; /**< A new file was created in a watched directory */ -EAPI extern int EIO_MONITOR_FILE_DELETED; /**< A watched file was modified, or a file in a watched directory was modified */ +EAPI extern int EIO_MONITOR_FILE_DELETED; /**< A watched file was deleted, or a file in a watched deleted was modified */ EAPI extern int EIO_MONITOR_FILE_MODIFIED; /**< A file was modified in a watched directory */ EAPI extern int EIO_MONITOR_FILE_CLOSED; /**< A file was closed in a watched directory */ EAPI extern int EIO_MONITOR_DIRECTORY_CREATED; /**< A new directory was created in a watched directory */ |
From: Enlightenment S. <no-...@en...> - 2012-09-05 07:19:37
|
Log: eio: fix typo in previous fix. Author: cedric Date: 2012-09-05 00:19:30 -0700 (Wed, 05 Sep 2012) New Revision: 76170 Trac: http://trac.enlightenment.org/e/changeset/76170 Modified: trunk/eio/src/lib/Eio.h Modified: trunk/eio/src/lib/Eio.h =================================================================== --- trunk/eio/src/lib/Eio.h 2012-09-05 07:16:10 UTC (rev 76169) +++ trunk/eio/src/lib/Eio.h 2012-09-05 07:19:30 UTC (rev 76170) @@ -1105,7 +1105,7 @@ */ EAPI extern int EIO_MONITOR_FILE_CREATED; /**< A new file was created in a watched directory */ -EAPI extern int EIO_MONITOR_FILE_DELETED; /**< A watched file was deleted, or a file in a watched deleted was modified */ +EAPI extern int EIO_MONITOR_FILE_DELETED; /**< A watched file was deleted, or a file in a watched directory was deleted */ EAPI extern int EIO_MONITOR_FILE_MODIFIED; /**< A file was modified in a watched directory */ EAPI extern int EIO_MONITOR_FILE_CLOSED; /**< A file was closed in a watched directory */ EAPI extern int EIO_MONITOR_DIRECTORY_CREATED; /**< A new directory was created in a watched directory */ |