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