Author: fireball
Date: Mon Nov 1 14:36:45 2010
New Revision: 49404
URL:
http://svn.reactos.org/svn/reactos?rev=49404&view=rev
Log:
- Stop abusing non paged pool in arwinss.
- Fix different time units usage in message queue code.
- My timeout implementation still s..ks b..ls.
See issue #5222 for more details.
Modified:
branches/arwinss/reactos/subsystems/win32/win32k/include/winesup.h
branches/arwinss/reactos/subsystems/win32/win32k/wine/queue.c
branches/arwinss/reactos/subsystems/win32/win32k/wine/winesup.c
Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/winesup.h
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/winesup.h [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/winesup.h [iso-8859-1] Mon
Nov 1 14:36:45 2010
@@ -129,11 +129,20 @@
KDPC Dpc;
};
-enum timeout_t;
typedef PKDEFERRED_ROUTINE timeout_callback;
#define TICKS_PER_SEC 10000000
void remove_timeout_user( struct timeout_user *user );
struct timeout_user *add_timeout_user( timeout_t when, timeout_callback func, void
*private );
+
+VOID FORCEINLINE
+get_current_time(timeout_t *value)
+{
+ LARGE_INTEGER time;
+ KeQuerySystemTime(&time);
+
+ *value = time.QuadPart / 10;
+}
+
thread_id_t get_thread_id (PTHREADINFO Thread);
process_id_t get_process_id(PPROCESSINFO Process);
Modified: branches/arwinss/reactos/subsystems/win32/win32k/wine/queue.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/wine/queue.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/wine/queue.c [iso-8859-1] Mon Nov 1
14:36:45 2010
@@ -278,7 +278,7 @@
queue->timeout = NULL;
queue->input = (struct thread_input *)grab_object( input );
queue->hooks = NULL;
- KeQuerySystemTime((PLARGE_INTEGER)&queue->last_get_msg);
+ get_current_time(&queue->last_get_msg);
list_init( &queue->send_result );
list_init( &queue->callback_result );
list_init( &queue->pending_timers );
@@ -585,7 +585,7 @@
struct msg_queue *recv_queue,
struct message *msg, timeout_t
timeout )
{
- struct message_result *result = ExAllocatePool( NonPagedPool, sizeof(*result) );
+ struct message_result *result = ExAllocatePool( PagedPool, sizeof(*result) );
if (result)
{
result->msg = msg;
@@ -804,11 +804,11 @@
static int is_queue_hung( struct msg_queue *queue )
{
//struct wait_queue_entry *entry;
- LARGE_INTEGER current_time;
-
- KeQuerySystemTime(¤t_time);
-
- if (current_time.QuadPart - queue->last_get_msg <= 5 * TICKS_PER_SEC)
+ timeout_t current_time;
+
+ get_current_time(¤t_time);
+
+ if (current_time - queue->last_get_msg <= 5 * TICKS_PER_SEC)
return 0; /* less than 5 seconds since last get message -> not hung */
#if 0
@@ -1097,8 +1097,6 @@
struct msg_queue *queue = Context;
PQUEUE_WORKER_CONTEXT work_context;
- ASSERT(queue);
-
/* Allocate memory for the work iteam */
work_context = ExAllocatePool(NonPagedPool, sizeof(QUEUE_WORKER_CONTEXT));
@@ -1133,11 +1131,11 @@
/* restart an expired timer */
static void restart_timer( struct msg_queue *queue, struct timer *timer )
{
- LARGE_INTEGER current_time;
- KeQuerySystemTime(¤t_time);
+ timeout_t current_time;
+ get_current_time(¤t_time);
list_remove( &timer->entry );
- while (timer->when <= current_time.QuadPart) timer->when +=
(timeout_t)timer->rate * 10000;
+ while (timer->when <= current_time) timer->when += (timeout_t)timer->rate
* 10000;
link_timer( queue, timer );
set_next_timer( queue );
}
@@ -1165,15 +1163,15 @@
/* add a timer */
static struct timer *set_timer( struct msg_queue *queue, unsigned int rate )
{
- LARGE_INTEGER current_time;
+ timeout_t current_time;
struct timer *timer;
- KeQuerySystemTime(¤t_time);
+ get_current_time(¤t_time);
timer = mem_alloc( sizeof(*timer) );
if (timer)
{
timer->rate = max( rate, 1 );
- timer->when = current_time.QuadPart + (timeout_t)timer->rate * 10000;
+ timer->when = current_time + (timeout_t)timer->rate * 10000;
link_timer( queue, timer );
/* check if we replaced the next timer */
if (list_head( &queue->pending_timers ) == &timer->entry)
set_next_timer( queue );
@@ -1564,7 +1562,7 @@
if (!thread) return;
- if (thread->queue && (msg = ExAllocatePool( NonPagedPool, sizeof(*msg)
)))
+ if (thread->queue && (msg = ExAllocatePool( PagedPool, sizeof(*msg) )))
{
msg->type = MSG_POSTED;
msg->win = get_user_full_handle( win );
@@ -1591,7 +1589,7 @@
{
struct message *msg;
- if (thread->queue && (msg = ExAllocatePool( NonPagedPool, sizeof(*msg)
)))
+ if (thread->queue && (msg = ExAllocatePool( PagedPool, sizeof(*msg) )))
{
struct winevent_msg_data *data;
@@ -1753,7 +1751,7 @@
return;
}
- if ((msg = ExAllocatePool( NonPagedPool, sizeof(*msg) )))
+ if ((msg = ExAllocatePool( PagedPool, sizeof(*msg) )))
{
msg->type = req->type;
msg->win = get_user_full_handle( req->win );
@@ -1844,7 +1842,7 @@
data->y = req->y;
data->info = req->info;
- if ((msg = ExAllocatePool( NonPagedPool, sizeof(*msg) )))
+ if ((msg = ExAllocatePool( PagedPool, sizeof(*msg) )))
{
msg->type = MSG_HARDWARE;
msg->win = get_user_full_handle( req->win );
@@ -1878,7 +1876,7 @@
/* get a message from the current queue */
DECL_HANDLER(get_message)
{
- LARGE_INTEGER current_time;
+ timeout_t current_time;
struct timer *timer;
struct list *ptr;
PPROCESSINFO process = PsGetCurrentProcessWin32Process();
@@ -1889,8 +1887,8 @@
reply->active_hooks = get_active_hooks();
if (!queue) return;
- KeQuerySystemTime(¤t_time);
- queue->last_get_msg = current_time.QuadPart;
+ get_current_time(¤t_time);
+ queue->last_get_msg = current_time;
if (!filter) filter = QS_ALLINPUT;
/* first check for sent messages */
Modified: branches/arwinss/reactos/subsystems/win32/win32k/wine/winesup.c
URL:
http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win3…
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/wine/winesup.c [iso-8859-1]
(original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/wine/winesup.c [iso-8859-1] Mon Nov
1 14:36:45 2010
@@ -54,12 +54,12 @@
LARGE_INTEGER DueTime;
struct timeout_user *TimeoutUser;
- DueTime.QuadPart = (LONGLONG)when;
-
- DPRINT("add_timeout_user(when %I64d, func %p)\n", when, func);
+ DueTime.QuadPart = (LONGLONG)when * 10;
/* Allocate memory for timeout structure */
TimeoutUser = ExAllocatePool(NonPagedPool, sizeof(struct timeout_user));
+
+ //DPRINT1("add_timeout_user(%p when %I64d, diff %I64d msecs, func %p)\n",
TimeoutUser, when, secs, func);
/* Initialize timer and DPC objects */
KeInitializeTimer(&TimeoutUser->Timer);
@@ -74,7 +74,7 @@
/* remove a timeout user */
void remove_timeout_user( struct timeout_user *user )
{
- DPRINT("remove_timeout_user %p\n", user);
+ //DPRINT1("remove_timeout_user %p, current time %I64d\n", user,
current_time);
/* Cancel the timer */
KeCancelTimer(&user->Timer);