Jacek Caban : server: Store currently executed IRP call on server side.
Alexandre Julliard
julliard at winehq.org
Fri May 3 15:46:17 CDT 2019
Module: wine
Branch: master
Commit: 781dd9a145d0ef8e4465f78b8916ea0861b5e161
URL: https://source.winehq.org/git/wine.git/?a=commit;h=781dd9a145d0ef8e4465f78b8916ea0861b5e161
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri May 3 15:40:18 2019 +0200
server: Store currently executed IRP call on server side.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
server/device.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/server/device.c b/server/device.c
index 0fa23ca..61831b4 100644
--- a/server/device.c
+++ b/server/device.c
@@ -89,6 +89,7 @@ struct device_manager
struct object obj; /* object header */
struct list devices; /* list of devices */
struct list requests; /* list of pending irps across all devices */
+ struct irp_call *current_call; /* call currently executed on client side */
struct wine_rb_tree kernel_objects; /* map of objects that have client side pointer associated */
};
@@ -710,6 +711,12 @@ static void device_manager_destroy( struct object *obj )
struct kernel_object *kernel_object;
struct list *ptr;
+ if (manager->current_call)
+ {
+ release_object( manager->current_call );
+ manager->current_call = NULL;
+ }
+
while (manager->kernel_objects.root)
{
kernel_object = WINE_RB_ENTRY_VALUE( manager->kernel_objects.root, struct kernel_object, rb_entry );
@@ -740,6 +747,7 @@ static struct device_manager *create_device_manager(void)
if ((manager = alloc_object( &device_manager_ops )))
{
+ manager->current_call = NULL;
list_init( &manager->devices );
list_init( &manager->requests );
wine_rb_init( &manager->kernel_objects, compare_kernel_object );
@@ -870,6 +878,12 @@ DECL_HANDLER(get_next_device_request)
clear_error();
}
+ if (manager->current_call)
+ {
+ release_object( manager->current_call );
+ manager->current_call = NULL;
+ }
+
if ((ptr = list_head( &manager->requests )))
{
irp = LIST_ENTRY( ptr, struct irp_call, mgr_entry );
@@ -889,7 +903,8 @@ DECL_HANDLER(get_next_device_request)
iosb->in_size = 0;
list_remove( &irp->mgr_entry );
list_init( &irp->mgr_entry );
- if (!irp->file) release_object( irp ); /* no longer on manager queue */
+ if (irp->file) grab_object( irp ); /* we already own the object if it's only on manager queue */
+ manager->current_call = irp;
}
}
else set_error( STATUS_PENDING );
More information about the wine-cvs
mailing list