wdm 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +21 -21
- data/README.md +206 -206
- data/ext/wdm/entry.c +71 -71
- data/ext/wdm/entry.h +46 -46
- data/ext/wdm/extconf.rb +28 -27
- data/ext/wdm/memory.c +26 -26
- data/ext/wdm/memory.h +29 -29
- data/ext/wdm/monitor.c +74 -74
- data/ext/wdm/monitor.h +49 -49
- data/ext/wdm/queue.c +195 -195
- data/ext/wdm/queue.h +72 -72
- data/ext/wdm/rb_change.c +198 -198
- data/ext/wdm/rb_change.h +27 -27
- data/ext/wdm/rb_monitor.c +574 -570
- data/ext/wdm/rb_monitor.h +39 -39
- data/ext/wdm/utils.c +76 -76
- data/ext/wdm/utils.h +25 -25
- data/ext/wdm/wdm.c +46 -46
- data/ext/wdm/wdm.h +81 -71
- data/ext/wdm/wdm.sln +20 -20
- data/ext/wdm/wdm.vcxproj +105 -105
- data/ext/wdm/wdm.vcxproj.filters +73 -73
- data/lib/wdm.rb +9 -9
- metadata +20 -64
data/ext/wdm/entry.c
CHANGED
@@ -1,72 +1,72 @@
|
|
1
|
-
#include "wdm.h"
|
2
|
-
|
3
|
-
#include "memory.h"
|
4
|
-
#include "entry.h"
|
5
|
-
|
6
|
-
// ---------------------------------------------------------
|
7
|
-
// Entry user data functions
|
8
|
-
// ---------------------------------------------------------
|
9
|
-
|
10
|
-
WDM_PEntryUserData
|
11
|
-
wdm_entry_user_data_new()
|
12
|
-
{
|
13
|
-
WDM_PEntryUserData user_data;
|
14
|
-
|
15
|
-
user_data = WDM_ALLOC(WDM_EntryUserData);
|
16
|
-
|
17
|
-
user_data->dir = NULL;
|
18
|
-
user_data->watch_childeren = FALSE;
|
19
|
-
|
20
|
-
return user_data;
|
21
|
-
}
|
22
|
-
|
23
|
-
void
|
24
|
-
wdm_entry_user_data_free(WDM_PEntryUserData user_data)
|
25
|
-
{
|
26
|
-
if ( user_data->dir != NULL ) free(user_data->dir);
|
27
|
-
free(user_data);
|
28
|
-
}
|
29
|
-
|
30
|
-
// ---------------------------------------------------------
|
31
|
-
// Entry functions
|
32
|
-
// ---------------------------------------------------------
|
33
|
-
|
34
|
-
WDM_PEntry
|
35
|
-
wdm_entry_new()
|
36
|
-
{
|
37
|
-
WDM_PEntry entry;
|
38
|
-
|
39
|
-
entry = WDM_ALLOC(WDM_Entry);
|
40
|
-
|
41
|
-
entry->user_data = wdm_entry_user_data_new();
|
42
|
-
entry->dir_handle = INVALID_HANDLE_VALUE;
|
43
|
-
entry->next = NULL;
|
44
|
-
|
45
|
-
ZeroMemory(&entry->buffer, WDM_BUFFER_SIZE);
|
46
|
-
ZeroMemory(&entry->event_container, sizeof(OVERLAPPED));
|
47
|
-
|
48
|
-
return entry;
|
49
|
-
}
|
50
|
-
|
51
|
-
void
|
52
|
-
wdm_entry_free(WDM_PEntry entry)
|
53
|
-
{
|
54
|
-
if ( entry->dir_handle != INVALID_HANDLE_VALUE ) {
|
55
|
-
CancelIo(entry->dir_handle); // Stop monitoring changes
|
56
|
-
CloseHandle(entry->dir_handle);
|
57
|
-
}
|
58
|
-
wdm_entry_user_data_free(entry->user_data);
|
59
|
-
free(entry);
|
60
|
-
}
|
61
|
-
|
62
|
-
void
|
63
|
-
wdm_entry_list_free(WDM_PEntry entry)
|
64
|
-
{
|
65
|
-
WDM_PEntry tmp;
|
66
|
-
|
67
|
-
while(entry != NULL) {
|
68
|
-
tmp = entry;
|
69
|
-
entry = entry->next;
|
70
|
-
wdm_entry_free(tmp);
|
71
|
-
}
|
1
|
+
#include "wdm.h"
|
2
|
+
|
3
|
+
#include "memory.h"
|
4
|
+
#include "entry.h"
|
5
|
+
|
6
|
+
// ---------------------------------------------------------
|
7
|
+
// Entry user data functions
|
8
|
+
// ---------------------------------------------------------
|
9
|
+
|
10
|
+
WDM_PEntryUserData
|
11
|
+
wdm_entry_user_data_new()
|
12
|
+
{
|
13
|
+
WDM_PEntryUserData user_data;
|
14
|
+
|
15
|
+
user_data = WDM_ALLOC(WDM_EntryUserData);
|
16
|
+
|
17
|
+
user_data->dir = NULL;
|
18
|
+
user_data->watch_childeren = FALSE;
|
19
|
+
|
20
|
+
return user_data;
|
21
|
+
}
|
22
|
+
|
23
|
+
void
|
24
|
+
wdm_entry_user_data_free(WDM_PEntryUserData user_data)
|
25
|
+
{
|
26
|
+
if ( user_data->dir != NULL ) free(user_data->dir);
|
27
|
+
free(user_data);
|
28
|
+
}
|
29
|
+
|
30
|
+
// ---------------------------------------------------------
|
31
|
+
// Entry functions
|
32
|
+
// ---------------------------------------------------------
|
33
|
+
|
34
|
+
WDM_PEntry
|
35
|
+
wdm_entry_new()
|
36
|
+
{
|
37
|
+
WDM_PEntry entry;
|
38
|
+
|
39
|
+
entry = WDM_ALLOC(WDM_Entry);
|
40
|
+
|
41
|
+
entry->user_data = wdm_entry_user_data_new();
|
42
|
+
entry->dir_handle = INVALID_HANDLE_VALUE;
|
43
|
+
entry->next = NULL;
|
44
|
+
|
45
|
+
ZeroMemory(&entry->buffer, WDM_BUFFER_SIZE);
|
46
|
+
ZeroMemory(&entry->event_container, sizeof(OVERLAPPED));
|
47
|
+
|
48
|
+
return entry;
|
49
|
+
}
|
50
|
+
|
51
|
+
void
|
52
|
+
wdm_entry_free(WDM_PEntry entry)
|
53
|
+
{
|
54
|
+
if ( entry->dir_handle != INVALID_HANDLE_VALUE ) {
|
55
|
+
CancelIo(entry->dir_handle); // Stop monitoring changes
|
56
|
+
CloseHandle(entry->dir_handle);
|
57
|
+
}
|
58
|
+
wdm_entry_user_data_free(entry->user_data);
|
59
|
+
free(entry);
|
60
|
+
}
|
61
|
+
|
62
|
+
void
|
63
|
+
wdm_entry_list_free(WDM_PEntry entry)
|
64
|
+
{
|
65
|
+
WDM_PEntry tmp;
|
66
|
+
|
67
|
+
while(entry != NULL) {
|
68
|
+
tmp = entry;
|
69
|
+
entry = entry->next;
|
70
|
+
wdm_entry_free(tmp);
|
71
|
+
}
|
72
72
|
}
|
data/ext/wdm/entry.h
CHANGED
@@ -1,47 +1,47 @@
|
|
1
|
-
#include <Windows.h>
|
2
|
-
#include <ruby.h>
|
3
|
-
|
4
|
-
#ifndef WDM_ENTRY_H
|
5
|
-
#define WDM_ENTRY_H
|
6
|
-
|
7
|
-
#ifdef __cplusplus
|
8
|
-
extern "C" {
|
9
|
-
#endif // __cplusplus
|
10
|
-
|
11
|
-
// ---------------------------------------------------------
|
12
|
-
// Types
|
13
|
-
// ---------------------------------------------------------
|
14
|
-
|
15
|
-
typedef struct {
|
16
|
-
LPWSTR dir; // Name of directory to watch
|
17
|
-
VALUE callback; // Proc object to call when there are changes
|
18
|
-
BOOL watch_childeren; // Watch sub-directories
|
19
|
-
DWORD flags; // Flags for the type of changes to report
|
20
|
-
} WDM_EntryUserData, *WDM_PEntryUserData;
|
21
|
-
|
22
|
-
typedef struct WDM_Entry {
|
23
|
-
WDM_PEntryUserData user_data; // User-supplied data
|
24
|
-
HANDLE dir_handle; // IO handle of the directory
|
25
|
-
BYTE buffer[WDM_BUFFER_SIZE]; // Buffer for the results
|
26
|
-
OVERLAPPED event_container; // Async IO event container
|
27
|
-
struct WDM_Entry* next; // Well, this is a linked list, so this is self-explanatory :)
|
28
|
-
} WDM_Entry, *WDM_PEntry;
|
29
|
-
|
30
|
-
// ---------------------------------------------------------
|
31
|
-
// Prototypes
|
32
|
-
// ---------------------------------------------------------
|
33
|
-
|
34
|
-
WDM_PEntryUserData wdm_entry_user_data_new();
|
35
|
-
void wdm_entry_user_data_free(WDM_PEntryUserData);
|
36
|
-
|
37
|
-
WDM_PEntry wdm_entry_new();
|
38
|
-
void wdm_entry_free(WDM_PEntry);
|
39
|
-
void wdm_entry_list_free(WDM_PEntry);
|
40
|
-
|
41
|
-
// ---------------------------------------------------------
|
42
|
-
|
43
|
-
#ifdef __cplusplus
|
44
|
-
}
|
45
|
-
#endif // __cplusplus
|
46
|
-
|
1
|
+
#include <Windows.h>
|
2
|
+
#include <ruby.h>
|
3
|
+
|
4
|
+
#ifndef WDM_ENTRY_H
|
5
|
+
#define WDM_ENTRY_H
|
6
|
+
|
7
|
+
#ifdef __cplusplus
|
8
|
+
extern "C" {
|
9
|
+
#endif // __cplusplus
|
10
|
+
|
11
|
+
// ---------------------------------------------------------
|
12
|
+
// Types
|
13
|
+
// ---------------------------------------------------------
|
14
|
+
|
15
|
+
typedef struct {
|
16
|
+
LPWSTR dir; // Name of directory to watch
|
17
|
+
VALUE callback; // Proc object to call when there are changes
|
18
|
+
BOOL watch_childeren; // Watch sub-directories
|
19
|
+
DWORD flags; // Flags for the type of changes to report
|
20
|
+
} WDM_EntryUserData, *WDM_PEntryUserData;
|
21
|
+
|
22
|
+
typedef struct WDM_Entry {
|
23
|
+
WDM_PEntryUserData user_data; // User-supplied data
|
24
|
+
HANDLE dir_handle; // IO handle of the directory
|
25
|
+
BYTE buffer[WDM_BUFFER_SIZE]; // Buffer for the results
|
26
|
+
OVERLAPPED event_container; // Async IO event container
|
27
|
+
struct WDM_Entry* next; // Well, this is a linked list, so this is self-explanatory :)
|
28
|
+
} WDM_Entry, *WDM_PEntry;
|
29
|
+
|
30
|
+
// ---------------------------------------------------------
|
31
|
+
// Prototypes
|
32
|
+
// ---------------------------------------------------------
|
33
|
+
|
34
|
+
WDM_PEntryUserData wdm_entry_user_data_new();
|
35
|
+
void wdm_entry_user_data_free(WDM_PEntryUserData);
|
36
|
+
|
37
|
+
WDM_PEntry wdm_entry_new();
|
38
|
+
void wdm_entry_free(WDM_PEntry);
|
39
|
+
void wdm_entry_list_free(WDM_PEntry);
|
40
|
+
|
41
|
+
// ---------------------------------------------------------
|
42
|
+
|
43
|
+
#ifdef __cplusplus
|
44
|
+
}
|
45
|
+
#endif // __cplusplus
|
46
|
+
|
47
47
|
#endif // WDM_ENTRY_H
|
data/ext/wdm/extconf.rb
CHANGED
@@ -1,27 +1,28 @@
|
|
1
|
-
require 'mkmf'
|
2
|
-
require 'rbconfig'
|
3
|
-
|
4
|
-
def generate_makefile
|
5
|
-
create_makefile("wdm_ext")
|
6
|
-
end
|
7
|
-
|
8
|
-
def generate_dummy_makefile
|
9
|
-
File.open("Makefile", "w") do |f|
|
10
|
-
f.puts dummy_makefile('wdm_ext').join
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def windows?
|
15
|
-
RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
|
16
|
-
end
|
17
|
-
|
18
|
-
if windows? and
|
19
|
-
have_library("kernel32") and
|
20
|
-
have_header("windows.h") and
|
21
|
-
have_header("ruby.h") and
|
22
|
-
have_const('HAVE_RUBY_ENCODING_H')
|
23
|
-
then
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
1
|
+
require 'mkmf'
|
2
|
+
require 'rbconfig'
|
3
|
+
|
4
|
+
def generate_makefile
|
5
|
+
create_makefile("wdm_ext")
|
6
|
+
end
|
7
|
+
|
8
|
+
def generate_dummy_makefile
|
9
|
+
File.open("Makefile", "w") do |f|
|
10
|
+
f.puts dummy_makefile('wdm_ext').join
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def windows?
|
15
|
+
RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
|
16
|
+
end
|
17
|
+
|
18
|
+
if windows? and
|
19
|
+
have_library("kernel32") and
|
20
|
+
have_header("windows.h") and
|
21
|
+
have_header("ruby.h") and
|
22
|
+
have_const('HAVE_RUBY_ENCODING_H')
|
23
|
+
then
|
24
|
+
have_func('rb_thread_call_without_gvl')
|
25
|
+
generate_makefile()
|
26
|
+
else
|
27
|
+
generate_dummy_makefile()
|
28
|
+
end
|
data/ext/wdm/memory.c
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
-
#include "wdm.h"
|
2
|
-
|
3
|
-
#include "memory.h"
|
4
|
-
|
5
|
-
void*
|
6
|
-
wdm_memory_malloc (size_t size)
|
7
|
-
{
|
8
|
-
void *memory = malloc(size);
|
9
|
-
|
10
|
-
if ( memory == NULL ) {
|
11
|
-
rb_fatal("failed to allocate memory");
|
12
|
-
}
|
13
|
-
|
14
|
-
return memory;
|
15
|
-
}
|
16
|
-
|
17
|
-
void*
|
18
|
-
wdm_memory_realloc (void *ptr, size_t size)
|
19
|
-
{
|
20
|
-
void *memory = realloc(ptr, size);
|
21
|
-
|
22
|
-
if ( memory == NULL ) {
|
23
|
-
rb_fatal("failed to re-allocate memory");
|
24
|
-
}
|
25
|
-
|
26
|
-
return memory;
|
1
|
+
#include "wdm.h"
|
2
|
+
|
3
|
+
#include "memory.h"
|
4
|
+
|
5
|
+
void*
|
6
|
+
wdm_memory_malloc (size_t size)
|
7
|
+
{
|
8
|
+
void *memory = malloc(size);
|
9
|
+
|
10
|
+
if ( memory == NULL ) {
|
11
|
+
rb_fatal("failed to allocate memory");
|
12
|
+
}
|
13
|
+
|
14
|
+
return memory;
|
15
|
+
}
|
16
|
+
|
17
|
+
void*
|
18
|
+
wdm_memory_realloc (void *ptr, size_t size)
|
19
|
+
{
|
20
|
+
void *memory = realloc(ptr, size);
|
21
|
+
|
22
|
+
if ( memory == NULL ) {
|
23
|
+
rb_fatal("failed to re-allocate memory");
|
24
|
+
}
|
25
|
+
|
26
|
+
return memory;
|
27
27
|
}
|
data/ext/wdm/memory.h
CHANGED
@@ -1,30 +1,30 @@
|
|
1
|
-
#ifndef WDM_MEMORY_H
|
2
|
-
#define WDM_MEMORY_H
|
3
|
-
|
4
|
-
#ifdef __cplusplus
|
5
|
-
extern "C" {
|
6
|
-
#endif // __cplusplus
|
7
|
-
|
8
|
-
// ---------------------------------------------------------
|
9
|
-
// Prototypes
|
10
|
-
// ---------------------------------------------------------
|
11
|
-
|
12
|
-
void* wdm_memory_malloc (size_t);
|
13
|
-
|
14
|
-
void* wdm_memory_realloc (void*, size_t);
|
15
|
-
|
16
|
-
// ---------------------------------------------------------
|
17
|
-
// Macros
|
18
|
-
// ---------------------------------------------------------
|
19
|
-
|
20
|
-
#define WDM_ALLOC_N(type,n) ((type*)wdm_memory_malloc((n) * sizeof(type)))
|
21
|
-
#define WDM_ALLOC(type) ((type*)wdm_memory_malloc(sizeof(type)))
|
22
|
-
#define WDM_REALLOC_N(var,type,n) ((var)=(type*)wdm_memory_realloc((void*)(var), (n) * sizeof(type)))
|
23
|
-
|
24
|
-
// ---------------------------------------------------------
|
25
|
-
|
26
|
-
#ifdef __cplusplus
|
27
|
-
}
|
28
|
-
#endif // __cplusplus
|
29
|
-
|
1
|
+
#ifndef WDM_MEMORY_H
|
2
|
+
#define WDM_MEMORY_H
|
3
|
+
|
4
|
+
#ifdef __cplusplus
|
5
|
+
extern "C" {
|
6
|
+
#endif // __cplusplus
|
7
|
+
|
8
|
+
// ---------------------------------------------------------
|
9
|
+
// Prototypes
|
10
|
+
// ---------------------------------------------------------
|
11
|
+
|
12
|
+
void* wdm_memory_malloc (size_t);
|
13
|
+
|
14
|
+
void* wdm_memory_realloc (void*, size_t);
|
15
|
+
|
16
|
+
// ---------------------------------------------------------
|
17
|
+
// Macros
|
18
|
+
// ---------------------------------------------------------
|
19
|
+
|
20
|
+
#define WDM_ALLOC_N(type,n) ((type*)wdm_memory_malloc((n) * sizeof(type)))
|
21
|
+
#define WDM_ALLOC(type) ((type*)wdm_memory_malloc(sizeof(type)))
|
22
|
+
#define WDM_REALLOC_N(var,type,n) ((var)=(type*)wdm_memory_realloc((void*)(var), (n) * sizeof(type)))
|
23
|
+
|
24
|
+
// ---------------------------------------------------------
|
25
|
+
|
26
|
+
#ifdef __cplusplus
|
27
|
+
}
|
28
|
+
#endif // __cplusplus
|
29
|
+
|
30
30
|
#endif // WDM_MEMORY_H
|
data/ext/wdm/monitor.c
CHANGED
@@ -1,75 +1,75 @@
|
|
1
|
-
#include "wdm.h"
|
2
|
-
|
3
|
-
#include "memory.h"
|
4
|
-
#include "entry.h"
|
5
|
-
#include "queue.h"
|
6
|
-
|
7
|
-
#include "monitor.h"
|
8
|
-
|
9
|
-
WDM_PMonitor
|
10
|
-
wdm_monitor_new()
|
11
|
-
{
|
12
|
-
WDM_PMonitor monitor;
|
13
|
-
|
14
|
-
monitor = WDM_ALLOC(WDM_Monitor);
|
15
|
-
|
16
|
-
monitor->running = FALSE;
|
17
|
-
|
18
|
-
monitor->head = NULL;
|
19
|
-
monitor->monitoring_thread = INVALID_HANDLE_VALUE;
|
20
|
-
|
21
|
-
monitor->changes = wdm_queue_new();
|
22
|
-
|
23
|
-
monitor->process_event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
24
|
-
monitor->stop_event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
25
|
-
|
26
|
-
if ( ! InitializeCriticalSectionAndSpinCount(&monitor->lock,
|
27
|
-
0x00000400) ) // TODO: look into the best value for spinning.
|
28
|
-
{
|
29
|
-
rb_raise(eWDM_Error, "Can't create a lock for the monitor");
|
30
|
-
}
|
31
|
-
|
32
|
-
return monitor;
|
33
|
-
}
|
34
|
-
|
35
|
-
void
|
36
|
-
wdm_monitor_free(WDM_PMonitor monitor)
|
37
|
-
{
|
38
|
-
if ( monitor->monitoring_thread != INVALID_HANDLE_VALUE ) CloseHandle(monitor->monitoring_thread);
|
39
|
-
|
40
|
-
wdm_entry_list_free(monitor->head);
|
41
|
-
wdm_queue_free(monitor->changes);
|
42
|
-
DeleteCriticalSection(&monitor->lock);
|
43
|
-
CloseHandle(monitor->process_event); // TODO: Look into why this crashes the app when exiting!
|
44
|
-
CloseHandle(monitor->stop_event);
|
45
|
-
|
46
|
-
free(monitor);
|
47
|
-
}
|
48
|
-
|
49
|
-
void
|
50
|
-
wdm_monitor_update_head(WDM_PMonitor monitor, WDM_PEntry new_head)
|
51
|
-
{
|
52
|
-
EnterCriticalSection(&monitor->lock);
|
53
|
-
new_head->next = monitor->head;
|
54
|
-
monitor->head = new_head;
|
55
|
-
LeaveCriticalSection(&monitor->lock);
|
56
|
-
}
|
57
|
-
|
58
|
-
WDM_PMonitorCallbackParam
|
59
|
-
wdm_monitor_callback_param_new(WDM_PMonitor monitor, WDM_PEntry entry)
|
60
|
-
{
|
61
|
-
WDM_PMonitorCallbackParam param;
|
62
|
-
|
63
|
-
param = WDM_ALLOC(WDM_MonitorCallbackParam);
|
64
|
-
|
65
|
-
param->monitor = monitor;
|
66
|
-
param->entry = entry;
|
67
|
-
|
68
|
-
return param;
|
69
|
-
}
|
70
|
-
|
71
|
-
void
|
72
|
-
wdm_monitor_callback_param_free(WDM_PMonitorCallbackParam param)
|
73
|
-
{
|
74
|
-
free(param);
|
1
|
+
#include "wdm.h"
|
2
|
+
|
3
|
+
#include "memory.h"
|
4
|
+
#include "entry.h"
|
5
|
+
#include "queue.h"
|
6
|
+
|
7
|
+
#include "monitor.h"
|
8
|
+
|
9
|
+
WDM_PMonitor
|
10
|
+
wdm_monitor_new()
|
11
|
+
{
|
12
|
+
WDM_PMonitor monitor;
|
13
|
+
|
14
|
+
monitor = WDM_ALLOC(WDM_Monitor);
|
15
|
+
|
16
|
+
monitor->running = FALSE;
|
17
|
+
|
18
|
+
monitor->head = NULL;
|
19
|
+
monitor->monitoring_thread = INVALID_HANDLE_VALUE;
|
20
|
+
|
21
|
+
monitor->changes = wdm_queue_new();
|
22
|
+
|
23
|
+
monitor->process_event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
24
|
+
monitor->stop_event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
25
|
+
|
26
|
+
if ( ! InitializeCriticalSectionAndSpinCount(&monitor->lock,
|
27
|
+
0x00000400) ) // TODO: look into the best value for spinning.
|
28
|
+
{
|
29
|
+
rb_raise(eWDM_Error, "Can't create a lock for the monitor");
|
30
|
+
}
|
31
|
+
|
32
|
+
return monitor;
|
33
|
+
}
|
34
|
+
|
35
|
+
void
|
36
|
+
wdm_monitor_free(WDM_PMonitor monitor)
|
37
|
+
{
|
38
|
+
if ( monitor->monitoring_thread != INVALID_HANDLE_VALUE ) CloseHandle(monitor->monitoring_thread);
|
39
|
+
|
40
|
+
wdm_entry_list_free(monitor->head);
|
41
|
+
wdm_queue_free(monitor->changes);
|
42
|
+
DeleteCriticalSection(&monitor->lock);
|
43
|
+
CloseHandle(monitor->process_event); // TODO: Look into why this crashes the app when exiting!
|
44
|
+
CloseHandle(monitor->stop_event);
|
45
|
+
|
46
|
+
free(monitor);
|
47
|
+
}
|
48
|
+
|
49
|
+
void
|
50
|
+
wdm_monitor_update_head(WDM_PMonitor monitor, WDM_PEntry new_head)
|
51
|
+
{
|
52
|
+
EnterCriticalSection(&monitor->lock);
|
53
|
+
new_head->next = monitor->head;
|
54
|
+
monitor->head = new_head;
|
55
|
+
LeaveCriticalSection(&monitor->lock);
|
56
|
+
}
|
57
|
+
|
58
|
+
WDM_PMonitorCallbackParam
|
59
|
+
wdm_monitor_callback_param_new(WDM_PMonitor monitor, WDM_PEntry entry)
|
60
|
+
{
|
61
|
+
WDM_PMonitorCallbackParam param;
|
62
|
+
|
63
|
+
param = WDM_ALLOC(WDM_MonitorCallbackParam);
|
64
|
+
|
65
|
+
param->monitor = monitor;
|
66
|
+
param->entry = entry;
|
67
|
+
|
68
|
+
return param;
|
69
|
+
}
|
70
|
+
|
71
|
+
void
|
72
|
+
wdm_monitor_callback_param_free(WDM_PMonitorCallbackParam param)
|
73
|
+
{
|
74
|
+
free(param);
|
75
75
|
}
|