Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 7th, 2012  |  syntax: None  |  size: 2.90 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Unable to acquire a mutex held by a ACE_Condition wait
  2. MsgQ::~MsgQ()
  3. {
  4.     _deleteQueue();
  5.  
  6.     delete _mut;_mut=NULL;
  7.     delete  _notFull;_notFull=NULL;
  8.     delete _notEmpty;_notEmpty=NULL;
  9.     delete _PostMutex; _PostMutex = NULL;
  10.     delete _PendMutex; _PendMutex = NULL;
  11.     delete _PostInProgressMutex; _PostInProgressMutex = NULL;
  12.     delete _PendInProgressMutex; _PendInProgressMutex = NULL;
  13.     delete _DisconnectMutex; _DisconnectMutex = NULL;
  14.     free( _ptrQueue ); _ptrQueue = NULL;
  15. }
  16.  
  17. int MsgQ::Post(Message* msg)
  18. {
  19.     _PostMutex->acquire();
  20.     _postInProgress++;
  21.     _PostMutex->release();
  22.  
  23.     if (msg)
  24.     msg->print();
  25.  
  26.     _mut->acquire();
  27.     while (full)
  28.     {
  29.     _notFull->wait();
  30.     }
  31.  
  32.     if (!_disconnectInProgress)
  33.     _queuePush(msg);
  34.     _mut->release();
  35.  
  36.     _PostMutex->acquire();
  37.     _postInProgress--;
  38.     if (_postInProgress==0)
  39.     {
  40.     _PostInProgressMutex->signal();
  41.     }
  42.     _PostMutex->release();
  43.  
  44.     return _notEmpty->signal();
  45. }
  46.  
  47. int MsgQ::Pend(Message*& msg)
  48. {
  49.  
  50.     _PendMutex->acquire();
  51.     _pendInProgress++;
  52.     _PendMutex->release();
  53.  
  54.     _mut->acquire();
  55.     while (empty)
  56.     _notEmpty->wait();
  57.  
  58.     if (!_disconnectInProgress)
  59.     {
  60.     _queuePop(msg);
  61.     }
  62.     _mut->release();
  63.  
  64.     _PendMutex->acquire();
  65.     _pendInProgress--;
  66.     if (_pendInProgress == 0)
  67.     {
  68.     _PendInProgressMutex->signal();
  69.     }
  70.     _PendMutex->release();
  71.  
  72.     return _notFull->signal();
  73. }
  74.  
  75. void MsgQ::_deleteQueue ()
  76. {
  77.     _PostMutex->acquire();
  78.     if (_postInProgress != 0)
  79.     {
  80.     _PostMutex->release();
  81.     TRACE("Acquiring Mutex.");
  82.     _mut->acquire();
  83.     full = 0;
  84.     _notFull->broadcast();
  85.     _mut->release();
  86.     _PostInProgressMutex->wait();
  87.     }
  88.     else
  89.     {
  90.     _PostMutex->release();
  91.     }
  92.  
  93.     _PendMutex->acquire();
  94.     if (_pendInProgress != 0)
  95.     {
  96.     _PendMutex->release();
  97.     TRACE("Acquiring Mutex.");
  98.     _mut->acquire();
  99.     empty = 0;
  100.     _notEmpty->broadcast();
  101.     _mut->release();
  102.     _PendInProgressMutex->wait();
  103.     }
  104.     else
  105.     {
  106.     _PendMutex->release();
  107.     }
  108. }
  109.  
  110. void MsgQ::_initQueue()
  111. {
  112.     _ptrQueue = (Message **)(malloc (size * sizeof (Message*)));
  113.  
  114.     if (_ptrQueue == NULL)
  115.     {
  116.     cout << "queue could not be created!" << endl;
  117.     }
  118.     else
  119.     {
  120.     for (int i = 0; i < size; i++)
  121.         *(_ptrQueue + i) = NULL;
  122.     empty = 1;
  123.     full = 0;
  124.     head = 0;
  125.     tail = 0;
  126.  
  127.         try{
  128.         _mut = new ACE_Mutex() ;
  129.         _notFull = new ACE_Condition<ACE_Mutex>(*_mut);
  130.         _notEmpty = new ACE_Condition<ACE_Mutex>(*_mut);
  131.  
  132.     _PostMutex = new ACE_Mutex();
  133.     _PendMutex = new ACE_Mutex();
  134.     _PostInProgressMutex = new ACE_Condition<ACE_Mutex>(*_PostMutex);
  135.     _PendInProgressMutex = new ACE_Condition<ACE_Mutex>(*_PendMutex);
  136.     _DisconnectMutex = new ACE_Mutex();
  137.  
  138.     _postInProgress = 0;
  139.     _pendInProgress = 0;
  140.     _disconnectInProgress = false;
  141.  
  142.         }catch(...){
  143.             cout << "you should not be here" <<  endl;
  144.         }
  145.     }
  146. }