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