@@ -78,10 +78,17 @@ class MalignWorker : public AsyncProgressWorker<ProgressData> {
78
78
79
79
protected:
80
80
void Execute (const ExecutionProgress& progress) override {
81
- std::unique_lock<std::mutex> lock (_cvm);
82
- // Testing a nullptr send is acceptable.
83
- progress.Send (nullptr , 0 );
84
- _cv.wait (lock);
81
+ {
82
+ std::unique_lock<std::mutex> lock (_cvm);
83
+ // Testing a nullptr send is acceptable.
84
+ progress.Send (nullptr , 0 );
85
+ _cv.wait (lock, [this ] { return _test_case_count == 1 ; });
86
+ }
87
+ {
88
+ std::unique_lock<std::mutex> lock (_cvm);
89
+ progress.Signal ();
90
+ _cv.wait (lock, [this ] { return _test_case_count == 2 ; });
91
+ }
85
92
// Testing busy looping on send doesn't trigger unexpected empty data
86
93
// OnProgress call.
87
94
for (size_t i = 0 ; i < 1000000 ; i++) {
@@ -92,16 +99,21 @@ class MalignWorker : public AsyncProgressWorker<ProgressData> {
92
99
93
100
void OnProgress (const ProgressData* /* data */ , size_t count) override {
94
101
Napi::Env env = Env ();
95
- _test_case_count++;
102
+ {
103
+ std::lock_guard<std::mutex> lock (_cvm);
104
+ _test_case_count++;
105
+ }
96
106
bool error = false ;
97
107
Napi::String reason = Napi::String::New (env, " No error" );
98
- if (_test_case_count == 1 && count != 0 ) {
108
+ if (_test_case_count <= 2 && count != 0 ) {
99
109
error = true ;
100
- reason = Napi::String::New (env, " expect 0 count of data on 1st call" );
110
+ reason =
111
+ Napi::String::New (env, " expect 0 count of data on 1st and 2nd call" );
101
112
}
102
- if (_test_case_count > 1 && count != 1 ) {
113
+ if (_test_case_count > 2 && count != 1 ) {
103
114
error = true ;
104
- reason = Napi::String::New (env, " expect 1 count of data on non-1st call" );
115
+ reason = Napi::String::New (
116
+ env, " expect 1 count of data on non-1st and non-2nd call" );
105
117
}
106
118
_progress.MakeCallback (Receiver ().Value (),
107
119
{Napi::Boolean::New (env, error), reason});
@@ -122,12 +134,56 @@ class MalignWorker : public AsyncProgressWorker<ProgressData> {
122
134
std::mutex _cvm;
123
135
FunctionReference _progress;
124
136
};
137
+
138
+ // Calling a Signal after a SendProgress should not clear progress data
139
+ class SignalAfterProgressTestWorker : public AsyncProgressWorker <ProgressData> {
140
+ public:
141
+ static void DoWork (const CallbackInfo& info) {
142
+ Function cb = info[0 ].As <Function>();
143
+ Function progress = info[1 ].As <Function>();
144
+
145
+ SignalAfterProgressTestWorker* worker = new SignalAfterProgressTestWorker (
146
+ cb, progress, " TestResource" , Object::New (info.Env ()));
147
+ worker->Queue ();
148
+ }
149
+
150
+ protected:
151
+ void Execute (const ExecutionProgress& progress) override {
152
+ ProgressData data{0 };
153
+ progress.Send (&data, 1 );
154
+ progress.Signal ();
155
+ }
156
+
157
+ void OnProgress (const ProgressData* /* data */ , size_t count) override {
158
+ Napi::Env env = Env ();
159
+ bool error = false ;
160
+ Napi::String reason = Napi::String::New (env, " No error" );
161
+ if (count != 1 ) {
162
+ error = true ;
163
+ reason = Napi::String::New (env, " expect 1 count of data" );
164
+ }
165
+ _progress.MakeCallback (Receiver ().Value (),
166
+ {Napi::Boolean::New (env, error), reason});
167
+ }
168
+
169
+ private:
170
+ SignalAfterProgressTestWorker (Function cb,
171
+ Function progress,
172
+ const char * resource_name,
173
+ const Object& resource)
174
+ : AsyncProgressWorker(cb, resource_name, resource) {
175
+ _progress.Reset (progress, 1 );
176
+ }
177
+ FunctionReference _progress;
178
+ };
125
179
} // namespace
126
180
127
181
Object InitAsyncProgressWorker (Env env) {
128
182
Object exports = Object::New (env);
129
183
exports[" doWork" ] = Function::New (env, TestWorker::DoWork);
130
184
exports[" doMalignTest" ] = Function::New (env, MalignWorker::DoWork);
185
+ exports[" doSignalAfterProgressTest" ] =
186
+ Function::New (env, SignalAfterProgressTestWorker::DoWork);
131
187
return exports;
132
188
}
133
189
0 commit comments