blob: dd80f7c9200762e7ed5435c53d0ec9fcad80b6f8 [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
Enrico Granata980c0482015-09-01 18:22:39 +000090lldb::TypeCategoryImplSP
91Language::GetFormatters ()
92{
93 return nullptr;
94}
95
Enrico Granata5f9d3102015-08-27 21:33:50 +000096//----------------------------------------------------------------------
97// Constructor
98//----------------------------------------------------------------------
99Language::Language()
100{
101}
102
103//----------------------------------------------------------------------
104// Destructor
105//----------------------------------------------------------------------
106Language::~Language()
107{
108}