Commit 682bbe397215a99c4b9ad2faa75082b4abd93f6f

Authored by Hu Chunming
1 parent 450989b5

修正任务自然退出死锁的问题

FFNvDecoder/FFNvDecoder.cpp
... ... @@ -257,8 +257,6 @@ void FFNvDecoder::decode_thread()
257 257  
258 258 m_bRunning = false;
259 259  
260   - decode_finished_cbk(m_userPtr);
261   -
262 260 // long end_time = get_cur_time();
263 261  
264 262 // cout << "解码用时:" << end_time - start_time << endl;
... ... @@ -268,6 +266,8 @@ void FFNvDecoder::decode_thread()
268 266 pthread_join(m_post_decode_thread,0);
269 267 }
270 268  
  269 + decode_finished_cbk(m_userPtr);
  270 +
271 271 decode_finished();
272 272  
273 273 cout << "decode thread exited." << endl;
... ... @@ -291,7 +291,7 @@ void FFNvDecoder::decode_finished()
291 291  
292 292 void FFNvDecoder::post_decode_thread()
293 293 {
294   - while (m_bRunning)
  294 + while (m_bRunning || mFrameQueue.length() > 0)
295 295 {
296 296 AVFrame * gpuFrame = mFrameQueue.getHead();
297 297 if (gpuFrame == nullptr)
... ... @@ -369,4 +369,8 @@ void FFNvDecoder::resume()
369 369 void FFNvDecoder::setDecKeyframe(bool bKeyframe)
370 370 {
371 371 m_dec_keyframe = bKeyframe;
  372 +}
  373 +
  374 +int FFNvDecoder::getCachedQueueLength(){
  375 + return mFrameQueue.length();
372 376 }
373 377 \ No newline at end of file
... ...
FFNvDecoder/FFNvDecoder.h
... ... @@ -62,6 +62,8 @@ public:
62 62  
63 63 bool isSurport(FFDecConfig& cfg);
64 64  
  65 + int getCachedQueueLength();
  66 +
65 67 public:
66 68 AVPixelFormat getHwPixFmt();
67 69  
... ...
FFNvDecoder/FFNvDecoderManager.cpp
... ... @@ -339,4 +339,21 @@ vector&lt;string&gt; FFNvDecoderManager::getAllDecodeName(){
339 339 decode_names.push_back(it->first);
340 340 }
341 341 return decode_names;
  342 +}
  343 +
  344 +int FFNvDecoderManager::getCachedQueueLength(const string name){
  345 + if (name.empty()){
  346 + cout << "name 为空!"<< endl;
  347 + return -1;
  348 + }
  349 +
  350 + std::lock_guard<std::mutex> l(m_mutex);
  351 +
  352 + auto dec = decoderMap.find(name);
  353 + if (dec != decoderMap.end()){
  354 + return dec->second->getCachedQueueLength();
  355 + }
  356 +
  357 + cout << "没有找到name为" << name << "的解码器!" << endl;
  358 + return -1;
342 359 }
343 360 \ No newline at end of file
... ...
FFNvDecoder/FFNvDecoderManager.h
... ... @@ -213,6 +213,15 @@ public:
213 213 **************************************************/
214 214 vector<string> getAllDecodeName();
215 215  
  216 + /**************************************************
  217 + * 接口:getCachedQueueLength
  218 + * 功能:获取解码缓冲队列当前长度
  219 + * 参数:const string name 解码器名称
  220 + * 返回:int 解码缓冲队列当前长度
  221 + * 备注:
  222 + **************************************************/
  223 + int getCachedQueueLength(const string name);
  224 +
216 225 private:
217 226 FFNvDecoderManager(){}
218 227  
... ...
tsl_aiplatform/ai_platform/MultiSourceProcess.cpp
... ... @@ -50,6 +50,7 @@ void decode_finished_cbk(const void * userPtr){
50 50  
51 51 CMultiSourceProcess::CMultiSourceProcess(){
52 52 m_bfinish = false;
  53 + m_bProcessEnd = false;
53 54 }
54 55  
55 56 CMultiSourceProcess::~CMultiSourceProcess(){
... ... @@ -393,11 +394,43 @@ void CMultiSourceProcess::post_decode_thread(decode_cbk_userdata* userPtr, AVFra
393 394  
394 395 // 解码线程退出的最后回调的实际任务函数
395 396 void CMultiSourceProcess::decode_finished_thread(task_param t_param){
396   - // 任务结束,关闭跟踪
397   - if (!FinishTaskTracker(VPT_Handle_, t_param.task_id))
398   - LOG_ERROR("Finish VPT Tracker failed, task_id: {}", t_param.task_id);
399 397  
400   - finish_task(t_param.task_id,false);
  398 + FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
  399 +
  400 + while(true){
  401 +
  402 + if(m_bfinish){
  403 + break;
  404 + }
  405 +
  406 + std::this_thread::sleep_for(std::chrono::milliseconds(5));
  407 +
  408 + std::lock_guard<std::mutex> l(m_QueueMtx);
  409 +
  410 + // 确保 m_RgbDataList 中没有任务数据
  411 + for (auto iter = m_RgbDataList.begin(); iter!=m_RgbDataList.end(); ++ iter){
  412 + GpuRgbMemory* gpuMem = *iter;
  413 + if(gpuMem->getId() == t_param.task_id){
  414 + continue;
  415 + }
  416 + }
  417 +
  418 + // 确保 对应解码器中没有缓存的数据
  419 + if (pDecManager->getCachedQueueLength(t_param.task_id) > 0){
  420 + continue;
  421 + }
  422 +
  423 + // 确保对应任务没有正在执行算法的数据
  424 + if (m_bProcessEnd){
  425 + // 任务结束,关闭跟踪
  426 + if (!FinishTaskTracker(VPT_Handle_, t_param.task_id))
  427 + LOG_ERROR("Finish VPT Tracker failed, task_id: {}", t_param.task_id);
  428 +
  429 + finish_task(t_param.task_id,false);
  430 +
  431 + break;
  432 + }
  433 + }
401 434 }
402 435  
403 436 bool CMultiSourceProcess::task_has_vpt_algor(const std::string &task_id){
... ... @@ -446,6 +479,7 @@ void CMultiSourceProcess::algorthim_process_thread(){
446 479  
447 480 int sum = 0;
448 481 while(true){
  482 + m_bProcessEnd = true;
449 483 /* step1. 授权check */
450 484 if (licence_status_ <= -3) {
451 485 LOG_FATAL("authority failed!");
... ... @@ -458,6 +492,7 @@ void CMultiSourceProcess::algorthim_process_thread(){
458 492  
459 493 /* step5. 凑齐的解码数据 拼batch */
460 494 m_QueueMtx.lock();
  495 + m_bProcessEnd = false;
461 496  
462 497 vector<GpuRgbMemory*> vec_gpuMem;
463 498 for (auto iter = m_RgbDataList.begin(); iter!=m_RgbDataList.end(); ++ iter){
... ... @@ -529,6 +564,7 @@ void CMultiSourceProcess::algorthim_process_thread(){
529 564 }
530 565 #endif
531 566  
  567 + m_bProcessEnd = true;
532 568 cout << "algorthim_process_thread end. " << endl;
533 569 }
534 570  
... ...
tsl_aiplatform/ai_platform/MultiSourceProcess.h
... ... @@ -192,6 +192,7 @@ private:
192 192 list<GpuRgbMemory*> m_RgbDataList;
193 193 std::mutex m_QueueMtx;
194 194 bool m_bfinish;
  195 + bool m_bProcessEnd;
195 196  
196 197 pthread_t m_authority_check_thread;
197 198  
... ... @@ -222,7 +223,6 @@ private:
222 223 face_det_ai_engine m_face_det_ai_engine; // 人脸检测
223 224 #endif
224 225  
225   -private:
226 226 base_reprocessing_unit *m_save_snapshot_reprocessing{nullptr};
227 227  
228 228 };
... ...