#define _KERN_ORB_H
#include <kern/types.h>
-#include <orb.h>
+#include <kern/radix.h>
+#include <kern/lock.h>
#include <util/list.h>
#include <util/rbtree.h>
+#include <util/radix.h>
+#include <util/bmaptree.h>
+
#include <System/Objects.h>
+#include <orb.h>
namespace Mem {
class ProcAddrSpace;
struct CallFrame {
// Address Space and PC to return to
Mem::ProcAddrSpace *ret_aspace;
- ulong ret_pc;
+ uintptr_t ret_stack;
// Caller's PIB Pointer
System::RunTime::ParamInfoBlock *caller_user_pib;
-
- // Object and Method that were called -- it probably isn't strictly
- // necessary to keep track of this here, but it'd help in doing a
- // "traceforward" of the method invocation stack in order to
- // debug a stalled method call.
-
- ID object, method;
};
struct CallStackHeader {
CallFrame frames[0];
};
-
- struct ObjectHdr;
- struct Object;
-
- typedef Util::RBTree<ObjectHdr, Object *, Object *> IDRMap;
struct ObjectHdr {
- IDRMap::Node rbtree_node;
- u32 id;
+ ID id;
union {
struct {
+ u32 Valid:1;
u32 Pointer:1;
};
struct Object : public ObjectHdr {
Mem::ProcAddrSpace *aspace;
- uintptr_t entry;
};
struct ObjectPtr : public ObjectHdr {
Object *object;
};
+
+ union ObjTableEntry {
+ ObjectHdr hdr;
+ Object obj;
+ ObjectPtr ptr;
+ };
+
+ typedef Util::RadixTree<ObjTableEntry, ID, 6> IDTable;
+ typedef Util::RBPtr<Object *, ObjectPtr *> IDRMap;
+ typedef Util::BitmapTree<ID> IDAlloc;
class IDSpace {
- // Reverse mapping of object pointers to local IDs
- IDRMap id_rmap;
+ Lock::SpinLock lock; // For add/del only; not needed for lookup
+ IDTable table; // Forward mapping of local IDs to object ptrs
+ IDRMap rmap; // Reverse mapping of remote object pointers to local IDs
+ IDAlloc alloc; // Bitmap for allocating IDs
public:
Object *lookup(u32 id);
- u32 rlookup(Object *obj);
+ ObjectHdr *get_local(Object *obj);
+ Object *newobj(Mem::ProcAddrSpace *aspace);
};
+
+ void invoke_method(System::RunTime::ParamInfoBlock *pib, uintptr_t &stack);
+ uintptr_t return_from_method(uintptr_t &exptr, size_t &exlen);
+ void init();
}
#endif