cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=de767cabfaf84f262c785ce468508f6ed52cc009

commit de767cabfaf84f262c785ce468508f6ed52cc009
Author: pierre lamot <[email protected]>
Date:   Tue Mar 3 17:01:03 2015 +0100

    eio: don't restart a monitor on MacOSX when every paths have been removed.
    
    This patch check that when a monitor is removed the FSEvent service, it is
    not restarted if there is no more paths to monitor. This was generating an
    error message from FSEvent.
    
    Signed-off-by: Cedric BAIL <[email protected]>
---
 src/lib/eio/eio_monitor_cocoa.c  | 22 ++++++-----
 src/tests/eio/eio_test_monitor.c | 80 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+), 10 deletions(-)

diff --git a/src/lib/eio/eio_monitor_cocoa.c b/src/lib/eio/eio_monitor_cocoa.c
index ea1d793..8cadeaf 100644
--- a/src/lib/eio/eio_monitor_cocoa.c
+++ b/src/lib/eio/eio_monitor_cocoa.c
@@ -195,7 +195,6 @@ _eio_get_monitor_path(const char *path, char **monpath, 
char **fullpath)
    char realPath[PATH_MAX];
    char *realPathOk;
    char *dname = NULL;
-   char *fname = NULL;
    struct stat sb;
 
    realPathOk = realpath(path, realPath);
@@ -383,15 +382,18 @@ void eio_monitor_backend_del(Eio_Monitor *monitor)
         CFArrayRemoveValueAtIndex(_paths_to_watch, idx);
      }
 
-   _stream = FSEventStreamCreate(NULL,
-                                 _eio_fsevent_cb,
-                                 NULL,
-                                 _paths_to_watch,
-                                 eventid,
-                                 _latency,
-                                 kFSEventStreamCreateFlagFileEvents
-                                 | kFSEventStreamCreateFlagNoDefer
-                                );
+   if (CFArrayGetCount(_paths_to_watch) > 0)
+     {
+        _stream = FSEventStreamCreate(NULL,
+                                      _eio_fsevent_cb,
+                                      NULL,
+                                      _paths_to_watch,
+                                      eventid,
+                                      _latency,
+                                      kFSEventStreamCreateFlagFileEvents
+                                      | kFSEventStreamCreateFlagNoDefer
+                                      );
+     }
    backend = monitor->backend;
    monitor->backend = NULL;
    if (!backend) return;
diff --git a/src/tests/eio/eio_test_monitor.c b/src/tests/eio/eio_test_monitor.c
index 378c427..ba5943f 100644
--- a/src/tests/eio/eio_test_monitor.c
+++ b/src/tests/eio/eio_test_monitor.c
@@ -135,6 +135,82 @@ static void _common_shutdown(Eina_Tmpstr *dirname)
 
 /////// tests monitoring a directory
 
+START_TEST(eio_test_monitor_add_and_remove)
+{
+   Eina_Tmpstr *dirname = _common_init();
+   Eina_Stringshare *filename;
+   Eio_Monitor *monitor;
+
+   filename = 
eina_stringshare_printf("%s/eio_test_monitor_directory_file_created_notify", 
dirname);
+   _create_directory((void*)filename);
+
+   //sleep to avoid catching event generated by above manipulations
+   usleep(500000);
+
+   //monitor directory
+   monitor = eio_monitor_add(filename);
+   
+   usleep(500000);
+   
+   eio_monitor_del(monitor);
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+START_TEST(eio_test_monitor_add_remove_add)
+{
+   Eina_Tmpstr *dirname = _common_init();
+   Eina_Stringshare *filename;
+   Eio_Monitor *monitor1;
+   Eio_Monitor *monitor2;
+
+   filename = eina_stringshare_printf("%s/eio_test_monitor_add_remove_add", 
dirname);
+   _create_directory((void*)filename);
+
+   //sleep to avoid catching event generated by above manipulations
+   usleep(500000);
+
+   //monitor directory
+   monitor1 = eio_monitor_add(filename);
+   eio_monitor_del(monitor1);
+   
+   usleep(500000);
+   
+   monitor2 = eio_monitor_add(filename);
+   eio_monitor_del(monitor2);
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+START_TEST(eio_test_monitor_add_add_remove_remove)
+{
+   Eina_Tmpstr *dirname = _common_init();
+   Eina_Stringshare *filename1;
+   Eina_Stringshare *filename2;
+   Eio_Monitor *monitor1;
+   Eio_Monitor *monitor2;
+
+   filename1 = 
eina_stringshare_printf("%s/eio_test_monitor_add_add_remove_remove", dirname);
+   filename2 = 
eina_stringshare_printf("%s/eio_test_monitor_add_add_remove_remove", dirname);
+   _create_directory((void*)filename1);
+   _create_directory((void*)filename2);
+
+   //sleep to avoid catching event generated by above manipulations
+   usleep(500000);
+
+   //monitor directory
+   monitor1 = eio_monitor_add(filename1);   
+   monitor2 = eio_monitor_add(filename2);
+   usleep(500000);
+   eio_monitor_del(monitor2);
+   eio_monitor_del(monitor1);
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
 static void _file_created_cb(void *data, int type, void *event)
 {
    ck_assert_int_eq(type, (int)EIO_MONITOR_FILE_CREATED);
@@ -650,6 +726,10 @@ END_TEST
 
 void eio_test_monitor(TCase *tc)
 {
+   tcase_add_test(tc, eio_test_monitor_add_and_remove);
+   tcase_add_test(tc, eio_test_monitor_add_remove_add);
+   tcase_add_test(tc, eio_test_monitor_add_add_remove_remove);
+   
    tcase_add_test(tc, eio_test_monitor_directory_file_created_notify);
    tcase_add_test(tc, eio_test_monitor_directory_file_deleted_notify);
    tcase_add_test(tc, eio_test_monitor_directory_file_modified_notify);

-- 


Reply via email to