Alexandre Julliard : server:
Use the fd generic wait queue for directory change I/O operations.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Apr 2 06:23:22 CDT 2007
Module: wine
Branch: master
Commit: d99ee344c2f1e61c9702a9c9c124880a20495229
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d99ee344c2f1e61c9702a9c9c124880a20495229
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Apr 2 12:49:45 2007 +0200
server: Use the fd generic wait queue for directory change I/O operations.
---
server/change.c | 23 +++++------------------
1 files changed, 5 insertions(+), 18 deletions(-)
diff --git a/server/change.c b/server/change.c
index db50342..70eb54e 100644
--- a/server/change.c
+++ b/server/change.c
@@ -153,7 +153,6 @@ struct dir
int want_data; /* return change data */
long signaled; /* the file changed */
int subtree; /* do we want to watch subdirectories? */
- struct list change_q; /* change readers */
struct list change_records; /* data for the change */
struct list in_entry; /* entry in the inode dirs list */
struct inode *inode; /* inode of the associated directory */
@@ -184,7 +183,6 @@ static const struct object_ops dir_ops =
static int dir_get_poll_events( struct fd *fd );
static enum server_fd_type dir_get_info( struct fd *fd, int *flags );
-static void dir_cancel_async( struct fd *fd );
static const struct fd_ops dir_fd_ops =
{
@@ -193,7 +191,7 @@ static const struct fd_ops dir_fd_ops =
no_flush, /* flush */
dir_get_info, /* get_file_info */
default_fd_queue_async, /* queue_async */
- dir_cancel_async /* cancel_async */
+ default_fd_cancel_async /* cancel_async */
};
static struct list change_list = LIST_INIT(change_list);
@@ -342,7 +340,6 @@ static void dir_destroy( struct object *obj )
free_inode( dir->inode );
}
- async_terminate_queue( &dir->change_q, STATUS_CANCELLED );
while ((record = get_first_change_record( dir ))) free( record );
if (dir->event) release_object( dir->event );
@@ -372,13 +369,6 @@ static enum server_fd_type dir_get_info( struct fd *fd, int *flags )
return FD_TYPE_DIR;
}
-static void dir_cancel_async( struct fd *fd )
-{
- struct dir *dir = (struct dir *) get_fd_user( fd );
- async_terminate_queue( &dir->change_q, STATUS_CANCELLED );
-}
-
-
#ifdef USE_INOTIFY
#define HASH_SIZE 31
@@ -582,8 +572,7 @@ static void inotify_do_change_notify( struct dir *dir, unsigned int action,
list_add_tail( &dir->change_records, &record->entry );
}
- if (!list_empty( &dir->change_q ))
- async_terminate_head( &dir->change_q, STATUS_ALERTED );
+ fd_async_terminate_head( dir->fd, ASYNC_TYPE_WAIT, STATUS_ALERTED );
}
static unsigned int filter_from_event( struct inotify_event *ie )
@@ -1048,7 +1037,6 @@ struct object *create_dir_obj( struct fd *fd )
if (!dir)
return NULL;
- list_init( &dir->change_q );
list_init( &dir->change_records );
dir->event = NULL;
dir->filter = 0;
@@ -1091,7 +1079,7 @@ DECL_HANDLER(read_directory_changes)
dir->event = event;
/* requests don't timeout */
- if (!create_async( current, NULL, &dir->change_q, &req->async )) goto end;
+ if (!fd_queue_async_timeout( dir->fd, &req->async, ASYNC_TYPE_WAIT, 0, NULL )) goto end;
/* assign it once */
if (!dir->filter)
@@ -1108,9 +1096,8 @@ DECL_HANDLER(read_directory_changes)
dir->signaled--;
/* if there's already a change in the queue, send it */
- if (!list_empty( &dir->change_q ) &&
- !list_empty( &dir->change_records ))
- async_terminate_head( &dir->change_q, STATUS_ALERTED );
+ if (!list_empty( &dir->change_records ))
+ fd_async_terminate_head( dir->fd, ASYNC_TYPE_WAIT, STATUS_ALERTED );
/* setup the real notification */
if (!inotify_adjust_changes( dir ))
More information about the wine-cvs
mailing list