FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
daScript/src/misc/free_list.cpp at master · WhyNot135/daScript · GitHub
WhyNot135
/
daScript
Public
forked from
GaijinEntertainment/daScript
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
daScript
/
src
/
misc
/
free_list.cpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
159 lines (125 loc) · 3.81 KB
Breadcrumbs
daScript
/
src
/
misc
/
free_list.cpp
Copy path
File metadata and controls
159 lines (125 loc) · 3.81 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#
include
"
daScript/misc/platform.h
"
#
include
"
daScript/misc/free_list.h
"
#
if
DAS_FREE_LIST
namespace
das
{
struct
ReuseChunk
{
ReuseChunk * next;
};
struct
ReuseCache
{
ReuseChunk * hold[
DAS_MAX_BUCKET_COUNT
];
};
DAS_THREAD_LOCAL
(ReuseCache *) tlsReuseCache;
DAS_THREAD_LOCAL
(
uint32_t
) tlsReuseCacheCount;
void
reuse_cache_push
() {
if
( *tlsReuseCacheCount==
0
)
reuse_cache_create
();
(*tlsReuseCacheCount) ++;
}
void
reuse_cache_pop
() {
(*tlsReuseCacheCount) --;
if
( *tlsReuseCacheCount==
0
)
reuse_cache_destroy
();
}
void
*
reuse_cache_allocate
(
size_t
size ) {
if
( size==
0
)
return
nullptr
;
size = (size+
15
) & ~
15
;
if
( size<=
DAS_MAX_REUSE_SIZE
&& *tlsReuseCache ) {
auto
bucket = (size >>
4
) -
1
;
auto
& hold = (*tlsReuseCache)->
hold
[bucket];
if
( hold ) {
void
* data = hold;
hold = hold->
next
;
return
data;
}
else
{
return
das_aligned_alloc16
(size);
}
}
else
{
return
das_aligned_alloc16
(size);
}
}
#
if
defined(__SANITIZE_ADDRESS__) || defined(__SANITIZER_ADDRESS__)
#
include
<
sanitizer/asan_interface.h
>
#
endif
void
reuse_cache_free
(
void
* ptr,
size_t
size ) {
size = (size+
15
) & ~
15
;
if
( size<=
DAS_MAX_REUSE_SIZE
&& *tlsReuseCache ) {
auto
bucket = (size >>
4
) -
1
;
auto
& hold = (*tlsReuseCache)->
hold
[bucket];
auto
next = hold;
//
Asan treats `ptr` as already freed, however we reuse it as a node in linked list.
//
Let's unpoison it to make asan work.
#
if
defined(__SANITIZE_ADDRESS__) || defined(__SANITIZER_ADDRESS__)
ASAN_UNPOISON_MEMORY_REGION
(ptr, size);
#
endif
hold = (ReuseChunk *) ptr;
hold->
next
= next;
}
else
{
return
das_aligned_free16
(ptr);
}
}
void
reuse_cache_free
(
void
* ptr ) {
return
reuse_cache_free
(ptr,
das_aligned_memsize
(ptr));
}
void
reuse_cache_create
() {
if
( !*tlsReuseCache ) {
*tlsReuseCache = (ReuseCache *)
das_aligned_alloc16
(
sizeof
(ReuseCache));
memset
(*tlsReuseCache,
0
,
sizeof
(ReuseCache));
}
}
void
reuse_cache_clear
() {
if
( *tlsReuseCache ) {
for
(
size_t
bucket=
0
; bucket!=
DAS_MAX_BUCKET_COUNT
; ++bucket ) {
ReuseChunk * & hold = (*tlsReuseCache)->
hold
[bucket];
while
( hold ) {
auto
ptr = hold;
hold = hold->
next
;
das_aligned_free16
(ptr);
}
}
}
}
void
reuse_cache_destroy
() {
if
( *tlsReuseCache ) {
reuse_cache_clear
();
das_aligned_free16
(*tlsReuseCache);
*tlsReuseCache =
nullptr
;
}
}
}
//
Note: DAS_ENABLE_DLL -- Temporary disable ReuseAllocator in shared lib mode,
//
until pointers ownership won't be passed between main library and modules.
//
We allocate pointers with ReuseAllocator and free them using regular one.
#
if
(defined(__linux__) || DAS_ENABLE_DLL) && !defined(DAS_NO_GLOBAL_NEW_AND_DELETE)
#
define
DAS_NO_GLOBAL_NEW_AND_DELETE
#
endif
#
if
!defined(DAS_NO_GLOBAL_NEW_AND_DELETE)
void
*
operator
new
(
size_t
size ) {
return
das::reuse_cache_allocate
(size);
}
void
*
operator
new
[] (
size_t
size ) {
return
das::reuse_cache_allocate
(size);
}
#
ifdef
__APPLE__
void
operator
delete
(
void
* data ) _NOEXCEPT {
if
( data )
das::reuse_cache_free
(data);
}
void
operator
delete[]
(
void
* data ) _NOEXCEPT {
if
( data )
das::reuse_cache_free
(data);
}
#
else
void
operator
delete
(
void
* data ) {
if
( data )
das::reuse_cache_free
(data);
}
void
operator
delete[]
(
void
* data ) {
if
( data )
das::reuse_cache_free
(data);
}
#
endif
#
endif
#
else
namespace
das
{
void
reuse_cache_push
() {}
void
reuse_cache_pop
() {}
}
#
endif
namespace
das
{
ReuseCacheGuard::ReuseCacheGuard
() {
reuse_cache_push
(); }
ReuseCacheGuard::~ReuseCacheGuard
() {
reuse_cache_pop
(); }
}
Back
|
FazBrowse Home
|
New Git URL