From ff6881efbff0b023db730637199affb40b7d7972 Mon Sep 17 00:00:00 2001 From: rajithr Date: Tue, 26 May 2015 11:31:31 +0530 Subject: [PATCH 1/3] Fix for a potential data race condition --- modules/objdetect/src/detection_based_tracker.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/objdetect/src/detection_based_tracker.cpp b/modules/objdetect/src/detection_based_tracker.cpp index f08bbd1dd5..1f0fb5a5d5 100644 --- a/modules/objdetect/src/detection_based_tracker.cpp +++ b/modules/objdetect/src/detection_based_tracker.cpp @@ -284,7 +284,9 @@ void* cv::workcycleObjectDetectorFunction(void* p) { CATCH_ALL_AND_LOG({ ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->workcycleObjectDetector(); }); try{ + ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->lock(); ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->stateThread = cv::DetectionBasedTracker::SeparateDetectionWork::STATE_THREAD_STOPPED; + ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->unlock(); } catch(...) { LOGE0("DetectionBasedTracker: workcycleObjectDetectorFunction: ERROR concerning pointer, received as the function parameter"); } From 993e0b0bf9feaf87532186f8ff800b07e4ec3815 Mon Sep 17 00:00:00 2001 From: rajithr Date: Wed, 27 May 2015 15:00:21 +0530 Subject: [PATCH 2/3] Fix for a potential data race condition --- .../objdetect/src/detection_based_tracker.cpp | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/modules/objdetect/src/detection_based_tracker.cpp b/modules/objdetect/src/detection_based_tracker.cpp index 1f0fb5a5d5..5f1c53c500 100644 --- a/modules/objdetect/src/detection_based_tracker.cpp +++ b/modules/objdetect/src/detection_based_tracker.cpp @@ -286,6 +286,13 @@ void* cv::workcycleObjectDetectorFunction(void* p) try{ ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->lock(); ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->stateThread = cv::DetectionBasedTracker::SeparateDetectionWork::STATE_THREAD_STOPPED; + ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->isObjectDetectingReady=false; + ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->shouldObjectDetectingResultsBeForgot=false; +#ifdef USE_STD_THREADS + objectDetectorThreadStartStop.notify_one(); +#else + pthread_cond_signal(&objectDetectorThreadStartStop); +#endif ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->unlock(); } catch(...) { LOGE0("DetectionBasedTracker: workcycleObjectDetectorFunction: ERROR concerning pointer, received as the function parameter"); @@ -439,25 +446,6 @@ void cv::DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() objects.clear(); }// while(isWorking()) -#ifdef USE_STD_THREADS - mtx_lock.lock(); -#else - pthread_mutex_lock(&mutex); -#endif - - stateThread=STATE_THREAD_STOPPED; - - isObjectDetectingReady=false; - shouldObjectDetectingResultsBeForgot=false; - -#ifdef USE_STD_THREADS - objectDetectorThreadStartStop.notify_one(); - mtx_lock.unlock(); -#else - pthread_cond_signal(&objectDetectorThreadStartStop); - pthread_mutex_unlock(&mutex); -#endif - LOGI("DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector: Returning"); } From 7658c2e2d5a3b15fb4d87ef85c00b84edc5ef175 Mon Sep 17 00:00:00 2001 From: rajithr Date: Wed, 27 May 2015 15:12:04 +0530 Subject: [PATCH 3/3] Fix for a potential data race condition code changes to handle the failed build --- modules/objdetect/src/detection_based_tracker.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/objdetect/src/detection_based_tracker.cpp b/modules/objdetect/src/detection_based_tracker.cpp index 5f1c53c500..040784bc23 100644 --- a/modules/objdetect/src/detection_based_tracker.cpp +++ b/modules/objdetect/src/detection_based_tracker.cpp @@ -289,9 +289,9 @@ void* cv::workcycleObjectDetectorFunction(void* p) ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->isObjectDetectingReady=false; ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->shouldObjectDetectingResultsBeForgot=false; #ifdef USE_STD_THREADS - objectDetectorThreadStartStop.notify_one(); + ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->objectDetectorThreadStartStop.notify_one(); #else - pthread_cond_signal(&objectDetectorThreadStartStop); + pthread_cond_signal(&(((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->objectDetectorThreadStartStop)); #endif ((cv::DetectionBasedTracker::SeparateDetectionWork*)p)->unlock(); } catch(...) {