Eio: Do not free Windows stuff when it is not used. Fix seg fault.

SVN revision: 75747
This commit is contained in:
Vincent Torri 2012-08-28 05:49:38 +00:00
parent c20db5be17
commit 83f7a57d50
3 changed files with 18 additions and 6 deletions

View File

@ -22,3 +22,7 @@
* Add a comment describing the false positiv detected by static analyzer
when calling eio_file_set.
2012-08-07 Vincent Torri
* Do not free Windows stuff when it is not used. Fix seg fault

View File

@ -10,8 +10,8 @@ Fixes:
- detect when requesting to monitor a different file with the same name.
- memory leak when shutting down fallback monitor.
- properly shutdown monitor.
- Fix segfault when shutting down the Windows monitor.
Improvements:
Removal:

View File

@ -53,6 +53,8 @@ struct _Eio_Monitor_Backend
Eio_Monitor_Win32_Watcher *dir;
};
static Eina_Bool _eio_monitor_win32_native = EINA_FALSE;
static Eina_Bool
_eio_monitor_win32_cb(void *data, Ecore_Win32_Handler *wh __UNUSED__)
{
@ -149,7 +151,7 @@ _eio_monitor_win32_cb(void *data, Ecore_Win32_Handler *wh __UNUSED__)
FILE_NOTIFY_CHANGE_SECURITY;
ReadDirectoryChangesW(w->handle,
w->buffer,
(LPVOID)w->buffer,
EIO_MONITOR_WIN32_BUFFER_SIZE,
FALSE,
filter,
@ -163,13 +165,15 @@ _eio_monitor_win32_cb(void *data, Ecore_Win32_Handler *wh __UNUSED__)
static Eio_Monitor_Win32_Watcher *
_eio_monitor_win32_watcher_new(Eio_Monitor *monitor, unsigned char is_dir)
{
char path[PATH_MAX];
Eio_Monitor_Win32_Watcher *w;
DWORD filter;
w = (Eio_Monitor_Win32_Watcher *)calloc(1, sizeof(Eio_Monitor_Win32_Watcher));
if (!w) return NULL;
w->handle = CreateFile(monitor->path,
realpath(monitor->path, path);
w->handle = CreateFile(path,
FILE_LIST_DIRECTORY,
FILE_SHARE_READ |
FILE_SHARE_WRITE,
@ -198,14 +202,17 @@ _eio_monitor_win32_watcher_new(Eio_Monitor *monitor, unsigned char is_dir)
FILE_NOTIFY_CHANGE_SECURITY;
if (!ReadDirectoryChangesW(w->handle,
w->buffer,
(LPVOID)w->buffer,
EIO_MONITOR_WIN32_BUFFER_SIZE,
FALSE,
filter,
&w->buf_length,
&w->overlapped,
NULL))
goto close_event;
{
printf("error : %s\n", evil_last_error_get());
goto close_event;
}
w->h = ecore_main_win32_handler_add(w->event,
_eio_monitor_win32_cb,
@ -287,12 +294,13 @@ void eio_monitor_backend_add(Eio_Monitor *monitor)
return;
}
_eio_monitor_win32_native = EINA_TRUE;
monitor->backend = backend;
}
void eio_monitor_backend_del(Eio_Monitor *monitor)
{
if (!monitor->backend)
if (!_eio_monitor_win32_native)
{
eio_monitor_fallback_del(monitor);
return ;