blob: d14690739937c5103a43866fea91ba693837c83d [file] [log] [blame]
Enrico Granata5f9d3102015-08-27 21:33:50 +00001//===-- Language.cpp -------------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include <functional>
11#include <map>
Enrico Granata2996d822015-08-27 22:14:06 +000012#include <mutex>
Enrico Granata5f9d3102015-08-27 21:33:50 +000013
14#include "lldb/Target/Language.h"
15
16#include "lldb/Host/Mutex.h"
17#include "lldb/Core/PluginManager.h"
18
19using namespace lldb;
20using namespace lldb_private;
21
22typedef std::unique_ptr<Language> LanguageUP;
23typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
24
25static LanguagesMap&
26GetLanguagesMap ()
27{
28 static LanguagesMap *g_map = nullptr;
29 static std::once_flag g_initialize;
30
31 std::call_once(g_initialize, [] {
32 g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global destructor chain
33 });
34
35 return *g_map;
36}
37static Mutex&
38GetLanguagesMutex ()
39{
40 static Mutex *g_mutex = nullptr;
41 static std::once_flag g_initialize;
42
43 std::call_once(g_initialize, [] {
44 g_mutex = new Mutex(); // NOTE: INTENTIONAL LEAK due to global destructor chain
45 });
46
47 return *g_mutex;
48}
49
50Language*
51Language::FindPlugin (lldb::LanguageType language)
52{
53 Mutex::Locker locker(GetLanguagesMutex());
54 LanguagesMap& map(GetLanguagesMap());
55 auto iter = map.find(language), end = map.end();
56 if (iter != end)
57 return iter->second.get();
58
59 Language *language_ptr = nullptr;
60 LanguageCreateInstance create_callback;
61
62 for (uint32_t idx = 0;
63 (create_callback = PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
64 ++idx)
65 {
66 language_ptr = create_callback(language);
67
68 if (language_ptr)
69 {
70 map[language] = std::unique_ptr<Language>(language_ptr);
71 return language_ptr;
72 }
73 }
74
75 return nullptr;
76}
77
78void
79Language::ForEach (std::function<bool(Language*)> callback)
80{
81 Mutex::Locker locker(GetLanguagesMutex());
82 LanguagesMap& map(GetLanguagesMap());
83 for (const auto& entry : map)
84 {
85 if (!callback(entry.second.get()))
86 break;
87 }
88}
89
90//----------------------------------------------------------------------
91// Constructor
92//----------------------------------------------------------------------
93Language::Language()
94{
95}
96
97//----------------------------------------------------------------------
98// Destructor
99//----------------------------------------------------------------------
100Language::~Language()
101{
102}