wdm 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,50 +1,50 @@
1
- #include <Windows.h>
2
-
3
- #include "entry.h"
4
- #include "queue.h"
5
-
6
- #ifndef WDM_MONITOR_H
7
- #define WDM_MONITOR_H
8
-
9
- #ifdef __cplusplus
10
- extern "C" {
11
- #endif // __cplusplus
12
-
13
- // ---------------------------------------------------------
14
- // Types
15
- // ---------------------------------------------------------
16
-
17
- typedef struct {
18
- BOOL running;
19
- WDM_PEntry head;
20
- WDM_PQueue changes;
21
- CRITICAL_SECTION lock;
22
- HANDLE monitoring_thread;
23
- HANDLE process_event;
24
- HANDLE stop_event;
25
- } WDM_Monitor, *WDM_PMonitor;
26
-
27
- typedef struct {
28
- WDM_PEntry entry;
29
- WDM_PMonitor monitor;
30
- } WDM_MonitorCallbackParam, *WDM_PMonitorCallbackParam;
31
-
32
- // ---------------------------------------------------------
33
- // Prototypes
34
- // ---------------------------------------------------------
35
-
36
- WDM_PMonitor wdm_monitor_new();
37
- void wdm_monitor_free(WDM_PMonitor);
38
-
39
- void wdm_monitor_update_head(WDM_PMonitor, WDM_PEntry);
40
-
41
- WDM_PMonitorCallbackParam wdm_monitor_callback_param_new(WDM_PMonitor, WDM_PEntry);
42
- void wdm_monitor_callback_param_free(WDM_PMonitorCallbackParam);
43
-
44
- // ---------------------------------------------------------
45
-
46
- #ifdef __cplusplus
47
- }
48
- #endif // __cplusplus
49
-
1
+ #include <Windows.h>
2
+
3
+ #include "entry.h"
4
+ #include "queue.h"
5
+
6
+ #ifndef WDM_MONITOR_H
7
+ #define WDM_MONITOR_H
8
+
9
+ #ifdef __cplusplus
10
+ extern "C" {
11
+ #endif // __cplusplus
12
+
13
+ // ---------------------------------------------------------
14
+ // Types
15
+ // ---------------------------------------------------------
16
+
17
+ typedef struct {
18
+ BOOL running;
19
+ WDM_PEntry head;
20
+ WDM_PQueue changes;
21
+ CRITICAL_SECTION lock;
22
+ HANDLE monitoring_thread;
23
+ HANDLE process_event;
24
+ HANDLE stop_event;
25
+ } WDM_Monitor, *WDM_PMonitor;
26
+
27
+ typedef struct {
28
+ WDM_PEntry entry;
29
+ WDM_PMonitor monitor;
30
+ } WDM_MonitorCallbackParam, *WDM_PMonitorCallbackParam;
31
+
32
+ // ---------------------------------------------------------
33
+ // Prototypes
34
+ // ---------------------------------------------------------
35
+
36
+ WDM_PMonitor wdm_monitor_new();
37
+ void wdm_monitor_free(WDM_PMonitor);
38
+
39
+ void wdm_monitor_update_head(WDM_PMonitor, WDM_PEntry);
40
+
41
+ WDM_PMonitorCallbackParam wdm_monitor_callback_param_new(WDM_PMonitor, WDM_PEntry);
42
+ void wdm_monitor_callback_param_free(WDM_PMonitorCallbackParam);
43
+
44
+ // ---------------------------------------------------------
45
+
46
+ #ifdef __cplusplus
47
+ }
48
+ #endif // __cplusplus
49
+
50
50
  #endif // WDM_MONITOR_H
@@ -1,196 +1,196 @@
1
- #include <stdarg.h>
2
-
3
- #include "wdm.h"
4
-
5
- #include "memory.h"
6
- #include "queue.h"
7
-
8
- // ---------------------------------------------------------
9
- // Prototypes of static functions
10
- // ---------------------------------------------------------
11
-
12
- static WDM_PQueueItem do_queue_dequeue(WDM_PQueue queue);
13
-
14
- // ---------------------------------------------------------
15
- // Queue item functions
16
- // ---------------------------------------------------------
17
-
18
- WDM_PQueueItemError
19
- wdm_queue_item_error_new(VALUE exception, LPCSTR format, ...)
20
- {
21
- WDM_PQueueItemError error;
22
- va_list ap;
23
- int length;
24
-
25
- error = WDM_ALLOC(WDM_QueueItemError);
26
-
27
- va_start(ap, format);
28
- length = _vscprintf(format, ap);
29
- error->message = WDM_ALLOC_N(CHAR, length + 1);
30
- vsprintf(error->message, format, ap);
31
- va_end(ap);
32
-
33
- error->exception_klass = exception;
34
-
35
- return error;
36
- }
37
-
38
- void
39
- wdm_queue_item_error_free(WDM_PQueueItemError error)
40
- {
41
- if ( error->message != NULL ) free(error->message);
42
- free(error);
43
- }
44
-
45
- WDM_PQueueItemData
46
- wdm_queue_item_data_new()
47
- {
48
- WDM_PQueueItemData data;
49
-
50
- data = WDM_ALLOC(WDM_QueueItemData);
51
- data->user_data = NULL;
52
-
53
- ZeroMemory(&data->buffer, WDM_BUFFER_SIZE);
54
-
55
- return data;
56
- }
57
-
58
- void
59
- wdm_queue_item_data_free(WDM_PQueueItemData data)
60
- {
61
- free(data);
62
- }
63
-
64
- WDM_PQueueItem
65
- wdm_queue_item_new(WDM_QueueItemType type)
66
- {
67
- WDM_PQueueItem item;
68
-
69
- item = WDM_ALLOC(WDM_QueueItem);
70
- item->type = type;
71
-
72
- if ( type == WDM_QUEUE_ITEM_TYPE_ERROR ) {
73
- item->error = NULL;
74
- }
75
- else {
76
- item->data = NULL;
77
- }
78
-
79
- item->next = NULL;
80
-
81
- return item;
82
- }
83
-
84
- void
85
- wdm_queue_item_free(WDM_PQueueItem item)
86
- {
87
- if ( item->type == WDM_QUEUE_ITEM_TYPE_ERROR ) {
88
- if ( item->error != NULL ) wdm_queue_item_error_free(item->error);
89
- }
90
- else {
91
- if ( item->data != NULL ) wdm_queue_item_data_free(item->data);
92
- }
93
-
94
- // We can't really do anything to the next pointer because
95
- // we might break any linking the user has established.
96
- free(item);
97
- }
98
-
99
- // ---------------------------------------------------------
100
- // Queue functions
101
- // ---------------------------------------------------------
102
-
103
- WDM_PQueue
104
- wdm_queue_new()
105
- {
106
- WDM_PQueue queue;
107
-
108
- queue = WDM_ALLOC(WDM_Queue);
109
- queue->front = NULL;
110
- queue->rear = NULL;
111
-
112
- if ( ! InitializeCriticalSectionAndSpinCount(&queue->lock,
113
- 0x00000400) ) // TODO: look into the best value for spinning.
114
- {
115
- rb_raise(eWDM_Error, "Can't create a lock for the queue");
116
- }
117
-
118
- return queue;
119
- }
120
-
121
- void
122
- wdm_queue_free(WDM_PQueue queue)
123
- {
124
- wdm_queue_empty(queue);
125
- free(queue);
126
- }
127
-
128
- void
129
- wdm_queue_enqueue(WDM_PQueue queue, WDM_PQueueItem item)
130
- {
131
- EnterCriticalSection(&queue->lock);
132
-
133
- if ( wdm_queue_is_empty(queue) ) {
134
- queue->front = queue->rear = item;
135
- }
136
- else {
137
- queue->rear->next = item;
138
- queue->rear = item;
139
- }
140
-
141
- LeaveCriticalSection(&queue->lock);
142
- }
143
-
144
- WDM_PQueueItem
145
- do_queue_dequeue(WDM_PQueue queue)
146
- {
147
- WDM_PQueueItem item;
148
-
149
- if ( wdm_queue_is_empty(queue) ) {
150
- item = NULL;
151
- }
152
- else {
153
- item = queue->front;
154
- queue->front = queue->front->next;
155
-
156
- // Reset the rear when the queue is empty
157
- if ( queue->front == NULL ) queue->rear = NULL;
158
-
159
- // Don't allow the user to mess with the queue
160
- item->next = NULL;
161
- }
162
-
163
- return item;
164
- }
165
-
166
- WDM_PQueueItem
167
- wdm_queue_dequeue(WDM_PQueue queue)
168
- {
169
- WDM_PQueueItem item;
170
-
171
- EnterCriticalSection(&queue->lock);
172
-
173
- item = do_queue_dequeue(queue);
174
-
175
- LeaveCriticalSection(&queue->lock);
176
-
177
- return item;
178
- }
179
-
180
- void
181
- wdm_queue_empty(WDM_PQueue queue)
182
- {
183
- EnterCriticalSection(&queue->lock);
184
-
185
- while( ! wdm_queue_is_empty(queue) ) {
186
- wdm_queue_item_free( do_queue_dequeue(queue) );
187
- }
188
-
189
- LeaveCriticalSection(&queue->lock);
190
- }
191
-
192
- inline BOOL
193
- wdm_queue_is_empty(WDM_PQueue queue)
194
- {
195
- return queue->front == NULL && queue->rear == NULL;
1
+ #include <stdarg.h>
2
+
3
+ #include "wdm.h"
4
+
5
+ #include "memory.h"
6
+ #include "queue.h"
7
+
8
+ // ---------------------------------------------------------
9
+ // Prototypes of static functions
10
+ // ---------------------------------------------------------
11
+
12
+ static WDM_PQueueItem do_queue_dequeue(WDM_PQueue queue);
13
+
14
+ // ---------------------------------------------------------
15
+ // Queue item functions
16
+ // ---------------------------------------------------------
17
+
18
+ WDM_PQueueItemError
19
+ wdm_queue_item_error_new(VALUE exception, LPCSTR format, ...)
20
+ {
21
+ WDM_PQueueItemError error;
22
+ va_list ap;
23
+ int length;
24
+
25
+ error = WDM_ALLOC(WDM_QueueItemError);
26
+
27
+ va_start(ap, format);
28
+ length = _vscprintf(format, ap);
29
+ error->message = WDM_ALLOC_N(CHAR, length + 1);
30
+ vsprintf(error->message, format, ap);
31
+ va_end(ap);
32
+
33
+ error->exception_klass = exception;
34
+
35
+ return error;
36
+ }
37
+
38
+ void
39
+ wdm_queue_item_error_free(WDM_PQueueItemError error)
40
+ {
41
+ if ( error->message != NULL ) free(error->message);
42
+ free(error);
43
+ }
44
+
45
+ WDM_PQueueItemData
46
+ wdm_queue_item_data_new()
47
+ {
48
+ WDM_PQueueItemData data;
49
+
50
+ data = WDM_ALLOC(WDM_QueueItemData);
51
+ data->user_data = NULL;
52
+
53
+ ZeroMemory(&data->buffer, WDM_BUFFER_SIZE);
54
+
55
+ return data;
56
+ }
57
+
58
+ void
59
+ wdm_queue_item_data_free(WDM_PQueueItemData data)
60
+ {
61
+ free(data);
62
+ }
63
+
64
+ WDM_PQueueItem
65
+ wdm_queue_item_new(WDM_QueueItemType type)
66
+ {
67
+ WDM_PQueueItem item;
68
+
69
+ item = WDM_ALLOC(WDM_QueueItem);
70
+ item->type = type;
71
+
72
+ if ( type == WDM_QUEUE_ITEM_TYPE_ERROR ) {
73
+ item->error = NULL;
74
+ }
75
+ else {
76
+ item->data = NULL;
77
+ }
78
+
79
+ item->next = NULL;
80
+
81
+ return item;
82
+ }
83
+
84
+ void
85
+ wdm_queue_item_free(WDM_PQueueItem item)
86
+ {
87
+ if ( item->type == WDM_QUEUE_ITEM_TYPE_ERROR ) {
88
+ if ( item->error != NULL ) wdm_queue_item_error_free(item->error);
89
+ }
90
+ else {
91
+ if ( item->data != NULL ) wdm_queue_item_data_free(item->data);
92
+ }
93
+
94
+ // We can't really do anything to the next pointer because
95
+ // we might break any linking the user has established.
96
+ free(item);
97
+ }
98
+
99
+ // ---------------------------------------------------------
100
+ // Queue functions
101
+ // ---------------------------------------------------------
102
+
103
+ WDM_PQueue
104
+ wdm_queue_new()
105
+ {
106
+ WDM_PQueue queue;
107
+
108
+ queue = WDM_ALLOC(WDM_Queue);
109
+ queue->front = NULL;
110
+ queue->rear = NULL;
111
+
112
+ if ( ! InitializeCriticalSectionAndSpinCount(&queue->lock,
113
+ 0x00000400) ) // TODO: look into the best value for spinning.
114
+ {
115
+ rb_raise(eWDM_Error, "Can't create a lock for the queue");
116
+ }
117
+
118
+ return queue;
119
+ }
120
+
121
+ void
122
+ wdm_queue_free(WDM_PQueue queue)
123
+ {
124
+ wdm_queue_empty(queue);
125
+ free(queue);
126
+ }
127
+
128
+ void
129
+ wdm_queue_enqueue(WDM_PQueue queue, WDM_PQueueItem item)
130
+ {
131
+ EnterCriticalSection(&queue->lock);
132
+
133
+ if ( wdm_queue_is_empty(queue) ) {
134
+ queue->front = queue->rear = item;
135
+ }
136
+ else {
137
+ queue->rear->next = item;
138
+ queue->rear = item;
139
+ }
140
+
141
+ LeaveCriticalSection(&queue->lock);
142
+ }
143
+
144
+ WDM_PQueueItem
145
+ do_queue_dequeue(WDM_PQueue queue)
146
+ {
147
+ WDM_PQueueItem item;
148
+
149
+ if ( wdm_queue_is_empty(queue) ) {
150
+ item = NULL;
151
+ }
152
+ else {
153
+ item = queue->front;
154
+ queue->front = queue->front->next;
155
+
156
+ // Reset the rear when the queue is empty
157
+ if ( queue->front == NULL ) queue->rear = NULL;
158
+
159
+ // Don't allow the user to mess with the queue
160
+ item->next = NULL;
161
+ }
162
+
163
+ return item;
164
+ }
165
+
166
+ WDM_PQueueItem
167
+ wdm_queue_dequeue(WDM_PQueue queue)
168
+ {
169
+ WDM_PQueueItem item;
170
+
171
+ EnterCriticalSection(&queue->lock);
172
+
173
+ item = do_queue_dequeue(queue);
174
+
175
+ LeaveCriticalSection(&queue->lock);
176
+
177
+ return item;
178
+ }
179
+
180
+ void
181
+ wdm_queue_empty(WDM_PQueue queue)
182
+ {
183
+ EnterCriticalSection(&queue->lock);
184
+
185
+ while( ! wdm_queue_is_empty(queue) ) {
186
+ wdm_queue_item_free( do_queue_dequeue(queue) );
187
+ }
188
+
189
+ LeaveCriticalSection(&queue->lock);
190
+ }
191
+
192
+ inline BOOL
193
+ wdm_queue_is_empty(WDM_PQueue queue)
194
+ {
195
+ return queue->front == NULL && queue->rear == NULL;
196
196
  }