]> git.saurik.com Git - cycript.git/commitdiff
Replace only apr_pool_cleanup_register with CYPool.
authorJay Freeman (saurik) <saurik@saurik.com>
Fri, 21 Jun 2013 22:23:31 +0000 (15:23 -0700)
committerJay Freeman (saurik) <saurik@saurik.com>
Fri, 21 Jun 2013 22:24:52 +0000 (15:24 -0700)
ObjectiveC/Library.mm
Pooling.hpp

index 4215453ce67ee8e38554fdd7fd2465ef9d4a03a2..44307e2a05a9c4680c6ffba7bf1ad4e121e18890 100644 (file)
@@ -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<id>(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;
     }
 }
index 807182e7c05addbf70f8e122443e3a9d05b57e65..854113e86bd972f1f96256064032c8c4020cbd1e 100644 (file)
@@ -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_;