|
|
| version 1.7, 2001/02/11 11:27:25 | version 1.62, 2003/11/20 16:34:26 |
|---|---|
| Line 1 | Line 1 |
| /* | /** @file |
| $Id$ | Parser: pool class. |
| Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com) | |
| Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) | |
| */ | */ |
| #include <string.h> | static const char * const IDENT_POOL_C="$Date$"; |
| #include "pa_pool.h" | #include "pa_pool.h" |
| #include "pa_exception.h" | #include "pa_exception.h" |
| #include "pa_common.h" | |
| #include "pa_sapi.h" | |
| #include "pa_charset.h" | |
| // Pool | |
| Pool::Pool(){} | |
| static void cleanup(Pool::Cleanup item, int) { | |
| if(item.cleanup) | |
| item.cleanup(item.data); | |
| } | |
| Pool::~Pool() { | |
| //__asm__("int3"); | |
| //_asm int 3; | |
| //fprintf(stderr, "cleanups: %d\n", cleanups.size()); | |
| // cleanups first, because they use some object's memory pointers | |
| cleanups.for_each(cleanup, 0); | |
| } | |
| void Pool::register_cleanup(void (*cleanup) (void *), void *data) { | |
| cleanups+=Cleanup(cleanup, data); | |
| } | |
| static void unregister_cleanup(Pool::Cleanup& item, void* cleanup_data) { | |
| if(item.data==cleanup_data) | |
| item.cleanup=0; | |
| } | |
| void Pool::unregister_cleanup(void *cleanup_data) { | |
| cleanups.for_each_ref(::unregister_cleanup, cleanup_data); | |
| } | |
| // Pooled | |
| static void cleanup(void *data) { | |
| static_cast<Pooled*>(data)->~Pooled(); | |
| } | |
| Pooled::Pooled(Pool& apool): fpool(apool) { | |
| fpool.register_cleanup(cleanup, this); | |
| } | |
| void *Pool::check(void *ptr, size_t size) { | /// Sole: this got called automatically from Pool::~Pool() |
| if(!ptr) | Pooled::~Pooled() { |
| fexception.raise(0, 0, | fpool.unregister_cleanup(this); |
| 0, | |
| "Pool::_alloc(%u) returned NULL", size); | |
| return ptr; | |
| } | } |