@@ -34,6 +34,7 @@ ofEvent<ofHttpResponse> & ofURLResponseEvent() {
34
34
}
35
35
36
36
#if !defined(TARGET_IMPLEMENTS_URL_LOADER)
37
+ std::mutex responseMutex;
37
38
class ofURLFileLoaderImpl : public ofThread , public ofBaseURLFileLoader {
38
39
public:
39
40
ofURLFileLoaderImpl ();
@@ -261,37 +262,41 @@ void ofURLFileLoaderImpl::threadedFunction() {
261
262
262
263
namespace {
263
264
size_t saveToFile_cb (void * buffer, size_t size, size_t nmemb, void * userdata) {
265
+ std::lock_guard<std::mutex> lock (responseMutex);
264
266
auto saveTo = (ofFile *)userdata;
265
267
saveTo->write ((const char *)buffer, size * nmemb);
266
268
return size * nmemb;
267
269
}
268
270
269
271
size_t saveToMemory_cb (void * buffer, size_t size, size_t nmemb, void * userdata) {
272
+ std::lock_guard<std::mutex> lock (responseMutex);
270
273
auto response = (ofHttpResponse *)userdata;
271
274
response->data .append ((const char *)buffer, size * nmemb);
272
275
return size * nmemb;
273
276
}
274
277
275
278
size_t readBody_cb (void * ptr, size_t size, size_t nmemb, void * userdata) {
279
+ std::lock_guard<std::mutex> lock (responseMutex);
276
280
auto body = (std::string *)userdata;
277
-
278
281
if (size * nmemb < 1 ) {
279
282
return 0 ;
280
283
}
281
-
282
284
if (!body->empty ()) {
283
285
auto sent = std::min (size * nmemb, body->size ());
284
286
memcpy (ptr, body->c_str (), sent);
285
287
*body = body->substr (sent);
286
288
return sent;
287
289
}
288
-
289
290
return 0 ; /* no more data left to deliver */
290
291
}
291
292
}
292
293
293
294
ofHttpResponse ofURLFileLoaderImpl::handleRequest (const ofHttpRequest & request) {
294
295
std::unique_ptr<CURL, void (*)(CURL *)> curl = std::unique_ptr<CURL, void (*)(CURL *)>(curl_easy_init (), curl_easy_cleanup);
296
+ if (!curl) {
297
+ ofLogError (" ofURLFileLoader" ) << " curl_easy_init() failed!" ;
298
+ return ofHttpResponse (request, -1 , " CURL initialization failed" );
299
+ }
295
300
curl_slist * headers = nullptr ;
296
301
curl_version_info_data *version = curl_version_info ( CURLVERSION_NOW );
297
302
if (request.verbose ) {
@@ -427,7 +432,12 @@ void ofURLFileLoaderImpl::update(ofEventArgs & args) {
427
432
ofHttpResponse response;
428
433
while (responses.tryReceive (response)) {
429
434
try {
430
- response.request .done (response);
435
+ std::lock_guard<std::mutex> lock (responseMutex);
436
+ if (response.request .done ) {
437
+ response.request .done (response);
438
+ } else {
439
+ ofLogWarning (" ofURLFileLoader" ) << " No callback set for request: " << response.request .url ;
440
+ }
431
441
} catch (...) {
432
442
}
433
443
0 commit comments