annotate include/TaskManager/memorypool.h @ 89:a309cf4eafc5

*** empty log message ***
author gongo
date Wed, 27 Feb 2008 17:26:40 +0900
parents 2356238ebea7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
1 #ifndef MEMORY_POOL_H_
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
2 #define MEMORY_POOL_H_
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
3
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
4 #include <memory>
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
5 #include <stdlib.h>
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
6
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
7 const int DEFAULT_EXPAND_SIZE = 32;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
8
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
9 template <class T_, size_t size_ =DEFAULT_EXPAND_SIZE>
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
10 class MemoryPool {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
11 public:
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
12 typedef MemoryPool<T_, size_> self_type;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
13
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
14 MemoryPool(void) {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
15 next_ = NULL;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
16 expandTheFreeList(size_);
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
17 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
18
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
19 ~MemoryPool(void) {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
20 MemoryPool * nextPtr = next_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
21
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
22 while (nextPtr == 0) {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
23 next_ = next_->next_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
24 delete [] nextPtr;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
25 nextPtr = next_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
26 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
27 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
28
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
29 void* alloc(size_t) {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
30 if (!next_) expandTheFreeList(size_);
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
31
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
32 self_type* head = next_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
33 next_ = head->next_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
34
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
35 return head;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
36 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
37
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
38 void free(void* doomed) {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
39 self_type* head = static_cast<self_type*>(doomed);
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
40 head->next_ = next_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
41 next_ = head;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
42 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
43
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
44 private:
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
45 void expandTheFreeList(int howMany);
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
46
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
47 private:
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
48 self_type* next_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
49 };
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
50
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
51 template <class T_, size_t size_>
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
52 void MemoryPool<T_, size_>::expandTheFreeList(int howMany)
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
53 {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
54 size_t size = (sizeof(T_) > sizeof(self_type*))
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
55 ? sizeof(T_) : sizeof(self_type*);
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
56
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
57 self_type* runner = (self_type*)malloc(size);
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
58
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
59 next_ = runner;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
60 for (int i = 0; i < howMany; i++) {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
61 runner->next_ = (self_type*)malloc(size);
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
62 runner = runner->next_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
63 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
64 runner->next_ = 0;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
65 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
66
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
67 template <class T_, size_t size_ =DEFAULT_EXPAND_SIZE>
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
68 class UseMemoryPool {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
69 public:
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
70 void* operator new(size_t size) { return pool_->alloc(size); }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
71 void operator delete(void* doomed, size_t) { pool_->free(doomed); }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
72
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
73 public:
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
74 static void initMemPool() {
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
75 pool_.reset(new MemoryPool<T_, size_>);
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
76 }
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
77
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
78 private:
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
79 static std::auto_ptr<MemoryPool<T_, size_> > pool_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
80
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
81 };
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
82
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
83 template <class T_, size_t size_>
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
84 std::auto_ptr<MemoryPool<T_, size_> > UseMemoryPool<T_, size_>::pool_;
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
85
2356238ebea7 *** empty log message ***
gongo
parents:
diff changeset
86 #endif // ! MEMORY_POOL_H_