Updates. Reduce polling time on no events.

SVN revision: 13460
This commit is contained in:
sebastid 2005-02-22 12:38:17 +00:00 committed by sebastid
parent 98fe13e6aa
commit 45d11bcebd
8 changed files with 76 additions and 53 deletions

View File

@ -38,8 +38,8 @@ EAPI int ecore_file_mkdir (const char *dir);
EAPI int ecore_file_mkpath (const char *path);
EAPI int ecore_file_cp (const char *src, const char *dst);
EAPI char *ecore_file_realpath (const char *file);
EAPI char *ecore_file_get_file (const char *path);
EAPI char *ecore_file_get_dir (const char *path);
EAPI char *ecore_file_get_file (char *path);
EAPI char *ecore_file_get_dir (char *path);
EAPI int ecore_file_can_exec (const char *file);
EAPI char *ecore_file_readlink (const char *link);
@ -62,6 +62,7 @@ typedef enum {
ECORE_FILE_EVENT_CHANGED
} Ecore_File_Event;
#if 0
struct _Ecore_File_Monitor {
void (*func) (void *data,
Ecore_File_Monitor *ecore_file_monitor,
@ -73,6 +74,7 @@ struct _Ecore_File_Monitor {
Ecore_File_Type type;
void *data;
};
#endif
#if 0
struct _Ecore_File_Monitor_Event {
@ -94,5 +96,6 @@ EAPI Ecore_File_Monitor *ecore_file_monitor_add(const char *path,
const char *path),
void *data);
EAPI void ecore_file_monitor_del(Ecore_File_Monitor *ecore_file_monitor);
EAPI Ecore_File_Type ecore_file_monitor_type_get(Ecore_File_Monitor *ecore_file_monitor);
#endif

View File

@ -16,6 +16,7 @@ include_HEADERS = Ecore_File.h
libecore_file_la_SOURCES = \
ecore_file.c \
ecore_file_private.h \
ecore_file_monitor.c \
ecore_file_monitor_fam.c \
ecore_file_monitor_inotify.c \
ecore_file_monitor_dnotify.c \
@ -31,6 +32,7 @@ endif
EXTRA_DIST = \
ecore_file.c \
ecore_file_private.h \
ecore_file_monitor.c \
ecore_file_monitor_fam.c \
ecore_file_monitor_inotify.c \
ecore_file_monitor_dnotify.c \

View File

@ -2,7 +2,6 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "ecore_file_private.h"
#include "Ecore_File.h"
/* externally accessible functions */
int
@ -116,7 +115,7 @@ ecore_file_realpath(const char *file)
}
char *
ecore_file_get_file(const char *path)
ecore_file_get_file(char *path)
{
char *result = NULL;
@ -127,7 +126,7 @@ ecore_file_get_file(const char *path)
}
char *
ecore_file_get_dir(const char *file)
ecore_file_get_dir(char *file)
{
char *p;
char buf[PATH_MAX];

View File

@ -2,7 +2,6 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "ecore_file_private.h"
#include "Ecore_File.h"
/*
* TODO:

View File

@ -2,7 +2,6 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "ecore_file_private.h"
#include "Ecore_File.h"
/*
* TODO:

View File

@ -2,7 +2,6 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "ecore_file_private.h"
#include "Ecore_File.h"
/*
* TODO:

View File

@ -2,7 +2,6 @@
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "ecore_file_private.h"
#include "Ecore_File.h"
#ifdef HAVE_POLL
@ -14,19 +13,8 @@
* - Change poll time
*/
typedef struct _Ecore_File_Monitor_Poll Ecore_File_Monitor_Poll;
typedef struct _Ecore_File Ecore_File;
#define ECORE_FILE_MONITOR_POLL(x) ((Ecore_File_Monitor_Poll *)(x))
struct _Ecore_File_Monitor_Poll
{
Ecore_File_Monitor monitor;
int mtime;
Evas_List *files;
unsigned char deleted;
};
struct _Ecore_File
{
char *name;
@ -34,6 +22,11 @@ struct _Ecore_File
Ecore_File_Type type;
};
#define ECORE_FILE_INTERVAL_MIN 1.0
#define ECORE_FILE_INTERVAL_STEP 0.5
#define ECORE_FILE_INTERVAL_MAX 5.0
static double _interval = ECORE_FILE_INTERVAL_MIN;
static Ecore_Timer *_timer = NULL;
static Evas_List *_monitors = NULL;
static int _lock = 0;
@ -78,18 +71,18 @@ ecore_file_monitor_add(const char *path,
void *data)
{
Ecore_File_Monitor *em;
Ecore_File_Monitor_Poll *emf;
int len;
if (!path) return NULL;
if (!func) return NULL;
emf = calloc(1, sizeof(Ecore_File_Monitor_Poll));
em = ECORE_FILE_MONITOR(emf);
em = calloc(1, sizeof(Ecore_File_Monitor));
if (!em) return NULL;
if (!_timer)
_timer = ecore_timer_add(1.0, _ecore_file_monitor_handler, NULL);
_timer = ecore_timer_add(_interval, _ecore_file_monitor_handler, NULL);
else
ecore_timer_interval_set(_timer, ECORE_FILE_INTERVAL_MIN);
em->path = strdup(path);
len = strlen(em->path);
@ -99,7 +92,7 @@ ecore_file_monitor_add(const char *path,
em->func = func;
em->data = data;
emf->mtime = ecore_file_mod_time(em->path);
em->mtime = ecore_file_mod_time(em->path);
if (ecore_file_exists(em->path))
{
em->type = ecore_file_is_dir(em->path) ?
@ -134,7 +127,7 @@ ecore_file_monitor_add(const char *path,
ECORE_FILE_TYPE_DIRECTORY :
ECORE_FILE_TYPE_FILE;
em->func(em->data, em, f->type, ECORE_FILE_EVENT_EXISTS, buf);
emf->files = evas_list_append(emf->files, f);
em->files = evas_list_append(em->files, f);
}
evas_list_free(files);
}
@ -153,25 +146,23 @@ ecore_file_monitor_add(const char *path,
void
ecore_file_monitor_del(Ecore_File_Monitor *em)
{
Ecore_File_Monitor_Poll *emf;
Evas_List *l;
emf = ECORE_FILE_MONITOR_POLL(em);
if (_lock)
{
emf->deleted = 1;
em->deleted = 1;
return;
}
/* Remove files */
for (l = emf->files; l; l = l->next)
for (l = em->files; l; l = l->next)
{
Ecore_File *f;
f = l->data;
free(f->name);
free(f);
}
evas_list_free(emf->files);
evas_list_free(em->files);
_monitors = evas_list_remove(_monitors, em);
free(em->path);
@ -182,6 +173,8 @@ ecore_file_monitor_del(Ecore_File_Monitor *em)
ecore_timer_del(_timer);
_timer = NULL;
}
else
ecore_timer_interval_set(_timer, ECORE_FILE_INTERVAL_MIN);
}
static int
@ -189,6 +182,7 @@ _ecore_file_monitor_handler(void *data)
{
Evas_List *monitor;
_interval += ECORE_FILE_INTERVAL_STEP;
_lock = 1;
for (monitor = _monitors; monitor;)
{
@ -199,15 +193,17 @@ _ecore_file_monitor_handler(void *data)
_ecore_file_monitor_check(em);
}
_lock = 0;
if (_interval > ECORE_FILE_INTERVAL_MAX)
_interval = ECORE_FILE_INTERVAL_MAX;
ecore_timer_interval_set(_timer, _interval);
for (monitor = _monitors; monitor;)
{
Ecore_File_Monitor *em;
Ecore_File_Monitor_Poll *emf;
em = monitor->data;
emf = ECORE_FILE_MONITOR_POLL(em);
monitor = monitor->next;
if (emf->deleted)
if (em->deleted)
ecore_file_monitor_del(em);
}
return 1;
@ -216,30 +212,32 @@ _ecore_file_monitor_handler(void *data)
static void
_ecore_file_monitor_check(Ecore_File_Monitor *em)
{
Ecore_File_Monitor_Poll *emf;
int mtime;
emf = ECORE_FILE_MONITOR_POLL(em);
mtime = ecore_file_mod_time(em->path);
switch (em->type)
{
case ECORE_FILE_TYPE_FILE:
if (mtime < emf->mtime)
if (mtime < em->mtime)
{
em->func(em->data, em, em->type, ECORE_FILE_EVENT_DELETED, em->path);
em->type = ECORE_FILE_TYPE_NONE;
_interval = ECORE_FILE_INTERVAL_MIN;
}
else if (mtime > em->mtime)
{
em->func(em->data, em, em->type, ECORE_FILE_EVENT_CHANGED, em->path);
_interval = ECORE_FILE_INTERVAL_MIN;
}
else if (mtime > emf->mtime)
em->func(em->data, em, em->type, ECORE_FILE_EVENT_CHANGED, em->path);
break;
case ECORE_FILE_TYPE_DIRECTORY:
if (mtime < emf->mtime)
if (mtime < em->mtime)
{
/* Deleted */
Evas_List *l;
/* Notify all files deleted */
for (l = emf->files; l;)
for (l = em->files; l;)
{
Ecore_File *f;
char buf[PATH_MAX];
@ -251,16 +249,17 @@ _ecore_file_monitor_check(Ecore_File_Monitor *em)
free(f->name);
free(f);
}
emf->files = evas_list_free(emf->files);
em->files = evas_list_free(em->files);
em->func(em->data, em, em->type, ECORE_FILE_EVENT_DELETED, em->path);
em->type = ECORE_FILE_TYPE_NONE;
_interval = ECORE_FILE_INTERVAL_MIN;
}
else
{
Evas_List *l;
/* Check for changed files */
for (l = emf->files; l;)
for (l = em->files; l;)
{
Ecore_File *f;
char buf[PATH_MAX];
@ -273,17 +272,21 @@ _ecore_file_monitor_check(Ecore_File_Monitor *em)
if (mtime < f->mtime)
{
em->func(em->data, em, f->type, ECORE_FILE_EVENT_DELETED, buf);
emf->files = evas_list_remove(emf->files, f);
em->files = evas_list_remove(em->files, f);
free(f->name);
free(f);
_interval = ECORE_FILE_INTERVAL_MIN;
}
else if (mtime > f->mtime)
em->func(em->data, em, f->type, ECORE_FILE_EVENT_CHANGED, buf);
{
em->func(em->data, em, f->type, ECORE_FILE_EVENT_CHANGED, buf);
_interval = ECORE_FILE_INTERVAL_MIN;
}
f->mtime = mtime;
}
/* Check for new files */
if (emf->mtime < mtime)
if (em->mtime < mtime)
{
Evas_List *files;
@ -316,14 +319,15 @@ _ecore_file_monitor_check(Ecore_File_Monitor *em)
ECORE_FILE_TYPE_DIRECTORY :
ECORE_FILE_TYPE_FILE;
em->func(em->data, em, f->type, ECORE_FILE_EVENT_CREATED, buf);
emf->files = evas_list_append(emf->files, f);
em->files = evas_list_append(em->files, f);
}
em->func(em->data, em, em->type, ECORE_FILE_EVENT_CHANGED, em->path);
_interval = ECORE_FILE_INTERVAL_MIN;
}
}
break;
case ECORE_FILE_TYPE_NONE:
if (mtime > emf->mtime)
if (mtime > em->mtime)
{
/* Something has been created! */
em->type = ecore_file_is_dir(em->path) ?
@ -359,24 +363,23 @@ _ecore_file_monitor_check(Ecore_File_Monitor *em)
ECORE_FILE_TYPE_DIRECTORY :
ECORE_FILE_TYPE_FILE;
em->func(em->data, em, f->type, ECORE_FILE_EVENT_CREATED, buf);
emf->files = evas_list_append(emf->files, f);
em->files = evas_list_append(em->files, f);
}
evas_list_free(files);
}
_interval = ECORE_FILE_INTERVAL_MIN;
}
break;
}
emf->mtime = mtime;
em->mtime = mtime;
}
static int
_ecore_file_monitor_checking(Ecore_File_Monitor *em, char *name)
{
Evas_List *l;
Ecore_File_Monitor_Poll *emf;
emf = ECORE_FILE_MONITOR_POLL(em);
for (l = emf->files; l; l = l->next)
for (l = em->files; l; l = l->next)
{
Ecore_File *f;

View File

@ -13,10 +13,29 @@
#include "config.h"
#include "Ecore.h"
#include "Ecore_File.h"
int ecore_file_monitor_init(void);
int ecore_file_monitor_shutdown(void);
struct _Ecore_File_Monitor
{
void (*func) (void *data,
Ecore_File_Monitor *ecore_file_monitor,
Ecore_File_Type type,
Ecore_File_Event event,
const char *path);
char *path;
Ecore_File_Type type;
void *data;
Evas_List *files;
#ifdef HAVE_POLL
int mtime;
unsigned char deleted;
#endif
};
/*
#define HAVE_POLL
#define HAVE_FAM