2007-06-02 23:36:55 +00:00
|
|
|
#ifndef HEAP_H
|
|
|
|
#define HEAP_H
|
|
|
|
|
2007-06-20 19:20:25 +00:00
|
|
|
#include "system.h"
|
|
|
|
|
2007-06-18 19:23:44 +00:00
|
|
|
namespace vm {
|
|
|
|
|
2007-06-02 23:36:55 +00:00
|
|
|
class Heap {
|
|
|
|
public:
|
|
|
|
enum CollectionType {
|
|
|
|
MinorCollection,
|
|
|
|
MajorCollection
|
|
|
|
};
|
|
|
|
|
2007-07-10 01:43:43 +00:00
|
|
|
enum Status {
|
2007-07-20 03:18:25 +00:00
|
|
|
Null,
|
2007-07-10 01:43:43 +00:00
|
|
|
Reachable,
|
|
|
|
Unreachable,
|
|
|
|
Tenured
|
|
|
|
};
|
|
|
|
|
2007-06-02 23:36:55 +00:00
|
|
|
class Visitor {
|
2007-06-03 01:58:47 +00:00
|
|
|
public:
|
2007-06-02 23:36:55 +00:00
|
|
|
virtual ~Visitor() { }
|
|
|
|
virtual void visit(void**) = 0;
|
|
|
|
};
|
|
|
|
|
2007-06-20 16:58:35 +00:00
|
|
|
class Walker {
|
2007-06-03 01:58:47 +00:00
|
|
|
public:
|
2007-06-20 16:58:35 +00:00
|
|
|
virtual ~Walker() { }
|
|
|
|
virtual bool visit(unsigned) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
class Client {
|
|
|
|
public:
|
|
|
|
virtual ~Client() { }
|
|
|
|
virtual void visitRoots(Visitor*) = 0;
|
2007-06-20 17:42:13 +00:00
|
|
|
virtual unsigned sizeInWords(void*) = 0;
|
2007-07-02 14:19:05 +00:00
|
|
|
virtual unsigned copiedSizeInWords(void*) = 0;
|
|
|
|
virtual void copy(void*, void*) = 0;
|
2007-06-20 16:58:35 +00:00
|
|
|
virtual void walk(void*, Walker*) = 0;
|
2007-06-02 23:36:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
virtual ~Heap() { }
|
2007-06-20 16:58:35 +00:00
|
|
|
virtual void collect(CollectionType type, Client* client) = 0;
|
2007-06-15 16:00:08 +00:00
|
|
|
virtual bool needsMark(void** p) = 0;
|
2007-06-20 02:28:31 +00:00
|
|
|
virtual void mark(void** p) = 0;
|
2007-06-20 17:42:13 +00:00
|
|
|
virtual void* follow(void* p) = 0;
|
2007-07-10 01:43:43 +00:00
|
|
|
virtual Status status(void* p) = 0;
|
|
|
|
virtual CollectionType collectionType() = 0;
|
2007-06-20 02:28:31 +00:00
|
|
|
virtual void dispose() = 0;
|
2007-06-02 23:36:55 +00:00
|
|
|
};
|
|
|
|
|
2007-06-20 19:20:25 +00:00
|
|
|
Heap* makeHeap(System* system);
|
|
|
|
|
2007-06-18 19:23:44 +00:00
|
|
|
} // namespace vm
|
|
|
|
|
2007-06-02 23:36:55 +00:00
|
|
|
#endif//HEAP_H
|