Initial original import from: fuse-2.4.2-2.fc4
[captive.git] / src / libcaptive / ex / work.c
index bf64179..3094f61 100644 (file)
 #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.
  *
@@ -47,15 +50,16 @@ static gboolean ExQueueWorkItem_idlefunc(WORK_QUEUE_ITEM *WorkItem /* data */)
  * 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:
@@ -72,9 +76,10 @@ gint priority;
                        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 */
 }