File: mempool.c

package info (click to toggle)
ruby-ferret 0.11.8.4%2Bdebian-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 4,368 kB
  • sloc: ansic: 69,786; ruby: 8,131; makefile: 5
file content (88 lines) | stat: -rw-r--r-- 2,051 bytes parent folder | download | duplicates (4)
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "global.h"
#include "mempool.h"
#include <string.h>
#include "internal.h"

MemoryPool *mp_new_capa(int chuck_size, int init_buf_capa)
{
    MemoryPool *mp = ALLOC(MemoryPool);
    mp->chunk_size = chuck_size;
    mp->buf_capa = init_buf_capa;
    mp->buffers = ALLOC_N(char *, init_buf_capa);

    mp->buffers[0] = mp->curr_buffer = (char *)emalloc(mp->chunk_size);
    mp->buf_alloc = 1;
    mp->buf_pointer = 0;
    mp->pointer = 0;
    return mp;
}

MemoryPool *mp_new()
{
    return mp_new_capa(MP_BUF_SIZE, MP_INIT_CAPA);
}

INLINE void *mp_alloc(MemoryPool *mp, int size)
{
    char *p;
    p = mp->curr_buffer + mp->pointer;
#if defined POSH_OS_SOLARIS || defined POSH_OS_SUNOS
    size = (((size - 1) >> 3) + 1) << 3;
#endif
    mp->pointer += size;

    if (mp->pointer > mp->chunk_size) {
        mp->buf_pointer++;
        if (mp->buf_pointer >= mp->buf_alloc) {
            mp->buf_alloc++;
            if (mp->buf_alloc >= mp->buf_capa) {
                mp->buf_capa <<= 1;
                REALLOC_N(mp->buffers, char *, mp->buf_capa);
            }
            mp->buffers[mp->buf_pointer] = (char *)emalloc(mp->chunk_size);
        }
        p = mp->curr_buffer = mp->buffers[mp->buf_pointer];
        mp->pointer = size;
    }
    return p;
}

char *mp_strdup(MemoryPool *mp, const char *str)
{
    int len = strlen(str) + 1;
    return (char *)memcpy(mp_alloc(mp, len), str, len);
}

char *mp_strndup(MemoryPool *mp, const char *str, int len)
{
    char *s = (char *)memcpy(mp_alloc(mp, len + 1), str, len);
    s[len] = '\0';
    return s;
}

void *mp_memdup(MemoryPool *mp, const void *p, int len)
{
    return memcpy(mp_alloc(mp, len), p, len);
}

int mp_used(MemoryPool *mp)
{
    return mp->buf_pointer * mp->chunk_size + mp->pointer;
}

void mp_reset(MemoryPool *mp)
{
    mp->buf_pointer = 0;
    mp->pointer = 0;
    mp->curr_buffer = mp->buffers[0];
}

void mp_destroy(MemoryPool *mp)
{
    int i;
    for (i = 0; i < mp->buf_alloc; i++) {
        free(mp->buffers[i]);
    }
    free(mp->buffers);
    free(mp);
}