Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
gc-core.h
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
5/* Authors:
6 * MenTaLguY <mental@rydia.net>
7 *
8 * Copyright (C) 2004 MenTaLguY
9 *
10 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
11 */
12
13#ifndef SEEN_INKSCAPE_GC_CORE_H
14#define SEEN_INKSCAPE_GC_CORE_H
15
16#include <new>
17#include <cstdlib>
18
19# include <gc.h>
20
21namespace Inkscape {
22namespace GC {
23
28
33
34enum Delete {
35 GC
36};
37
38typedef void (*CleanupFunc)(void *mem, void *data);
39
40struct Ops {
41 void (*do_init)();
42 void *(*malloc)(std::size_t size);
43 void *(*malloc_atomic)(std::size_t size);
44 void *(*malloc_uncollectable)(std::size_t size);
45 void *(*malloc_atomic_uncollectable)(std::size_t size);
46 void *(*base)(void *ptr);
48 CleanupFunc func, void *data,
49 CleanupFunc *old_func,
50 void **old_data);
52 void const *base);
53 int (*unregister_disappearing_link)(void **p_ptr);
54 std::size_t (*get_heap_size)();
55 std::size_t (*get_free_bytes)();
56 void (*gcollect)();
57 void (*enable)();
58 void (*disable)();
59 void (*free)(void *ptr);
60};
61
62struct Core {
63public:
64 static void init();
65 static inline void *malloc(std::size_t size) {
66 return _ops.malloc(size);
67 }
68 static inline void *malloc_atomic(std::size_t size) {
69 return _ops.malloc_atomic(size);
70 }
71 static inline void *malloc_uncollectable(std::size_t size) {
73 }
74 static inline void *malloc_atomic_uncollectable(std::size_t size) {
76 }
77 static inline void *base(void *ptr) {
78 return _ops.base(ptr);
79 }
80 static inline void register_finalizer_ignore_self(void *base,
81 CleanupFunc func,
82 void *data,
83 CleanupFunc *old_func,
84 void **old_data)
85 {
87 old_func, old_data);
88 }
89 static inline int general_register_disappearing_link(void **p_ptr,
90 void *base)
91 {
93 }
94 static inline int unregister_disappearing_link(void **p_ptr) {
96 }
97 static inline std::size_t get_heap_size() {
98 return _ops.get_heap_size();
99 }
100 static inline std::size_t get_free_bytes() {
101 return _ops.get_free_bytes();
102 }
103 static inline void gcollect() {
104 _ops.gcollect();
105 }
106 static inline void enable() {
107 _ops.enable();
108 }
109 static inline void disable() {
110 _ops.disable();
111 }
112 static inline void free(void *ptr) {
113 return _ops.free(ptr);
114 }
115private:
116 static Ops _ops;
117};
118
119inline void init() {
120 Core::init();
121}
122
124
125}
126}
127
128inline void *operator new(std::size_t size,
131 Inkscape::GC::CleanupFunc cleanup=nullptr,
132 void *data=nullptr)
133{
134 using namespace Inkscape::GC;
135
136 void *mem;
137 if ( collect == AUTO ) {
138 if ( scan == SCANNED ) {
139 mem = Core::malloc(size);
140 } else {
141 mem = Core::malloc_atomic(size);
142 }
143 } else {
144 if ( scan == SCANNED ) {
145 mem = Core::malloc_uncollectable(size);
146 } else {
147 mem = Core::malloc_atomic_uncollectable(size);
148 }
149 }
150 if (!mem) {
151 throw std::bad_alloc();
152 }
153 if (cleanup) {
154 Core::register_finalizer_ignore_self(mem, cleanup, data, nullptr, nullptr);
155 }
156 return mem;
157}
158
159inline void *operator new(std::size_t size,
161 Inkscape::GC::CleanupFunc cleanup=nullptr,
162 void *data=nullptr)
163{
164 return operator new(size, scan, Inkscape::GC::AUTO, cleanup, data);
165}
166
167inline void *operator new[](std::size_t size,
170 Inkscape::GC::CleanupFunc cleanup=nullptr,
171 void *data=nullptr)
172{
173 return operator new(size, scan, collect, cleanup, data);
174}
175
176inline void *operator new[](std::size_t size,
178 Inkscape::GC::CleanupFunc cleanup=nullptr,
179 void *data=nullptr)
180{
181 return operator new[](size, scan, Inkscape::GC::AUTO, cleanup, data);
182}
183
184inline void operator delete(void *mem, Inkscape::GC::Delete) {
186}
187
188inline void operator delete[](void *mem, Inkscape::GC::Delete) {
189 operator delete(mem, Inkscape::GC::GC);
190}
191
192#endif
193/*
194 Local Variables:
195 mode:c++
196 c-file-style:"stroustrup"
197 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
198 indent-tabs-mode:nil
199 fill-column:99
200 End:
201*/
202// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
Geom::IntPoint size
Boehm-GC based garbage collector.
void init()
Definition gc-core.h:119
void(* CleanupFunc)(void *mem, void *data)
Definition gc-core.h:38
void request_early_collection()
Definition gc.cpp:294
Helper class to stream background task notifications as a series of messages.
static const Point data[]
static std::size_t get_free_bytes()
Definition gc-core.h:100
static int unregister_disappearing_link(void **p_ptr)
Definition gc-core.h:94
static void gcollect()
Definition gc-core.h:103
static void enable()
Definition gc-core.h:106
static void * base(void *ptr)
Definition gc-core.h:77
static void * malloc_uncollectable(std::size_t size)
Definition gc-core.h:71
static int general_register_disappearing_link(void **p_ptr, void *base)
Definition gc-core.h:89
static std::size_t get_heap_size()
Definition gc-core.h:97
static void * malloc(std::size_t size)
Definition gc-core.h:65
static Ops _ops
Definition gc-core.h:116
static void * malloc_atomic_uncollectable(std::size_t size)
Definition gc-core.h:74
static void register_finalizer_ignore_self(void *base, CleanupFunc func, void *data, CleanupFunc *old_func, void **old_data)
Definition gc-core.h:80
static void init()
Definition gc.cpp:270
static void free(void *ptr)
Definition gc-core.h:112
static void disable()
Definition gc-core.h:109
static void * malloc_atomic(std::size_t size)
Definition gc-core.h:68
int(* general_register_disappearing_link)(void **p_ptr, void const *base)
Definition gc-core.h:51
void *(* malloc)(std::size_t size)
Definition gc-core.h:42
void(* enable)()
Definition gc-core.h:57
std::size_t(* get_free_bytes)()
Definition gc-core.h:55
void(* gcollect)()
Definition gc-core.h:56
int(* unregister_disappearing_link)(void **p_ptr)
Definition gc-core.h:53
void *(* malloc_atomic)(std::size_t size)
Definition gc-core.h:43
void(* register_finalizer_ignore_self)(void *base, CleanupFunc func, void *data, CleanupFunc *old_func, void **old_data)
Definition gc-core.h:47
void(* disable)()
Definition gc-core.h:58
void(* free)(void *ptr)
Definition gc-core.h:59
std::size_t(* get_heap_size)()
Definition gc-core.h:54
void *(* base)(void *ptr)
Definition gc-core.h:46
void *(* malloc_atomic_uncollectable)(std::size_t size)
Definition gc-core.h:45
void(* do_init)()
Definition gc-core.h:41
void *(* malloc_uncollectable)(std::size_t size)
Definition gc-core.h:44