summaryrefslogtreecommitdiff
path: root/network/trans/stmedit/sys/LwQueue.h
blob: b1546062da8c8f66f1b2efc0a2bf1043d20e0c5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#ifndef _LWQUEUE_H
#define _LWQUEUE_H

#define POOL_ZERO_DOWN_LEVEL_SUPPORT
#include <wdm.h>

#define STMEDIT_TAG_LQWI 'wLeS'   // Light Weight Queue Work Items.

typedef struct _LW_ENTRY 
{
    struct _LW_ENTRY *Next;
} LW_ENTRY, *PLW_ENTRY;

typedef struct _LW_QUEUE
{
    // Queue Head
    PLW_ENTRY Head;

    // Queue Tail
    PLW_ENTRY Tail;

    // Dummy Queue head.
    LW_ENTRY Dummy;

    // Lock for queue synchronization
    KSPIN_LOCK Lock;

    // If a workitem is already scheduled
    BOOLEAN WorkerScheduled;

    // Is the Queue initialized
    BOOLEAN Initialized;

    // Workitem for IoXxxWorkItem
    PIO_WORKITEM WorkItem;

    // Callback routine to be invoked
    PIO_WORKITEM_ROUTINE WorkerRoutine;

    // One of the caller's device objects.
    PVOID IoObject;

} LW_QUEUE, *PLW_QUEUE;


NTSTATUS
LwInitializeQueue(
    _In_  PVOID IoObject,
    _Out_ PLW_QUEUE Queue,
    _In_  PIO_WORKITEM_ROUTINE WorkerRoutine
    );

VOID
LwUninitializeQueue(
    _Inout_ PLW_QUEUE Queue
    );

VOID
LwEnqueue(
    _In_ PLW_QUEUE Queue,
    _In_ PLW_ENTRY Entry
    );

PLW_ENTRY
LwDequeueAll(
    _In_ PLW_QUEUE Queue
    );


#endif // _LWQUEUE_H