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 | 
             
            }
         |