7 * ¥á¥â¥ê¡¦¥Ö¥í¥Ã¥¯¹½Â¤ÂÎ
8 * (³ÍÆÀ¤µ¤ì¤¿³ÆÎΰè¤Ï¡¤ÀèƬ¤Ë°Ê²¼¤Î¹½Â¤ÂΤò»ý¤Ã¤Æ¤¤¤ë)
10 typedef struct _kzmem_block {
11 struct _kzmem_block *next;
16 typedef struct _kzmem_pool {
22 /* ¥á¥â¥ê¡¦¥×¡¼¥ë¤ÎÄêµÁ(¸Ä¡¹¤Î¥µ¥¤¥º¤È¸Ä¿ô) */
23 static kzmem_pool pool[] = {
24 { 16, 8, NULL }, { 32, 8, NULL }, { 64, 4, NULL },
27 #define MEMORY_AREA_NUM (sizeof(pool) / sizeof(*pool))
29 /* ¥á¥â¥ê¡¦¥×¡¼¥ë¤Î½é´ü²½ */
30 static int kzmem_init_pool(kzmem_pool *p)
35 extern char freearea; /* ¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤µ¤ì¤ë¶õ¤Îΰè */
36 static char *area = &freearea;
38 mp = (kzmem_block *)area;
40 /* ¸Ä¡¹¤ÎÎΰè¤ò¤¹¤Ù¤Æ²òÊüºÑ¤ß¥ê¥ó¥¯¥ê¥¹¥È¤Ë·Ò¤° */
42 for (i = 0; i < p->num; i++) {
44 memset(mp, 0, sizeof(*mp));
47 mp = (kzmem_block *)((char *)mp + p->size);
54 /* ưŪ¥á¥â¥ê¤Î½é´ü²½ */
58 for (i = 0; i < MEMORY_AREA_NUM; i++) {
59 kzmem_init_pool(&pool[i]); /* ³Æ¥á¥â¥ê¡¦¥×¡¼¥ë¤ò½é´ü²½¤¹¤ë */
64 /* ưŪ¥á¥â¥ê¤Î³ÍÆÀ */
65 void *kzmem_alloc(int size)
71 for (i = 0; i < MEMORY_AREA_NUM; i++) {
73 if (size <= p->size - sizeof(kzmem_block)) {
74 if (p->free == NULL) { /* ²òÊüºÑ¤ßÎΰ褬̵¤¤(¥á¥â¥ê¡¦¥Ö¥í¥Ã¥¯ÉÔÂ) */
78 /* ²òÊüºÑ¤ß¥ê¥ó¥¯¥ê¥¹¥È¤«¤éÎΰè¤ò¼èÆÀ¤¹¤ë */
80 p->free = p->free->next;
84 * ¼ÂºÝ¤ËÍøÍѲÄǽ¤ÊÎΰè¤Ï¡¤¥á¥â¥ê¡¦¥Ö¥í¥Ã¥¯¹½Â¤ÂΤÎľ¸å¤ÎÎΰè¤Ë
85 * ¤Ê¤ë¤Î¤Ç¡¤Ä¾¸å¤Î¥¢¥É¥ì¥¹¤òÊÖ¤¹¡¥
91 /* »ØÄꤵ¤ì¤¿¥µ¥¤¥º¤ÎÎΰè¤ò³ÊǼ¤Ç¤¤ë¥á¥â¥ê¡¦¥×¡¼¥ë¤¬Ìµ¤¤ */
97 void kzmem_free(void *mem)
103 /* Îΰè¤ÎľÁ°¤Ë¤¢¤ë(¤Ï¤º¤Î)¥á¥â¥ê¡¦¥Ö¥í¥Ã¥¯¹½Â¤ÂΤò¼èÆÀ */
104 mp = ((kzmem_block *)mem - 1);
106 for (i = 0; i < MEMORY_AREA_NUM; i++) {
108 if (mp->size == p->size) {
109 /* Îΰè¤ò²òÊüºÑ¤ß¥ê¥ó¥¯¥ê¥¹¥È¤ËÌ᤹ */