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.