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) {
else if (pool == NULL)
return [object autorelease];
else {
- apr_pool_cleanup_register(*pool, object, &CYPoolRelease_, &apr_pool_cleanup_null);
+ pool->atexit(CYPoolRelease_);
return object;
}
}
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_);
}
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) {
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_;