@@ -42,15 +42,13 @@ typedef IntrusiveList<GlobalListNode> ListOfGlobals;
4242static Mutex mu_for_globals;
4343static ListOfGlobals list_of_all_globals SANITIZER_GUARDED_BY (mu_for_globals);
4444
45- static const int kDynamicInitGlobalsInitialCapacity = 512 ;
4645struct DynInitGlobal {
47- Global g;
48- bool initialized;
46+ Global g = {};
47+ bool initialized = false ;
48+ DynInitGlobal *next = nullptr ;
4949};
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);
5452
5553// We want to remember where a certain range of globals was registered.
5654struct GlobalRegistrationSite {
@@ -259,12 +257,8 @@ static void RegisterGlobal(const Global *g) SANITIZER_REQUIRES(mu_for_globals) {
259257 AddGlobalToList (list_of_all_globals, g);
260258
261259 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 });
268262 }
269263}
270264
@@ -294,11 +288,8 @@ void StopInitOrderChecking() {
294288 if (!flags ()->check_initialization_order )
295289 return ;
296290 Lock lock (&mu_for_globals);
297- if (!dynamic_init_globals)
298- return ;
299291 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) {
302293 const Global *g = &dyn_g.g ;
303294 // Unpoison the whole global.
304295 PoisonShadowForGlobal (g, 0 );
@@ -465,12 +456,9 @@ void __asan_before_dynamic_init(const char *module_name) {
465456 CHECK (module_name);
466457 CHECK (AsanInited ());
467458 Lock lock (&mu_for_globals);
468- if (!dynamic_init_globals)
469- return ;
470459 if (flags ()->report_globals >= 3 )
471460 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) {
474462 const Global *g = &dyn_g.g ;
475463 if (dyn_g.initialized )
476464 continue ;
@@ -489,11 +477,8 @@ void __asan_after_dynamic_init() {
489477 return ;
490478 CHECK (AsanInited ());
491479 Lock lock (&mu_for_globals);
492- if (!dynamic_init_globals)
493- return ;
494480 // 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) {
497482 const Global *g = &dyn_g.g ;
498483 if (!dyn_g.initialized ) {
499484 // Unpoison the whole global.
0 commit comments