From 1560b2c8f7d30fa6b96625ae0fd30c75d4354871 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Fri, 21 Jun 2013 15:23:31 -0700 Subject: [PATCH] Replace only apr_pool_cleanup_register with CYPool. --- ObjectiveC/Library.mm | 5 ++--- Pooling.hpp | 30 ++++++++++++++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/ObjectiveC/Library.mm b/ObjectiveC/Library.mm index 4215453..44307e2 100644 --- a/ObjectiveC/Library.mm +++ b/ObjectiveC/Library.mm @@ -162,10 +162,9 @@ enum { JSValueRef CYSendMessage(CYPool &pool, JSContextRef context, id self, Class super, SEL _cmd, size_t count, const JSValueRef arguments[], bool initialize, JSValueRef *exception); /* Objective-C Pool Release {{{ */ -apr_status_t CYPoolRelease_(void *data) { +void CYPoolRelease_(void *data) { id object(reinterpret_cast(data)); [object release]; - return APR_SUCCESS; } id CYPoolRelease_(CYPool *pool, id object) { @@ -174,7 +173,7 @@ id CYPoolRelease_(CYPool *pool, id object) { else if (pool == NULL) return [object autorelease]; else { - apr_pool_cleanup_register(*pool, object, &CYPoolRelease_, &apr_pool_cleanup_null); + pool->atexit(CYPoolRelease_); return object; } } diff --git a/Pooling.hpp b/Pooling.hpp index 807182e..854113e 100644 --- a/Pooling.hpp +++ b/Pooling.hpp @@ -36,17 +36,29 @@ class CYPool { private: apr_pool_t *pool_; - public: - CYPool() { - _aprcall(apr_pool_create(&pool_, NULL)); - } + struct Cleaner { + Cleaner *next_; + void (*code_)(void *); + void *data_; + + Cleaner(Cleaner *next, void (*code)(void *), void *data) : + next_(next), + code_(code), + data_(data) + { + } + } *cleaner_; - CYPool(apr_pool_t *pool) : - pool_(pool) + public: + CYPool() : + cleaner_(NULL) { + _aprcall(apr_pool_create(&pool_, NULL)); } ~CYPool() { + for (Cleaner *cleaner(cleaner_); cleaner_ != NULL; cleaner_ = cleaner_->next_) + (*cleaner->code_)(cleaner->data_); apr_pool_destroy(pool_); } @@ -85,6 +97,8 @@ class CYPool { char *vsprintf(const char *format, va_list args) const { return apr_pvsprintf(pool_, format, args); } + + void atexit(void (*code)(void *), void *data = NULL); }; _finline void *operator new(size_t size, CYPool &pool) { @@ -95,6 +109,10 @@ _finline void *operator new [](size_t size, CYPool &pool) { return pool(size); } +_finline void CYPool::atexit(void (*code)(void *), void *data) { + cleaner_ = new(*this) Cleaner(cleaner_, code, data); +} + struct CYData { CYPool *pool_; unsigned count_; -- 2.47.2