summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/kernel/gc.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'sca-cpp/trunk/kernel/gc.hpp')
-rw-r--r--sca-cpp/trunk/kernel/gc.hpp90
1 files changed, 51 insertions, 39 deletions
diff --git a/sca-cpp/trunk/kernel/gc.hpp b/sca-cpp/trunk/kernel/gc.hpp
index cc347a6da4..bfb304615d 100644
--- a/sca-cpp/trunk/kernel/gc.hpp
+++ b/sca-cpp/trunk/kernel/gc.hpp
@@ -103,12 +103,8 @@ public:
return *this;
}
- operator apr_pool_t*() const {
- return p;
- }
-
private:
- friend const bool destroy(gc_pool& pool);
+ friend apr_pool_t* pool(const gc_pool& pool);
friend class gc_global_pool_t;
friend class gc_scoped_pool;
@@ -116,40 +112,29 @@ private:
};
/**
+ * Return APR pool used by a gc_pool.
+ */
+apr_pool_t* pool(const gc_pool& pool) {
+ return pool.p;
+}
+
+/**
* Destroy a memory pool.
*/
-const bool destroy(gc_pool& pool) {
- apr_pool_destroy(pool.p);
+const bool destroy(const gc_pool& p) {
+ apr_pool_destroy(pool(p));
return true;
}
/**
- * Default global memory pool.
+ * Initialize APR.
*/
class gc_apr_context_t {
public:
gc_apr_context_t() {
apr_initialize();
}
- ~gc_apr_context_t() {
- //apr_terminate();
- }
-};
-
-gc_apr_context_t gc_apr_context;
-
-class gc_global_pool_t : public gc_pool {
-public:
- gc_global_pool_t() {
- apr_pool_create(&p, NULL);
- }
-
- ~gc_global_pool_t() {
- //apr_pool_destroy(p);
- }
-};
-
-gc_global_pool_t gc_global_pool;
+} gc_apr_context;
/**
* Maintain a stack of memory pools.
@@ -166,9 +151,29 @@ apr_pool_t* gc_current_pool() {
apr_pool_t* p = gc_pool_stack;
if (p != NULL)
return p;
- apr_pool_t* g = gc_global_pool;
- gc_pool_stack = g;
- return g;
+
+ // Create a parent pool for the current thread
+ apr_pool_create(&p, NULL);
+ gc_pool_stack = p;
+ return p;
+}
+
+/**
+ * Push a pool onto the stack.
+ */
+apr_pool_t* gc_push_pool(apr_pool_t* pool) {
+ apr_pool_t* p = gc_pool_stack;
+ gc_pool_stack = pool;
+ return p;
+}
+
+/**
+ * Pop a pool from the stack.
+ */
+apr_pool_t* gc_pop_pool(apr_pool_t* pool) {
+ apr_pool_t* p = gc_pool_stack;
+ gc_pool_stack = pool;
+ return p;
}
/**
@@ -178,28 +183,27 @@ apr_pool_t* gc_current_pool() {
class gc_scoped_pool : public gc_pool {
public:
- gc_scoped_pool() : gc_pool(NULL), prev(gc_current_pool()), owned(true) {
+ gc_scoped_pool() : gc_pool(NULL), prev(gc_current_pool()), owner(true) {
apr_pool_create(&p, NULL);
- gc_pool_stack = p;
+ gc_push_pool(p);
}
- gc_scoped_pool(apr_pool_t* pool) : gc_pool(pool), prev(gc_current_pool()), owned(false) {
- gc_pool_stack = p;
+ gc_scoped_pool(apr_pool_t* pool) : gc_pool(pool), prev(gc_current_pool()), owner(false) {
+ gc_push_pool(p);
}
~gc_scoped_pool() {
- if (owned)
+ if (owner)
apr_pool_destroy(p);
- if (prev != NULL)
- gc_pool_stack = prev;
+ gc_pop_pool(prev);
}
private:
- gc_scoped_pool(const unused gc_scoped_pool& pool) : gc_pool(pool.p), prev(NULL), owned(false) {
+ gc_scoped_pool(const unused gc_scoped_pool& pool) : gc_pool(pool.p), prev(NULL), owner(false) {
}
apr_pool_t* prev;
- bool owned;
+ bool owner;
};
/**
@@ -218,6 +222,10 @@ template<typename T> T* gc_new(apr_pool_t* p) {
return static_cast<T*>(m);
}
+template<typename T> T* gc_new(const gc_pool& p) {
+ return gc_new<T>(pool(p));
+}
+
template<typename T> T* gc_new() {
return gc_new<T>(gc_current_pool());
}
@@ -238,6 +246,10 @@ template<typename T> T* gc_anew(apr_pool_t* p, int n) {
return (T*)(m + 1);
}
+template<typename T> T* gc_anew(const gc_pool& p, int n) {
+ return gc_anew<T>(pool(p), n);
+}
+
template<typename T> T* gc_anew(int n) {
return gc_anew<T>(gc_current_pool(), n);
}