64 static Block*
allocate(
unsigned int n, Block*
p=NULL);
72 static const unsigned int n_dpow = 8U;
85 double decay(
void)
const;
89 double val(Counter&
c);
91 static void*
operator new(
size_t s);
93 static void operator delete(
void*
p);
96 static const unsigned int size_min = 32;
98 static const unsigned int size_max = 32 * 1024;
103 Support::Mutex* mutex;
109 unsigned int use_cnt;
117 Object(Support::Mutex* m, Object*
p=NULL);
119 static void*
operator new(
size_t s);
121 static void operator delete(
void*
p);
126 Object* object(
void)
const;
128 bool local(
void)
const;
130 void local(Object* o);
132 void global(
void* mo);
143 double decay(
void)
const;
145 void fail(Counter&
c);
147 double afc(Counter&
c);
160 GlobalAFC::DecayManager::decay(
double d0) {
171 GlobalAFC::DecayManager::DecayManager(
void)
175 GlobalAFC::DecayManager::decay(
void)
const {
179 GlobalAFC::DecayManager::decay(Counter&
c) {
180 assert((
t >= c.t) && (
d != 1.0));
181 unsigned int n =
t - c.t;
186 c.c *=
pow(
d,static_cast<double>(n));
192 GlobalAFC::DecayManager::inc(Counter& c) {
197 c.c += 1.0; c.t = ++
t;
201 GlobalAFC::DecayManager::val(Counter& c) {
207 GlobalAFC::DecayManager::operator
new(
size_t s) {
211 GlobalAFC::DecayManager::operator
delete(
void*
p) {
222 GlobalAFC::Object::operator
new(
size_t s) {
227 GlobalAFC::Object::operator
delete(
void*
p) {
232 GlobalAFC::Block::allocate(
unsigned int n, GlobalAFC::Block*
p) {
233 Block*
b =
static_cast<Block*
>(
heap.
ralloc(
sizeof(Block)+
234 (n-1)*
sizeof(Counter)));
240 GlobalAFC::Object::Object(Support::Mutex* m, Object* p)
241 : mutex(m), parent(p), use_cnt(1),
size(size_min), free(size_min),
243 if (parent == NULL) {
244 decay =
new DecayManager;
246 decay = parent->decay;
251 GlobalAFC::object(
void)
const {
255 GlobalAFC::local(
void)
const {
259 GlobalAFC::local(Object* o) {
264 GlobalAFC::global(
void* o) {
277 Object* o = object();
287 Object* c = object();
288 DecayManager*
decay = c->decay;
289 while ((c != NULL) && (--c->use_cnt == 0)) {
293 Block*
d =
b; b=b->next;
297 Object*
d =
c; c = c->parent;
312 object()->decay->inc(c);
321 d = object()->decay->val(c);
331 d = object()->decay->decay();
340 object()->decay->decay(d);
353 local(
new Object(
object()->mutex,
object()));
357 Object* o = object();
360 if (2*o->size <= size_max)
363 o->cur = Block::allocate(o->size,o->cur);
366 Counter* c = &o->cur->c[--o->free];