blob: b7a88d16bdae67a0a9896c2d30a7b187dd31a1dc [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>
12
13#include "lldb/Target/Language.h"
14
15#include "lldb/Host/Mutex.h"
16#include "lldb/Core/PluginManager.h"
17
18using namespace lldb;
19using namespace lldb_private;
20
21typedef std::unique_ptr<Language> LanguageUP;
22typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
23
24static LanguagesMap&
25GetLanguagesMap ()
26{
27 static LanguagesMap *g_map = nullptr;
28 static std::once_flag g_initialize;
29
30 std::call_once(g_initialize, [] {
31 g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global destructor chain
32 });
33
34 return *g_map;
35}
36static Mutex&
37GetLanguagesMutex ()
38{
39 static Mutex *g_mutex = nullptr;
40 static std::once_flag g_initialize;
41
42 std::call_once(g_initialize, [] {
43 g_mutex = new Mutex(); // NOTE: INTENTIONAL LEAK due to global destructor chain
44 });
45
46 return *g_mutex;
47}
48
49Language*
50Language::FindPlugin (lldb::LanguageType language)
51{
52 Mutex::Locker locker(GetLanguagesMutex());
53 LanguagesMap& map(GetLanguagesMap());
54 auto iter = map.find(language), end = map.end();
55 if (iter != end)
56 return iter->second.get();
57
58 Language *language_ptr = nullptr;
59 LanguageCreateInstance create_callback;
60
61 for (uint32_t idx = 0;
62 (create_callback = PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
63 ++idx)
64 {
65 language_ptr = create_callback(language);
66
67 if (language_ptr)
68 {
69 map[language] = std::unique_ptr<Language>(language_ptr);
70 return language_ptr;
71 }
72 }
73
74 return nullptr;
75}
76
77void
78Language::ForEach (std::function<bool(Language*)> callback)
79{
80 Mutex::Locker locker(GetLanguagesMutex());
81 LanguagesMap& map(GetLanguagesMap());
82 for (const auto& entry : map)
83 {
84 if (!callback(entry.second.get()))
85 break;
86 }
87}
88
89//----------------------------------------------------------------------
90// Constructor
91//----------------------------------------------------------------------
92Language::Language()
93{
94}
95
96//----------------------------------------------------------------------
97// Destructor
98//----------------------------------------------------------------------
99Language::~Language()
100{
101}