@@ -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+
203208typedef 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