@@ -18,7 +18,9 @@ NSFW::NSFW(uint32_t debounceMS, std::string path, Callback *eventCallback, Callb
18
18
mInterface(NULL ),
19
19
mInterfaceLockValid(false ),
20
20
mPath(path),
21
- mRunning(false ) {
21
+ mRunning(false ),
22
+ mQueue(std::make_shared<EventQueue>())
23
+ {
22
24
HandleScope scope;
23
25
v8::Local<v8::Object> obj = New<v8::Object>();
24
26
mPersistentHandle .Reset (obj);
@@ -37,11 +39,6 @@ NSFW::~NSFW() {
37
39
}
38
40
}
39
41
40
- void NSFW::cleanupEventCallback (void *arg) {
41
- EventBaton *baton = (EventBaton *)arg;
42
- delete baton;
43
- }
44
-
45
42
void NSFW::fireErrorCallback (uv_async_t *handle) {
46
43
Nan::HandleScope scope;
47
44
ErrorBaton *baton = (ErrorBaton *)handle->data ;
@@ -54,33 +51,27 @@ void NSFW::fireErrorCallback(uv_async_t *handle) {
54
51
55
52
void NSFW::fireEventCallback (uv_async_t *handle) {
56
53
Nan::HandleScope scope;
57
- EventBaton *baton = (EventBaton *)handle->data ;
58
- if (baton->events ->empty ()) {
59
- uv_thread_t cleanup;
60
- uv_thread_create (&cleanup, NSFW::cleanupEventCallback, baton);
61
-
62
- #if defined(__APPLE_CC__) || defined(__linux__) || defined(__FreeBSD__)
63
- pthread_detach (cleanup);
64
- #endif
65
-
54
+ NSFW *nsfw = (NSFW *)handle->data ;
55
+ auto events = nsfw->mQueue ->dequeueAll ();
56
+ if (events == nullptr ) {
66
57
return ;
67
58
}
68
59
69
- v8::Local<v8::Array> eventArray = New<v8::Array>((int )baton-> events ->size ());
60
+ v8::Local<v8::Array> eventArray = New<v8::Array>((int )events->size ());
70
61
71
- for (unsigned int i = 0 ; i < baton-> events ->size (); ++i) {
62
+ for (unsigned int i = 0 ; i < events->size (); ++i) {
72
63
v8::Local<v8::Object> jsEvent = New<v8::Object>();
73
64
74
65
75
- jsEvent->Set (New<v8::String>(" action" ).ToLocalChecked (), New<v8::Number>((*baton-> events )[i]->type ));
76
- jsEvent->Set (New<v8::String>(" directory" ).ToLocalChecked (), New<v8::String>((*baton-> events )[i]->fromDirectory ).ToLocalChecked ());
66
+ jsEvent->Set (New<v8::String>(" action" ).ToLocalChecked (), New<v8::Number>((*events)[i]->type ));
67
+ jsEvent->Set (New<v8::String>(" directory" ).ToLocalChecked (), New<v8::String>((*events)[i]->fromDirectory ).ToLocalChecked ());
77
68
78
- if ((*baton-> events )[i]->type == RENAMED) {
79
- jsEvent->Set (New<v8::String>(" oldFile" ).ToLocalChecked (), New<v8::String>((*baton-> events )[i]->fromFile ).ToLocalChecked ());
80
- jsEvent->Set (New<v8::String>(" newDirectory" ).ToLocalChecked (), New<v8::String>((*baton-> events )[i]->toDirectory ).ToLocalChecked ());
81
- jsEvent->Set (New<v8::String>(" newFile" ).ToLocalChecked (), New<v8::String>((*baton-> events )[i]->toFile ).ToLocalChecked ());
69
+ if ((*events)[i]->type == RENAMED) {
70
+ jsEvent->Set (New<v8::String>(" oldFile" ).ToLocalChecked (), New<v8::String>((*events)[i]->fromFile ).ToLocalChecked ());
71
+ jsEvent->Set (New<v8::String>(" newDirectory" ).ToLocalChecked (), New<v8::String>((*events)[i]->toDirectory ).ToLocalChecked ());
72
+ jsEvent->Set (New<v8::String>(" newFile" ).ToLocalChecked (), New<v8::String>((*events)[i]->toFile ).ToLocalChecked ());
82
73
} else {
83
- jsEvent->Set (New<v8::String>(" file" ).ToLocalChecked (), New<v8::String>((*baton-> events )[i]->fromFile ).ToLocalChecked ());
74
+ jsEvent->Set (New<v8::String>(" file" ).ToLocalChecked (), New<v8::String>((*events)[i]->fromFile ).ToLocalChecked ());
84
75
}
85
76
86
77
eventArray->Set (i, jsEvent);
@@ -90,14 +81,7 @@ void NSFW::fireEventCallback(uv_async_t *handle) {
90
81
eventArray
91
82
};
92
83
93
- baton->nsfw ->mEventCallback ->Call (1 , argv);
94
-
95
- uv_thread_t cleanup;
96
- uv_thread_create (&cleanup, NSFW::cleanupEventCallback, baton);
97
-
98
- #if defined(__APPLE_CC__) || defined(__linux__) || defined(__FreeBSD__)
99
- pthread_detach (cleanup);
100
- #endif
84
+ nsfw->mEventCallback ->Call (1 , argv);
101
85
}
102
86
103
87
void NSFW::pollForEvents (void *arg) {
@@ -116,18 +100,14 @@ void NSFW::pollForEvents(void *arg) {
116
100
uv_mutex_unlock (&nsfw->mInterfaceLock );
117
101
break ;
118
102
}
119
- auto events = nsfw-> mInterface -> getEvents ();
120
- if (events == NULL ) {
103
+
104
+ if (nsfw-> mQueue -> count () == 0 ) {
121
105
uv_mutex_unlock (&nsfw->mInterfaceLock );
122
106
sleep_for_ms (50 );
123
107
continue ;
124
108
}
125
109
126
- EventBaton *baton = new EventBaton;
127
- baton->nsfw = nsfw;
128
- baton->events = std::move (events);
129
-
130
- nsfw->mEventCallbackAsync .data = (void *)baton;
110
+ nsfw->mEventCallbackAsync .data = (void *)nsfw;
131
111
uv_async_send (&nsfw->mEventCallbackAsync );
132
112
133
113
uv_mutex_unlock (&nsfw->mInterfaceLock );
@@ -230,7 +210,8 @@ void NSFW::StartWorker::Execute() {
230
210
return ;
231
211
}
232
212
233
- mNSFW ->mInterface = new NativeInterface (mNSFW ->mPath );
213
+ mNSFW ->mQueue ->clear ();
214
+ mNSFW ->mInterface = new NativeInterface (mNSFW ->mPath , mNSFW ->mQueue );
234
215
if (mNSFW ->mInterface ->isWatching ()) {
235
216
mNSFW ->mRunning = true ;
236
217
uv_thread_create (&mNSFW ->mPollThread , NSFW::pollForEvents, mNSFW );
@@ -306,6 +287,7 @@ void NSFW::StopWorker::Execute() {
306
287
uv_mutex_lock (&mNSFW ->mInterfaceLock );
307
288
delete mNSFW ->mInterface ;
308
289
mNSFW ->mInterface = NULL ;
290
+ mNSFW ->mQueue ->clear ();
309
291
310
292
uv_mutex_unlock (&mNSFW ->mInterfaceLock );
311
293
}
0 commit comments