aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/memory.h
blob: 7b1591dbc8085a42b0a3bd7d744903c66a4d02db (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
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
/*
 * Copyright (C) 2012-2017 Robin Haberkorn
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef __MEMORY_H
#define __MEMORY_H

#include <glib.h>

/**
 * Default memory limit (500mb, assuming SI units).
 */
#define MEMORY_LIMIT_DEFAULT (500*1000*1000)

namespace SciTECO {

/**
 * Common base class for all objects in SciTECO.
 * This is currently only used to provide custom new/delete
 * replacements in order to support unified allocation via
 * Glib (g_malloc and g_slice) and as a memory usage
 * counting fallback.
 *
 * This approach has certain drawbacks, e.g. you cannot
 * derive from Object privately; nor is it possible to
 * influence allocations in other libraries or even of
 * scalars (e.g. new char[5]).
 *
 * C++14 (supported by GCC >= 5) has global sized delete
 * replacements which would be effective in the entire application
 * but we're still using the base-class approach since
 * we must support the older compilers anyway.
 */
class Object {
public:
	static void *operator new(size_t size) noexcept;
	static inline void *
	operator new[](size_t size) noexcept
	{
		return operator new(size);
	}
	static inline void *
	operator new(size_t size, void *ptr) noexcept
	{
		return ptr;
	}

	static void operator delete(void *ptr, size_t size) noexcept;
	static inline void
	operator delete[](void *ptr, size_t size) noexcept
	{
		operator delete(ptr, size);
	}
};

extern class MemoryLimit : public Object {
public:
	/**
	 * Undo stack memory limit in bytes.
	 * 0 means no limiting.
	 */
	gsize limit;

	MemoryLimit() : limit(MEMORY_LIMIT_DEFAULT) {}

	gsize get_usage(void);

	void set_limit(gsize new_limit = 0);

	void check(void);
} memlimit;

} /* namespace SciTECO */

#endif