ThreadLocalCollector.h [plain text]
#pragma once
#ifndef __AUTO_THREAD_LOCAL_COLLECTOR__
#define __AUTO_THREAD_LOCAL_COLLECTOR__
#include "Definitions.h"
#include "Range.h"
#include "SubZone.h"
#include "Zone.h"
namespace Auto {
class ThreadLocalCollector {
public:
private:
Zone *_zone;
Range _coverage;
void *_stack_bottom;
Sentinel _localsGuard;
LocalBlocksHash &_localBlocks;
void **_tlcBuffer; size_t _tlcBufferCount;
Thread &_thread;
PtrHashSet *_zombies;
void scan_stack_range(const Range &range);
void mark_push_block(void *block);
void scan_range(const Range &range);
void scan_with_layout(const Range &range, const unsigned char* map);
void scan_local_block(Subzone *subzone, usword_t q, void *block);
void scan_pending_until_done();
void scan_marked_blocks();
void scavenge_local(size_t count, void *garbage[]);
void process_local_garbage(void (*garbage_list_handler)(ThreadLocalCollector *));
friend class thread_local_scanner_helper;
static void finalize_local_garbage_now(ThreadLocalCollector *tlc);
static void finalize_local_garbage_later(ThreadLocalCollector *tlc);
static void unmark_local_garbage(ThreadLocalCollector *tlc);
static void mark_local_garbage(void **garbage_list, size_t garbage_count);
void trace_scanning_phase_end();
void append_block(void *block);
public:
ThreadLocalCollector(Zone *zone, void *current_stack_bottom, Thread &thread)
: _zone(zone), _coverage(zone->coverage()), _stack_bottom(current_stack_bottom), _localsGuard(thread.localsGuard()), _localBlocks(thread.locals()),
_tlcBuffer(thread.tlc_buffer()), _tlcBufferCount(0), _thread(thread), _zombies(NULL)
{
}
~ThreadLocalCollector()
{
if (_zombies)
delete _zombies;
}
static bool should_collect(Zone *zone, Thread &thread, bool canFinalizeNow);
static bool should_collect_suspended(Thread &thread);
void collect(bool finalizeNow);
void collect_suspended(Range ®isters, Range &stack);
void reap_all();
void eject_local_block(void *startingBlock);
bool block_in_garbage_list(void *block);
void evict_local_garbage();
void add_zombie(void *block);
inline bool is_zombie(void *block);
};
};
#endif