311
|
1 module qt.Memory;
|
|
2
|
|
3 import
|
|
4 core.exception,
|
|
5 core.memory,
|
|
6 core.stdc.stdlib;
|
|
7
|
|
8 alias void delegate(Object) DEvent;
|
|
9 extern(C) void rt_attachDisposeEvent(Object o, DEvent e);
|
|
10 extern(C) void rt_detachDisposeEvent(Object o, DEvent e);
|
|
11 extern(C) Object _d_toObject(void* p);
|
|
12
|
|
13 /**
|
|
14 Object stack.
|
|
15 */
|
|
16 final class StackAlloc
|
|
17 {
|
|
18 alias typeof(this) This;
|
|
19 private void* _data;
|
|
20
|
|
21 private static size_t align16(size_t size)
|
|
22 {
|
|
23 return size + 16 - (size - size & ~15);
|
|
24 }
|
|
25
|
|
26 /**
|
|
27 */
|
|
28 this(size_t size)
|
|
29 {
|
|
30 _data = (new void[size]).ptr;
|
|
31 }
|
|
32
|
|
33 /**
|
|
34 */
|
|
35 void* alloc(size_t size)
|
|
36 {
|
|
37 void* res = _data;
|
|
38 _data += align16(size);
|
|
39 return res;
|
|
40 }
|
|
41
|
|
42 /**
|
|
43 */
|
|
44 void free(size_t size)
|
|
45 {
|
|
46 _data -= align16(size);
|
|
47 }
|
|
48 }
|
|
49
|
|
50 /**
|
|
51 Size of the object stack.
|
|
52 */
|
|
53 enum stackSize = 1024 * 1024;
|
|
54
|
|
55 /**
|
|
56 Returns the object stack for the current thread.
|
|
57 */
|
|
58 StackAlloc stackAlloc()
|
|
59 {
|
|
60 static StackAlloc stackAlloc;
|
|
61 if (!stackAlloc)
|
|
62 stackAlloc = new StackAlloc(stackSize);
|
|
63 return stackAlloc;
|
|
64 }
|
|
65
|
|
66 /**
|
|
67 C heap allocator.
|
|
68 */
|
|
69 struct CAlloc
|
|
70 {
|
|
71 /**
|
|
72 */
|
|
73 static void* alloc(size_t size, uint flags = 0)
|
|
74 {
|
|
75 auto p = malloc(size);
|
|
76 if (!p)
|
|
77 onOutOfMemoryError;
|
|
78 return p;
|
|
79 }
|
|
80
|
|
81 /**
|
|
82 */
|
|
83 static void* realloc(void* addr, size_t size)
|
|
84 {
|
|
85 auto p = realloc(addr, size);
|
|
86 if (!p)
|
|
87 onOutOfMemoryError;
|
|
88 return p;
|
|
89 }
|
|
90
|
|
91 /**
|
|
92 */
|
|
93 static void free(void* p, size_t size = 0)
|
|
94 {
|
|
95 free(p);
|
|
96 }
|
|
97 }
|
|
98
|
|
99 /**
|
|
100 GC heap allocator.
|
|
101 */
|
|
102 struct GCAlloc
|
|
103 {
|
|
104 static void* alloc(size_t size, uint flags = 0)
|
|
105 {
|
|
106 return GC.malloc(size, flags);
|
|
107 }
|
|
108
|
|
109 static void* realloc(void* addr, size_t size)
|
|
110 {
|
|
111 return GC.realloc(addr, size);
|
|
112 }
|
|
113
|
|
114 static void free(void* addr, size_t size = 0)
|
|
115 {
|
|
116 GC.free(addr);
|
|
117 }
|
|
118 } |