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