1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CRAZY_LINKER_GLOBALS_H 6 #define CRAZY_LINKER_GLOBALS_H 7 8 #include <pthread.h> 9 10 #include "crazy_linker_library_list.h" 11 #include "crazy_linker_rdebug.h" 12 #include "crazy_linker_search_path_list.h" 13 #include "crazy_linker_util.h" 14 15 // All crazy linker globals are declared in this header. 16 17 namespace crazy { 18 19 class Globals { 20 public: 21 Globals(); 22 ~Globals(); 23 Lock()24 void Lock() { pthread_mutex_lock(&lock_); } 25 Unlock()26 void Unlock() { pthread_mutex_unlock(&lock_); } 27 28 static Globals* Get(); 29 GetLibraries()30 static LibraryList* GetLibraries() { return &Get()->libraries_; } 31 GetSearchPaths()32 static SearchPathList* GetSearchPaths() { return &Get()->search_paths_; } 33 GetRDebug()34 static RDebug* GetRDebug() { return &Get()->rdebug_; } 35 36 private: 37 pthread_mutex_t lock_; 38 LibraryList libraries_; 39 SearchPathList search_paths_; 40 RDebug rdebug_; 41 }; 42 43 // Helper class to access the globals with scoped locking. 44 class ScopedGlobalLock { 45 public: ScopedGlobalLock()46 ScopedGlobalLock() { Globals::Get()->Lock(); } 47 ~ScopedGlobalLock()48 ~ScopedGlobalLock() { Globals::Get()->Unlock(); } 49 }; 50 51 } // namespace crazy 52 53 #endif // CRAZY_LINKER_GLOBALS_H 54