summary refs log tree commit diff
path: root/src/rt/boxed_region.h
blob: 17282d3e5d5da3e9060e1b7ce99e6fc38226d73f (plain)
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
#ifndef BOXED_REGION_H
#define BOXED_REGION_H

#include <stdlib.h>

struct type_desc;
class memory_region;
struct rust_opaque_box;
struct rust_env;

/* Tracks the data allocated by a particular task in the '@' region.
 * Currently still relies on the standard malloc as a backing allocator, but
 * this could be improved someday if necessary. Every allocation must provide
 * a type descr which describes the payload (what follows the header). */
class boxed_region {
private:
    rust_env *env;
    memory_region *backing_region;
    rust_opaque_box *live_allocs;

    size_t align_to(size_t v, size_t align) {
        size_t alignm1 = align - 1;
        v += alignm1;
        v &= ~alignm1;
        return v;
    }

public:
    boxed_region(rust_env *e, memory_region *br)
        : env(e)
        , backing_region(br)
        , live_allocs(NULL)
    {}

    rust_opaque_box *first_live_alloc() { return live_allocs; }

    rust_opaque_box *malloc(type_desc *td, size_t body_size);
    rust_opaque_box *calloc(type_desc *td, size_t body_size);
    void free(rust_opaque_box *box);
};

#endif /* BOXED_REGION_H */

//
// Local Variables:
// mode: C++
// fill-column: 78;
// indent-tabs-mode: nil
// c-basic-offset: 4
// buffer-file-coding-system: utf-8-unix
// End:
//