1 #include "vg_platform.h"
3 #include "vg_mem_pool.h"
7 * -------------------------------------------------------------------------- */
9 vg_pool_node
*vg_pool_nodeptr( vg_pool
*pool
, u16 id
){
10 if( !id
) return NULL
;
12 return pool
->buffer
+ (pool
->stride
*(id
-1)) + pool
->offset
;
16 void *vg_pool_item( vg_pool
*pool
, u16 id
)
18 if( (id
== 0) || (id
> pool
->count
) )
21 return pool
->buffer
+ pool
->stride
*(size_t)(id
-1);
24 void vg_pool_init( vg_pool
*pool
)
27 pool
->tail
= pool
->count
;
28 for( u16 ib
=1; ib
<= pool
->count
; ib
++ ){
29 vg_pool_node
*nb
= vg_pool_nodeptr( pool
, ib
);
31 u16 ia
= ib
-1, ic
= ib
+1;
33 nb
->r
= ic
<=pool
->count
? ic
: 0;
38 u16
vg_pool_id( vg_pool
*pool
, void *item
)
40 return ((item
- pool
->buffer
) / pool
->stride
) + 1;
43 static void vg_pool_unlink( vg_pool
*pool
, u16 id
)
45 vg_pool_node
*node
= vg_pool_nodeptr( pool
, id
);
46 vg_pool_node
*l
= vg_pool_nodeptr( pool
, node
->l
),
47 *r
= vg_pool_nodeptr( pool
, node
->r
);
49 if( pool
->head
== id
) pool
->head
= node
->r
;
50 if( pool
->tail
== id
) pool
->tail
= node
->l
;
52 if( l
) l
->r
= node
->r
;
53 if( r
) r
->l
= node
->l
;
59 u16
vg_pool_lru( vg_pool
*pool
)
61 u16 head
= pool
->head
;
64 vg_pool_unlink( pool
, head
);
68 void vg_pool_watch( vg_pool
*pool
, u16 id
)
70 vg_pool_node
*node
= vg_pool_nodeptr( pool
, id
);
72 if( !node
->ref_count
){
73 vg_pool_unlink( pool
, id
);
76 if( node
->ref_count
== 0xffff )
77 vg_fatal_error( "pool watch missmatch (limit is 128)\n" );
82 /* if after this no more watches, places back into the volatile list */
83 void vg_pool_unwatch( vg_pool
*pool
, u16 id
)
85 vg_pool_node
*node
= vg_pool_nodeptr( pool
, id
);
87 if( node
->ref_count
== 0 )
88 vg_fatal_error( "pool unwatch missmatch (no watchers)\n" );
91 if( !node
->ref_count
){
92 vg_pool_node
*head
= vg_pool_nodeptr( pool
, pool
->head
),
93 *tail
= vg_pool_nodeptr( pool
, pool
->tail
);
95 if( tail
) tail
->r
= id
;
98 if( !head
) pool
->head
= id
;