#include <glib/gmessages.h>
#include "reactos/ddk/extypes.h" /* for WORK_QUEUE_ITEM */
#include <glib/gmain.h>
+#include "captive/macros.h"
-static gboolean ExQueueWorkItem_idlefunc(WORK_QUEUE_ITEM *WorkItem /* data */)
+static gboolean ExQueueWorkItem_idlefunc(WORK_QUEUE_ITEM *WorkItem_copy /* data */)
{
- g_return_val_if_fail(WorkItem!=NULL,FALSE); /* false=>remove-me */
- g_return_val_if_fail(WorkItem->Routine!=NULL,FALSE); /* false=>remove-me */
+ g_return_val_if_fail(WorkItem_copy!=NULL,FALSE); /* false=>remove-me */
+ g_return_val_if_fail(WorkItem_copy->WorkerRoutine!=NULL,FALSE); /* false=>remove-me */
/* typedef VOID STDCALL_FUNC (*PWORKER_THREAD_ROUTINE)(PVOID Parameter); */
- (*WorkItem->Routine)(WorkItem->Context);
- WorkItem->Routine=NULL; /* request is no longer pending */
+ captive_stdcall_call_4((CaptiveStdCallFunc4)WorkItem_copy->WorkerRoutine,
+ WorkItem_copy->Parameter); /* Parameter */
+ g_free(WorkItem_copy);
+
return FALSE; /* remove-me */
}
/**
* ExQueueWorkItem:
- * @WorkItem: Initialized structure of #WORK_QUEUE_ITEM to be initialize.
+ * @WorkItem: Initialized structure of #WORK_QUEUE_ITEM to enqueue.
* %NULL value is forbidden.
* @QueueType: Queue priority.
*
* process. It will be processed through g_idle_add_full() with priority
* range %G_PRIORITY_DEFAULT+10 ... %G_PRIORITY_DEFAULT+30.
*
- * FIXME: @WorkItem is required by libcaptive to remain valid until invocation.
- * Is it legal?
+ * @WorkItem memory address space can be freed even before its function invocation
+ * (required by ntfs.sys).
*/
VOID ExQueueWorkItem(PWORK_QUEUE_ITEM WorkItem,WORK_QUEUE_TYPE QueueType)
{
gint priority;
+WORK_QUEUE_ITEM *WorkItem_copy;
g_return_if_fail(WorkItem!=NULL);
- g_return_if_fail(WorkItem->Routine!=NULL);
+ g_return_if_fail(WorkItem->WorkerRoutine!=NULL);
switch (QueueType) {
case DelayedWorkQueue:
priority=G_PRIORITY_DEFAULT;
}
+ captive_memdup(WorkItem_copy,WorkItem);
g_idle_add_full(
priority, /* priority */
(GSourceFunc)ExQueueWorkItem_idlefunc, /* function */
- WorkItem, /* data */
+ WorkItem_copy, /* data */
NULL); /* notify */
}