Skip to content

Commit f21c216

Browse files
committed
make tld object thread-safe
1 parent ade55f1 commit f21c216

File tree

1 file changed

+55
-20
lines changed

1 file changed

+55
-20
lines changed

serve/tld.c

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,11 @@ typedef struct {
200200
dispatch_semaphore_t semaphore;
201201
} tld_context_t;
202202

203+
typedef struct {
204+
dispatch_semaphore_t semaphore;
205+
ccv_tld_t* tld;
206+
} ccv_thread_safe_tld_t;
207+
203208
typedef struct {
204209
param_parser_t param_parser;
205210
ccv_tld_uri_param_t uri_params;
@@ -337,33 +342,40 @@ int uri_tld_track_object(const void* context, const void* parsed, ebb_buf* buf)
337342
free(parser);
338343
return -1;
339344
}
340-
int tld_id = -1;
345+
ccv_thread_safe_tld_t thread_safe_tld = {
346+
.tld = 0
347+
};
348+
int tld_ident = -1;
341349
dispatch_semaphore_wait(tld_context->semaphore, DISPATCH_TIME_FOREVER);
342350
for (i = 0; i < tld_context->tlds->rnum; i++)
343351
{
344-
ccv_tld_t* tld = *(ccv_tld_t**)ccv_array_get(tld_context->tlds, i);
345-
if (tld == 0)
352+
ccv_thread_safe_tld_t* tld = (ccv_thread_safe_tld_t*)ccv_array_get(tld_context->tlds, i);
353+
if (tld->tld == 0)
346354
{
347-
tld_id = i;
355+
tld_ident = i;
356+
thread_safe_tld = *tld;
348357
break;
349358
}
350359
}
351-
if (tld_id == -1)
360+
if (thread_safe_tld.tld == 0)
352361
{
353-
tld_id = tld_context->tlds->rnum;
354-
ccv_tld_t* tld = (ccv_tld_t*)1; // this is a place holder
355-
ccv_array_push(tld_context->tlds, &tld);
362+
thread_safe_tld.tld = (ccv_tld_t*)1;
363+
thread_safe_tld.semaphore = dispatch_semaphore_create(1);
364+
tld_ident = tld_context->tlds->rnum;
365+
ccv_array_push(tld_context->tlds, &thread_safe_tld);
356366
}
357367
dispatch_semaphore_signal(tld_context->semaphore);
358-
ccv_tld_t* tld = ccv_tld_new(source, parser->uri_params.box, parser->uri_params.params);
368+
dispatch_semaphore_wait(thread_safe_tld.semaphore, DISPATCH_TIME_FOREVER);
369+
thread_safe_tld.tld = ccv_tld_new(source, parser->uri_params.box, parser->uri_params.params);
370+
dispatch_semaphore_signal(thread_safe_tld.semaphore);
359371
ccv_matrix_free(source);
360372
dispatch_semaphore_wait(tld_context->semaphore, DISPATCH_TIME_FOREVER);
361-
*(ccv_tld_t**)ccv_array_get(tld_context->tlds, tld_id) = tld; // set the real tld pointer
373+
*(ccv_thread_safe_tld_t*)ccv_array_get(tld_context->tlds, tld_ident) = thread_safe_tld; // set the real tld pointer
362374
dispatch_semaphore_signal(tld_context->semaphore);
363-
parser->uri_params.tld = tld_id;
375+
parser->uri_params.tld = tld_ident;
364376
// print out box and tld
365377
char cell[128];
366-
snprintf(cell, 128, "{\"tld\":%d,\"box\":{\"x\":%d,\"y\":%d,\"width\":%d,\"height\":%d,\"confidence\":1}}\n", tld_id, parser->uri_params.box.x, parser->uri_params.box.y, parser->uri_params.box.width, parser->uri_params.box.height);
378+
snprintf(cell, 128, "{\"tld\":%d,\"box\":{\"x\":%d,\"y\":%d,\"width\":%d,\"height\":%d,\"confidence\":1}}\n", tld_ident, parser->uri_params.box.x, parser->uri_params.box.y, parser->uri_params.box.width, parser->uri_params.box.height);
367379
size_t len = strlen(cell);
368380
char* data = (char*)malloc(192 + len);;
369381
snprintf(data, 192, ebb_http_header, len);
@@ -390,18 +402,32 @@ int uri_tld_track_object(const void* context, const void* parsed, ebb_buf* buf)
390402
free(parser);
391403
return -1;
392404
}
405+
ccv_thread_safe_tld_t thread_safe_tld = {
406+
.tld = 0,
407+
};
393408
dispatch_semaphore_wait(tld_context->semaphore, DISPATCH_TIME_FOREVER);
394-
ccv_tld_t* tld = parser->uri_params.tld < tld_context->tlds->rnum ? *(ccv_tld_t**)ccv_array_get(tld_context->tlds, parser->uri_params.tld) : 0;
409+
if (parser->uri_params.tld < tld_context->tlds->rnum)
410+
thread_safe_tld = *(ccv_thread_safe_tld_t*)ccv_array_get(tld_context->tlds, parser->uri_params.tld);
395411
dispatch_semaphore_signal(tld_context->semaphore);
396-
if (tld == 0 || tld->frame_signature != previous->sig)
412+
if (thread_safe_tld.tld == 0)
397413
{
398414
ccv_matrix_free(previous);
399415
ccv_matrix_free(source);
400416
free(parser);
401417
return -1;
402418
}
419+
dispatch_semaphore_wait(thread_safe_tld.semaphore, DISPATCH_TIME_FOREVER);
420+
if (thread_safe_tld.tld->frame_signature != previous->sig)
421+
{
422+
dispatch_semaphore_signal(thread_safe_tld.semaphore);
423+
ccv_matrix_free(previous);
424+
ccv_matrix_free(source);
425+
free(parser);
426+
return -1;
427+
}
403428
ccv_tld_info_t info;
404-
ccv_comp_t box = ccv_tld_track_object(tld, previous, source, &info);
429+
ccv_comp_t box = ccv_tld_track_object(thread_safe_tld.tld, previous, source, &info);
430+
dispatch_semaphore_signal(thread_safe_tld.semaphore);
405431
ccv_matrix_free(previous);
406432
ccv_matrix_free(source);
407433
char cell[320];
@@ -461,17 +487,26 @@ int uri_tld_track_object_free(const void* context, const void* parsed, ebb_buf*
461487
free(parser);
462488
return -1;
463489
}
490+
ccv_thread_safe_tld_t thread_safe_tld = {
491+
.tld = 0,
492+
};
464493
dispatch_semaphore_wait(tld_context->semaphore, DISPATCH_TIME_FOREVER);
465-
ccv_tld_t* tld = parser->uri_params.tld < tld_context->tlds->rnum ? *(ccv_tld_t**)ccv_array_get(tld_context->tlds, parser->uri_params.tld) : 0;
466-
if (!tld)
467-
*(ccv_tld_t**)ccv_array_get(tld_context->tlds, parser->uri_params.tld) = 0;
494+
if (parser->uri_params.tld < tld_context->tlds->rnum)
495+
{
496+
thread_safe_tld = *(ccv_thread_safe_tld_t*)ccv_array_get(tld_context->tlds, parser->uri_params.tld);
497+
ccv_thread_safe_tld_t dummy_tld = thread_safe_tld;
498+
dummy_tld.tld = 0;
499+
*(ccv_thread_safe_tld_t*)ccv_array_get(tld_context->tlds, parser->uri_params.tld) = dummy_tld;
500+
}
468501
dispatch_semaphore_signal(tld_context->semaphore);
469-
if (!tld)
502+
if (!thread_safe_tld.tld)
470503
{
471504
free(parser);
472505
return -1;
473506
} else {
474-
ccv_tld_free(tld);
507+
dispatch_semaphore_wait(thread_safe_tld.semaphore, DISPATCH_TIME_FOREVER);
508+
ccv_tld_free(thread_safe_tld.tld);
509+
dispatch_semaphore_signal(thread_safe_tld.semaphore);
475510
buf->data = (void*)ebb_http_ok_true;
476511
buf->len = sizeof(ebb_http_ok_true) - 1;
477512
free(parser);

0 commit comments

Comments
 (0)