00001
00002
00003 #ifndef _SIZETHREADHEAP_H_
00004 #define _SIZETHREADHEAP_H_
00005
00006 #include <assert.h>
00007
00008 template <class Super>
00009 class SizeThreadHeap : public Super {
00010 public:
00011
00012 inline void * malloc (size_t sz) {
00013
00014
00015 assert (sizeof(st) <= sizeof(double));
00016 st * ptr = (st *) Super::malloc (sz + sizeof(double));
00017
00018 ptr->size = sz;
00019 assert (getOrigPtr(ptr + 1) == ptr);
00020 return (void *) (ptr + 1);
00021 }
00022
00023 inline void free (void * ptr) {
00024 void * origPtr = (void *) getOrigPtr(ptr);
00025 Super::free (origPtr);
00026 }
00027
00028 static inline volatile int getThreadId (void);
00029
00030 static inline size_t& size (void * ptr) {
00031 return getOrigPtr(ptr)->size;
00032 }
00033
00034 static inline int& thread (void * ptr) {
00035 return getOrigPtr(ptr)->tid;
00036 }
00037
00038 private:
00039
00040 typedef struct _st {
00041 size_t size;
00042 int tid;
00043 } st;
00044
00045 static inline st * getOrigPtr (void * ptr) {
00046 return (st *) ((double *) ptr - 1);
00047 }
00048
00049 };
00050
00051
00052
00053
00054
00055
00056 #if defined(WIN32) || defined(__WIN32__) || defined(_WIN32)
00057 #ifndef WIN32
00058 #define WIN32 1
00059 #endif
00060 #include <windows.h>
00061 #include <process.h>
00062 #endif
00063
00064 template <class SuperHeap>
00065 inline volatile int
00066 SizeThreadHeap<SuperHeap>::getThreadId (void) {
00067 #if defined(WIN32)
00068 return GetCurrentThreadId();
00069 #endif
00070 #if defined(__BEOS__)
00071 return find_thread(0);
00072 #endif
00073 #if defined(__linux)
00074
00075
00076 return (int) pthread_self() >> 10;
00077 #endif
00078 #if defined(__SVR4)
00079 return (int) lwp_self();
00080 #endif
00081 #if defined(POSIX)
00082 return (int) pthread_self();
00083 #endif
00084 #if USE_SPROC
00085
00086
00087
00088 int pid = (int) PRDA->sys_prda.prda_sys.t_pid;
00089 return pid;
00090 #endif
00091 }
00092
00093
00094
00095 #endif