user thread  logic like follow:
TableScannerPtr aScanner = tbSourcelist-
>create_scanner( specbuilder.get(), 5000 );
 while( aScanner->next( gotCell ) )
 {
         .....
 }

dead lock between user thread and scanner thread:

1. user thread TableScanner

    TableScannerAsync::~TableScannerAsync() {
  try {
    cancel();
    wait_for_completion();
  }
  catch (Exception &e) {
    HT_ERROR_OUT << e << HT_END;
  }
  if (m_use_index) {
    delete m_cb;//<=========================dead lock entry
    m_cb = 0;
  }
}
/////////////////////////////////////////
   virtual ~IndexScannerCallback() {
  ScopedLock lock(m_mutex);//<=========  user thread got this
IndexScannerCallback::m_mutex
      if (m_mutator)
        delete m_mutator;

      foreach (TableScannerAsync *s, m_scanners)
        delete s;//dead lock 1<=============user thread wait
TableScannerAsync::m_mutex


2. scanner thread

  void TableScannerAsync::handle_result(int scanner_id, EventPtr
&event, bool is_create) {

  bool cancelled = is_cancelled();
  ScopedLock lock(m_mutex);<============scanner thread got
TableScannerAsync::m_mutex
  ScanCellsPtr cells;

    . . . . . .
  maybe_callback_ok();<================call  m_cb->scan_ok(this,
cells);

}
//////////////////////////////
 class IndexScannerCallback : public ResultCallback {

    virtual void scan_ok(TableScannerAsync *scanner, ScanCellsPtr
&scancells) {
      bool is_eos = scancells->get_eos();
      String table_name = scanner->get_table_name();

      ScopedLock lock(m_mutex);//dead lock 2<============scanner
thread wait IndexScannerCallback::m_mutex

-- 
You received this message because you are subscribed to the Google Groups 
"Hypertable Development" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/hypertable-dev?hl=en.

Reply via email to