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