26 verbose(v), no_gc(false), gc_request(false),
27 numEntry(0), numCacheHit(0), gcCount(0)
40 signed short distance)
46 if (numEntry >=
capacity) gc_request =
true;
48 &(ntesuki_hash_map::operator[](key.getSignatureKey()));
49 for (NtesukiRecord::RecordList::iterator p = record_list->begin();
50 p != record_list->end(); ++p)
52 if (p->key.getPieceStand() == key.getPieceStand())
60 const NtesukiRecord r(distance, key, white_stand, record_list);
61 record_list->push_front(r);
67 if (result == 0 && full++ == 0 &&
capacity)
69 if (default_gc_size > 0)
94 std::vector<osl::ntesuki::NtesukiRecord*>
records;
101 : state(s),
table(t),
102 depth(-1), pass_count(0)
108 read_keys.insert(r->
key);
109 records.push_back(r);
114 read_keys.erase(records.back()->key);
116 if (pass_depth) pass_count--;
124 if (pass_count)
return false;
129 if (read_keys.find(child->
key) != read_keys.end())
135 for (; i <=
depth; i++) std::cerr <<
"*";
137 for (; i <= 11; i++) std::cerr <<
" ";
139 if (child->
isVisited()) std::cerr <<
"(*)";
166 if (!lchild)
return false;
168 if (!rchild)
return true;
192 std::vector<osl::ntesuki::NtesukiRecord*>
records;
199 : state(s),
table(t),
200 depth(-1), pass_count(0), pass_depth(0), depth_visited(0)
207 read_keys.insert(r->
key);
208 records.push_back(r);
213 read_keys.erase(records.back()->key);
215 if (pass_depth) pass_count--;
223 if (pass_count)
return false;
230 if (
depth < depth_visited)
236 for (; i <=
depth; i++) std::cerr <<
"*";
237 for (; i <= 10; i++) std::cerr <<
" ";
239 if (child->
isVisited()) std::cerr <<
"(*)";
240 if (read_keys.find(child->
key) != read_keys.end())
255 if (
depth < depth_visited)
260 for (; i <=
depth; i++) std::cerr <<
"*";
261 for (; i <= 10; i++) std::cerr <<
" ";
275 if (!lchild)
return false;
277 if (!rchild)
return true;
311 typedef std::vector<HashKey> keys_t;
313 for (osl::ntesuki::NtesukiTable::Table::iterator it = table.begin();
314 it != table.end(); ++it)
316 for (NtesukiRecord::RecordList::iterator p = it->second.begin();
317 p != it->second.end(); ++p)
320 if (reachable_keys.find(record->
key) == reachable_keys.end())
322 garbage_list.push_back(record->
key);
326 reachable_keys.erase(record->
key);
330 for (keys_t::iterator it = garbage_list.begin();
331 it != garbage_list.end(); ++it)
338 reachable_keys.insert(r->
key);
347 return reachable_keys.find(child->
key) == reachable_keys.end();
372 if (largeGCCount >= 0 &&
373 gcCount >= static_cast<unsigned int>(largeGCCount))
377 std::cerr <<
"\ntoo many GCs, failing\n\n";
384 const unsigned int garbage_size = numEntry - gc_size;
388 for (
int i = 0; i < 2; i++)
390 std::cerr << root->getValue<
BLACK>(i) <<
"\t"
391 << root->getValue<
WHITE>(i) <<
"\t";
393 std::cerr <<
" " << numEntry <<
" -> ";
397 std::vector<NtesukiRecord *>,
400 for (iterator it =
begin(); it !=
end(); ++it)
402 for (NtesukiRecord::RecordList::iterator p = it->second.begin();
403 p != it->second.end(); ++p)
405 NtesukiRecord *record = &(*p);
414 garbage_list.push(record);
415 if (garbage_list.size() > garbage_size)
422 std::cerr <<
"\n*before GC\n";
424 forEachRecordFromRoot<RecordPrinter2>();
426 while (!garbage_list.empty())
428 NtesukiRecord *garbage = garbage_list.top();
435 std::cerr << numEntry <<
"\n";
437 std::cerr <<
"*after GC\n";
438 forEachRecordFromRoot<RecordPrinter2>();
445 for (
int i = 0; i < 2; i++)
447 std::cerr << root->getValue<
BLACK>(i) <<
"\t"
448 << root->getValue<
WHITE>(i) <<
"\t";
456 unsigned int orig_size = numEntry;
457 unsigned int small_subtree_size = 1,
459 while (numEntry > gc_size)
461 for (iterator list_it =
begin();
462 list_it !=
end(); ++list_it)
473 for (NtesukiRecord::RecordList::iterator r = list_it->second.begin();
474 r != list_it->second.end(); ++r)
476 NtesukiRecord *record = &(*r);
487 for (NtesukiRecord::RecordPList::const_iterator pit = record->
parents.begin();
488 pit != record->
parents.end(); ++pit)
490 (*pit)->rev_refcount--;
492 list_it->second.erase(r);
493 goto retry_collect_list;
497 #ifdef MARK_AND_SWEEP_AFTER_SMALLTREEGC
498 unsigned int before_mark_and_sweep = numEntry;
499 forEachRecordFromRoot<MarkAndSweep>();
500 garbage_size += before_mark_and_sweep - numEntry;
503 small_subtree_size += 4;
505 small_subtree_size -= 4;
507 for (iterator it =
begin(); it !=
end(); ++it)
509 for (NtesukiRecord::RecordList::iterator p = it->second.begin();
510 p != it->second.end(); ++p)
512 NtesukiRecord *record = &(*p);
522 std::cerr << numEntry <<
"\tcollected up to " << small_subtree_size <<
"\n";
523 std::cerr <<
" " << orig_size <<
" -> " << numEntry <<
"\n";
537 ntesuki_hash_map::iterator hit =
539 if (hit == ntesuki_hash_map::end())
543 for (NtesukiRecord::RecordList::iterator p = hit->second.begin();
544 p != hit->second.end(); ++p)
546 if (p->key.getPieceStand() == key.getPieceStand())
559 ntesuki_hash_map::iterator hit =
561 if (hit == ntesuki_hash_map::end())
565 for (NtesukiRecord::RecordList::iterator p = hit->second.begin();
566 p != hit->second.end(); ++p)
568 if (p->key.getPieceStand() == key.getPieceStand())
570 hit->second.erase(p);
579 unsigned int gc_size,
581 :
table(new
Table(capacity, gc_size, verbose)),
593 std::cerr <<
"~NtesukiTable size " << size()
594 <<
", cache hit " << table->numCacheHit
595 <<
", table full " << table->gcCount <<
"\n";
597 ntesuki_hash_map::const_iterator hit = this->begin();
598 while (hit != this->end())
601 for (NtesukiRecord::RecordList::const_iterator p = record_list.begin();
602 p != record_list.end(); ++p)
605 const unsigned short d = r.
distance;
608 std::cerr << d << r <<
"\n";
617 if (depths[
depth] != 0)
619 std::cerr <<
"depth: " <<
depth <<
" " << depths[
depth] <<
"\n";