X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=include%2Fc%2B%2B%2Forb.h;h=fa2f54846379c067e84acbfff1e3a8a93028c75d;hp=1f1a3e6f6588586d69caec87fd0976ff6571c783;hb=c935c41d1f2969dae860cdb16127779d2970a0e3;hpb=b024710fe2b60cd4a42a8993b61333d6cdb56ca3 diff --git a/include/c++/orb.h b/include/c++/orb.h index 1f1a3e6..fa2f548 100644 --- a/include/c++/orb.h +++ b/include/c++/orb.h @@ -9,6 +9,8 @@ #include #include +#include + namespace System { struct _i_Object; @@ -17,297 +19,20 @@ namespace System { } namespace RunTime { + using namespace ::Util::Arrays; + class ORBMM { - void *priv; + static void *priv; public: - class AllocGroup { - friend class ORBMM; - }; - typedef ::System::Mem::Region Region; - ORBMM(); - - void *alloc(size_t size, int refs = 1); - void retain(void *ptr, int refs = 1); - void release(void *ptr, int refs = 1); - void add_region(Region region, bool unmap_orig, int refs = 1); - }; - - extern ORBMM *orbmm; - - // FIXME: should be an IDL exception - struct ArrayException - { - }; - - class NullArray { - }; - - static const NullArray nullarray = {}; - - template struct MutableArray { - T *ptr; - size_t count; - - bool valid_index(size_t index) - { - return index >= 0 && index < count; - } - - T &operator[](size_t index) - { -#ifndef POLINTOS_NO_ARRAY_BOUNDS_CHECK - if (!valid_index(index)) - throw ArrayException(); -#endif - - return ptr[index]; - } - - MutableArray() - { - ptr = NULL; - count = 0; - } - - MutableArray(NullArray na) - { - ptr = NULL; - count = 0; - } - - MutableArray(T *PTR, size_t COUNT) - { - ptr = PTR; - count = COUNT; - } - - MutableArray &slice_nocheck(size_t first, size_t newcount) - { - MutableArray ret; - ret.ptr = ptr + first; - ret.count = newcount; - return ret; - } - - MutableArray &slice_nocheck(size_t first) - { - MutableArray ret; - ret.ptr = ptr + first; - ret.count = count - first; - return ret; - } - - MutableArray &slice(size_t first, size_t count) - { -#ifndef POLINTOS_NO_ARRAY_BOUNDS_CHECK - if (!valid_index(first) || !valid_index(first + count - 1)) - throw ArrayException(); -#endif - - return slice_nocheck(first, count); - } - - MutableArray &slice(size_t first) - { -#ifndef POLINTOS_NO_ARRAY_BOUNDS_CHECK - if (!valid_index(first)) - throw ArrayException(); -#endif - - return slice_nocheck(first); - } - - MutableArray copy() - { - MutableArray new_arr; - new_arr.ptr = new(orbmm) T[count]; - new_arr.count = count; - memcpy(new_arr.ptr, ptr, count); - return new_arr; - } + static void *alloc(size_t size, int refs = 1); + static void retain(void *ptr, int refs = 1); + static void release(void *ptr, int refs = 1); + static void add_region(Region region, bool unmap_orig, int refs = 1); }; - template - struct GrowableArray : public MutableArray { - using MutableArray::ptr; - using MutableArray::count; - size_t bufsize; - - GrowableArray() - { - bufsize = 0; - } - - GrowableArray(NullArray na) : MutableArray(na) - { - bufsize = 0; - } - - GrowableArray(T *PTR, size_t COUNT) : MutableArray(PTR, COUNT) - { - bufsize = COUNT; - } - - GrowableArray(T *PTR, size_t COUNT, size_t BUFSIZE) : - MutableArray(PTR, COUNT) - { - bufsize = BUFSIZE; - } - - GrowableArray(MutableArray &ma) : MutableArray(ma) - { - bufsize = count; - } - - void grow(size_t newsize) - { - if (newsize <= bufsize) - return; - - T *oldptr = ptr; - T *newptr = new(orbmm) T[newsize]; - memcpy(newptr, ptr, count * sizeof(T)); - ptr = newptr; - ll_smp_membar_store_after_store(); - bufsize = newsize; - // FIXME: Should release imply membar? - ll_smp_membar_any_after_store(); - orbmm->release(oldptr); - } - - // Caller must sync against all writers. - void append(T *newptr, size_t len, size_t max = ULONG_MAX) - { - if (count + len < count) - throw ArrayException(); - - if (count + len > max) - throw ArrayException(); - - if (count + len > bufsize) - grow(ll_get_order_round_up(count + len)); - - memcpy(ptr + count, newptr, len * sizeof(T)); - count += len; - } - }; - - template struct Array { - const T *ptr; - size_t count; - - bool valid_index(size_t index) - { - return index >= 0 && index < count; - } - - const T &operator[](size_t index) - { -#ifndef POLINTOS_NO_ARRAY_BOUNDS_CHECK - if (!valid_index(index)) - throw ArrayException(); -#endif - - return ptr[index]; - } - - Array() - { - ptr = NULL; - count = 0; - } - - Array(NullArray na) - { - ptr = NULL; - count = 0; - } - - Array(const T *PTR, size_t COUNT) - { - ptr = PTR; - count = COUNT; - } - - Array(MutableArray ma) - { - ptr = ma.ptr; - count = ma.count; - } - - MutableArray constcast() - { - MutableArray ma; - ma.ptr = const_cast(ptr); - ma.count = count; - return ma; - } - - Array &slice_nocheck(size_t first, size_t newcount) - { - Array ret; - ret.ptr = ptr + first; - ret.count = newcount; - return ret; - } - - Array &slice_nocheck(size_t first) - { - Array ret; - ret.ptr = ptr + first; - ret.count = count - first; - return ret; - } - - Array &slice(size_t first, size_t count) - { -#ifndef POLINTOS_NO_ARRAY_BOUNDS_CHECK - if (!valid_index(first) || !valid_index(first + count - 1)) - throw ArrayException(); -#endif - - return slice_nocheck(first, count); - } - - Array &slice(size_t first) - { -#ifndef POLINTOS_NO_ARRAY_BOUNDS_CHECK - if (!valid_index(first)) - throw ArrayException(); -#endif - - return slice_nocheck(first); - } - - MutableArray copy() - { - MutableArray new_arr; - new_arr.ptr = new(orbmm) T[count]; - new_arr.count = count; - memcpy(new_arr.ptr, ptr, count); - return new_arr; - } - }; - - static inline Array countarray(const char *ptr) - { - Array ret; - ret.ptr = reinterpret_cast(ptr); - ret.count = strlen(ptr); - return ret; - } - - static inline MutableArray countarray(char *ptr) - { - MutableArray ret; - ret.ptr = reinterpret_cast(ptr); - ret.count = strlen(ptr); - return ret; - } - struct IFaceInfo; typedef uint32_t ID; @@ -318,7 +43,7 @@ namespace System { union GUID { unsigned char c[16]; - unsigned long l[]; + unsigned long l[16 / sizeof(unsigned long)]; }; uintptr_t downcast(::System::_i_Object *obj, const GUID *new_guid); @@ -386,7 +111,7 @@ namespace System { struct IFaceInfo { const GUID *guid; - void (*invoke)(Array objlist, + void (*invoke)(Array objlist, ParamInfoBlock::Segment *segs, int nsegs); ::System::_i_Object *(*wrapper)(ID id); @@ -398,6 +123,14 @@ namespace System { uint32_t reserved[3]; // must be zero }; + struct MarshCtx { + GrowableArray &buf; + GrowableArray &objlist; + GrowableArray &newobjlist; + ParamInfoBlock::Segment *segs; + int nsegs; + }; + struct VStructInfo { // List of GUIDs of the struct and its superstructs, // starting with System.VStruct and ending with @@ -409,17 +142,10 @@ namespace System { const int chainlen; - int (*marshall)(GrowableArray &buf, - GrowableArray &objlist, - GrowableArray &newobjlist, - ParamInfoBlock::Segment *segs, - int nsegs); - void (*unmarshall)(Array buf, - Array< ::System::_i_Object *> objlist, - ParamInfoBlock::Segment *segs, - int nsegs); + int (*marshall)(MarshCtx &ctx); + void (*unmarshall)(MarshCtx &ctx); }; - + namespace Priv { // Return the caller's PC. It'd be nice if GCC had a builtin for // the current PC, so that a simple relocation could be used rather @@ -436,33 +162,21 @@ namespace System { return false; #endif } + } }; } -inline void *operator new(size_t len, ::System::RunTime::ORBMM *orbmm, +inline void *operator new(size_t len, ::System::RunTime::ORBMM orbmm, int refs = 1) { - return orbmm->alloc(len, refs); -} - -inline void *operator new[](size_t len, ::System::RunTime::ORBMM *orbmm, - int refs = 1) -{ - return orbmm->alloc(len, refs); + return ::System::RunTime::ORBMM::alloc(len, refs); } -// FIXME: This isn't safe on anything with a descructor. -inline void operator delete(void *ptr, ::System::RunTime::ORBMM *orbmm, +inline void *operator new[](size_t len, ::System::RunTime::ORBMM orbmm, int refs = 1) { - orbmm->release(ptr, refs); -} - -inline void operator delete[](void *ptr, ::System::RunTime::ORBMM *orbmm, - int refs = 1) -{ - orbmm->release(ptr, refs); + return ::System::RunTime::ORBMM::alloc(len, refs); } // This is a macro rather than an inline template function so that the @@ -476,15 +190,15 @@ inline void operator delete[](void *ptr, ::System::RunTime::ORBMM *orbmm, #ifndef POLINTOS_NO_THROW_IDL #define throw_idl(T, args...) do { \ throw T(NULL, NULL, \ - new(::System::RunTime::orbmm) \ + new(::System::RunTime::ORBMM()) \ ::System::Exceptions::NativeCodeExceptionOriginInfo \ (::System::RunTime::Priv::get_pc()), \ ::System::RunTime::Priv::in_kernel(), ##args); \ } while (0) #define rethrow_idl(oldex, T, args...) do { \ - throw T(new(::System::RunTime::orbmm) typeof(oldex)(oldex), NULL, \ - new(::System::RunTime::orbmm) \ + throw T(new(::System::RunTime::ORBMM()) typeof(oldex)(oldex), NULL, \ + new(::System::RunTime::ORBMM()) \ ::System::Exceptions::NativeCodeExceptionOriginInfo \ (::System::RunTime::Priv::get_pc()), \ ::System::RunTime::Priv::in_kernel(), ##args); \