@@ -42,15 +42,13 @@ typedef IntrusiveList<GlobalListNode> ListOfGlobals;
42
42
static Mutex mu_for_globals;
43
43
static ListOfGlobals list_of_all_globals SANITIZER_GUARDED_BY (mu_for_globals);
44
44
45
- static const int kDynamicInitGlobalsInitialCapacity = 512 ;
46
45
struct DynInitGlobal {
47
- Global g;
48
- bool initialized;
46
+ Global g = {};
47
+ bool initialized = false ;
48
+ DynInitGlobal *next = nullptr ;
49
49
};
50
- typedef InternalMmapVector<DynInitGlobal> VectorOfGlobals;
51
- // Lazy-initialized and never deleted.
52
- static VectorOfGlobals *dynamic_init_globals
53
- SANITIZER_GUARDED_BY (mu_for_globals);
50
+ typedef IntrusiveList<DynInitGlobal> DynInitGlobals;
51
+ static DynInitGlobals dynamic_init_globals SANITIZER_GUARDED_BY (mu_for_globals);
54
52
55
53
// We want to remember where a certain range of globals was registered.
56
54
struct GlobalRegistrationSite {
@@ -259,12 +257,8 @@ static void RegisterGlobal(const Global *g) SANITIZER_REQUIRES(mu_for_globals) {
259
257
AddGlobalToList (list_of_all_globals, g);
260
258
261
259
if (g->has_dynamic_init ) {
262
- if (!dynamic_init_globals) {
263
- dynamic_init_globals = new (GetGlobalLowLevelAllocator ()) VectorOfGlobals;
264
- dynamic_init_globals->reserve (kDynamicInitGlobalsInitialCapacity );
265
- }
266
- DynInitGlobal dyn_global = { *g, false };
267
- dynamic_init_globals->push_back (dyn_global);
260
+ dynamic_init_globals.push_back (new (GetGlobalLowLevelAllocator ())
261
+ DynInitGlobal{*g, false });
268
262
}
269
263
}
270
264
@@ -294,11 +288,8 @@ void StopInitOrderChecking() {
294
288
if (!flags ()->check_initialization_order )
295
289
return ;
296
290
Lock lock (&mu_for_globals);
297
- if (!dynamic_init_globals)
298
- return ;
299
291
flags ()->check_initialization_order = false ;
300
- for (uptr i = 0 , n = dynamic_init_globals->size (); i < n; ++i) {
301
- DynInitGlobal &dyn_g = (*dynamic_init_globals)[i];
292
+ for (const DynInitGlobal &dyn_g : dynamic_init_globals) {
302
293
const Global *g = &dyn_g.g ;
303
294
// Unpoison the whole global.
304
295
PoisonShadowForGlobal (g, 0 );
@@ -465,12 +456,9 @@ void __asan_before_dynamic_init(const char *module_name) {
465
456
CHECK (module_name);
466
457
CHECK (AsanInited ());
467
458
Lock lock (&mu_for_globals);
468
- if (!dynamic_init_globals)
469
- return ;
470
459
if (flags ()->report_globals >= 3 )
471
460
Printf (" DynInitPoison module: %s\n " , module_name);
472
- for (uptr i = 0 , n = dynamic_init_globals->size (); i < n; ++i) {
473
- DynInitGlobal &dyn_g = (*dynamic_init_globals)[i];
461
+ for (DynInitGlobal &dyn_g : dynamic_init_globals) {
474
462
const Global *g = &dyn_g.g ;
475
463
if (dyn_g.initialized )
476
464
continue ;
@@ -489,11 +477,8 @@ void __asan_after_dynamic_init() {
489
477
return ;
490
478
CHECK (AsanInited ());
491
479
Lock lock (&mu_for_globals);
492
- if (!dynamic_init_globals)
493
- return ;
494
480
// FIXME: Optionally report that we're unpoisoning globals from a module.
495
- for (uptr i = 0 , n = dynamic_init_globals->size (); i < n; ++i) {
496
- DynInitGlobal &dyn_g = (*dynamic_init_globals)[i];
481
+ for (const DynInitGlobal &dyn_g : dynamic_init_globals) {
497
482
const Global *g = &dyn_g.g ;
498
483
if (!dyn_g.initialized ) {
499
484
// Unpoison the whole global.
0 commit comments