ALT Linux repos
S: | 8.15.1-alt1 |
5.0: | 1.0.9-alt37 |
4.1: | 1.0.9-alt0.M41.35 |
4.0: | 1.0.9-alt0.M40.35 |
+backports: | 1.0.9-alt0.M40.16 |
3.0: | 20050715-alt0.1 |
+backports: | 20061212-alt0.M30.1 |
Group :: Emulators
RPM: wine
Main Changelog Spec Patches Sources Download Gear Bugs and FR Repocop
Patch: 0001-server-apc.patch
Download
Download
From adc302f51b942704eb329aa8de14471c777c3465 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Mon, 6 Nov 2017 14:25:59 +0800
Subject: [1/2] server: Make it possible to deliver an APC to any alive thread
in the process.
Content-Type: text/plain; charset=UTF-8
---
server/async.c | 4 ++--
server/thread.c | 7 +++++--
server/thread.h | 2 +-
server/timer.c | 2 +-
4 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/server/async.c b/server/async.c
index 9e91f9eadf..3e0c25706d 100644
--- a/server/async.c
+++ b/server/async.c
@@ -169,7 +169,7 @@ void async_terminate( struct async *async, unsigned int status )
data.async_io.user = async->data.user;
data.async_io.sb = async->data.iosb;
data.async_io.status = status;
- thread_queue_apc( async->thread, &async->obj, &data );
+ thread_queue_apc( NULL, async->thread, &async->obj, &data );
}
else async_set_result( &async->obj, STATUS_SUCCESS, 0 );
}
@@ -379,7 +379,7 @@ void async_set_result( struct object *obj, unsigned int status, apc_param_t tota
data.user.args[0] = async->data.apc_context;
data.user.args[1] = async->data.iosb;
data.user.args[2] = 0;
- thread_queue_apc( async->thread, NULL, &data );
+ thread_queue_apc( NULL, async->thread, NULL, &data );
}
else if (async->data.apc_context && (!async->direct_result ||
!(async->comp_flags & COMPLETION_SKIP_ON_SUCCESS)))
diff --git a/server/thread.c b/server/thread.c
index 89f1cd075b..c0e59d358a 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -947,6 +947,9 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
{
struct list *queue;
+ if (thread && thread->state == TERMINATED && process)
+ thread = NULL;
+
if (!thread) /* find a suitable thread inside the process */
{
struct thread *candidate;
@@ -998,14 +1001,14 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
}
/* queue an async procedure call */
-int thread_queue_apc( struct thread *thread, struct object *owner, const apc_call_t *call_data )
+int thread_queue_apc( struct process *process, struct thread *thread, struct object *owner, const apc_call_t *call_data )
{
struct thread_apc *apc;
int ret = 0;
if ((apc = create_apc( owner, call_data )))
{
- ret = queue_apc( NULL, thread, apc );
+ ret = queue_apc( process, thread, apc );
release_object( apc );
}
return ret;
diff --git a/server/thread.h b/server/thread.h
index 369dc16277..311c27e9bf 100644
--- a/server/thread.h
+++ b/server/thread.h
@@ -123,7 +123,7 @@ extern void remove_queue( struct object *obj, struct wait_queue_entry *entry );
extern void kill_thread( struct thread *thread, int violent_death );
extern void break_thread( struct thread *thread );
extern void wake_up( struct object *obj, int max );
-extern int thread_queue_apc( struct thread *thread, struct object *owner, const apc_call_t *call_data );
+extern int thread_queue_apc( struct process *process, struct thread *thread, struct object *owner, const apc_call_t *call_data );
extern void thread_cancel_apc( struct thread *thread, struct object *owner, enum apc_type type );
extern int thread_add_inflight_fd( struct thread *thread, int client, int server );
extern int thread_get_inflight_fd( struct thread *thread, int client );
diff --git a/server/timer.c b/server/timer.c
index cb686b90f9..629bbba200 100644
--- a/server/timer.c
+++ b/server/timer.c
@@ -123,7 +123,7 @@ static void timer_callback( void *private )
}
else data.type = APC_NONE; /* wake up only */
- if (!thread_queue_apc( timer->thread, &timer->obj, &data ))
+ if (!thread_queue_apc( NULL, timer->thread, &timer->obj, &data ))
{
release_object( timer->thread );
timer->thread = NULL;
--
2.15.0
From 06dc162f3e31b830772c307f9010d15836d39dc4 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Mon, 6 Nov 2017 14:36:24 +0800
Subject: [2/2] server: Deliver an async io APC to any alive thread in the
process.
Content-Type: text/plain; charset=UTF-8
---
server/async.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/async.c b/server/async.c
index 3e0c25706d..b2b0b97671 100644
--- a/server/async.c
+++ b/server/async.c
@@ -169,7 +169,7 @@ void async_terminate( struct async *async, unsigned int status )
data.async_io.user = async->data.user;
data.async_io.sb = async->data.iosb;
data.async_io.status = status;
- thread_queue_apc( NULL, async->thread, &async->obj, &data );
+ thread_queue_apc( async->thread->process, async->thread, &async->obj, &data );
}
else async_set_result( &async->obj, STATUS_SUCCESS, 0 );
}
--
2.15.0