Bonjour,
j'ai 2 fichiers header de définis :
- 1 qui gere des liste chainées d'elements "linked_list.h"
- 1 qui gere des "block pool" cad une gestion de la memoire en block (pour eviter de passer par des allocations de memoire dynamiques
Résumé de linked_list.h :
Résumé de block pool.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 struct linked_list_elem { struct linked_list_head * head; ///< A pointer to the head of the list. struct linked_list_elem * prev; ///< A pointer to the previous element in the list. struct linked_list_elem * next; ///< A pointer to the next element in the list. }; struct linked_list_head { struct linked_list_elem * first; ///< A pointer to the first element in the list. struct linked_list_elem * last; ///< A pointer to the last element in the list. }; void linked_list_append ( struct linked_list_head * head, struct linked_list_elem * elem ); void linked_list_insert ( struct linked_list_head * head, struct linked_list_elem * elem ); void linked_list_unlink ( struct linked_list_elem * elem ); struct linked_list_elem * linked_list_pop_first ( struct linked_list_head * head ); struct linked_list_elem * linked_list_pop_last ( struct linked_list_head * head );
Maintenant j'aimerais crée une liste chainée de blocks, donc une liste chainée de blocks allouées par un block pool.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 struct block_pool; struct block_pool * block_pool_create ( unsigned int block_size, unsigned int page_size, unsigned int min_pages, unsigned int max_pages ); void block_pool_delete ( struct block_pool * block_pool ); int block_pool_is_empty ( struct block_pool * block_pool ); void * block_pool_alloc ( struct block_pool * block_pool ); void block_pool_free ( struct block_pool * block_pool, void * block ); unsigned int block_pool_size ( struct block_pool * block_pool );
j'ai donc pensé a créer des structure comme tels :
et 4 fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 struct block_list_head { struct linked_list_head head; ///< Block list head are linked list head }; struct block_list_elem { struct linked_list_elem list; ///< Block list elem are linked list elem unsigned int size; ///< The element size unsigned int begin; ///< Offset to begin unsigned int end; ///< Offset to end };
mais comment gerer la notion de block pool dans ce que j'ai commencé ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 // retourne un pointer sur les données et le maximum disponible dans le premier block, si il n'y a rien la fonction retourne NULL et *size = 0 void * block_list_read_begin ( struct block_list * block_list, unsigned int * size ) // libere 'size' octets dans le premier block, size pouvant etre inferieur ou egal au size que l'on a obtenu avec la fonction precedente. int block_list_read_end ( struct block_list * block_list, unsigned int size ) // retourne un pointer sur les données et le maximum disponible dans le dernier block, si le dernier block est plein, un nouveau block vide et crée void * block_list_write_begin ( struct block_list * block_list, unsigned int * size ) // ajoute 'size' octets au dernier block, size pouvant etre inferieur ou egal au size que l'on a obtenu avec la fonction precedente int block_list_write_end ( struct block_list * block_list, unsigned int size )
merci d'avance car la je bloque pas mal
Partager