summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2015-11-05 00:38:39 +0000
committerJim Ingham <jingham@apple.com>2015-11-05 00:38:39 +0000
commit4d59a2c558b7fffe5dfb37ee2f8a2cfe425717be (patch)
tree510336eba1f73b31962fff50f6b00731c4fe88a7
parent19678b1bef3de9aaa09c678d659d7fcc1e5da9fa (diff)
LLDB needs a mutex around getopt_long_only() function calls to avoid multi-threading option parsing issues.
<rdar://problem/17052381> git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@252111 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/lldb/Host/OptionParser.h3
-rw-r--r--source/Host/common/OptionParser.cpp4
-rw-r--r--source/Interpreter/Args.cpp9
3 files changed, 11 insertions, 5 deletions
diff --git a/include/lldb/Host/OptionParser.h b/include/lldb/Host/OptionParser.h
index 5aa7db5d3..175a1973c 100644
--- a/include/lldb/Host/OptionParser.h
+++ b/include/lldb/Host/OptionParser.h
@@ -11,6 +11,7 @@
#define liblldb_OptionParser_h_
#include <string>
+#include "lldb/Host/Mutex.h"
struct option;
@@ -38,7 +39,7 @@ public:
eOptionalArgument
};
- static void Prepare();
+ static void Prepare(Mutex::Locker &locker);
static void EnableError(bool error);
diff --git a/source/Host/common/OptionParser.cpp b/source/Host/common/OptionParser.cpp
index a91e764bf..a9784592a 100644
--- a/source/Host/common/OptionParser.cpp
+++ b/source/Host/common/OptionParser.cpp
@@ -16,8 +16,10 @@
using namespace lldb_private;
void
-OptionParser::Prepare()
+OptionParser::Prepare(Mutex::Locker &locker)
{
+ static Mutex g_mutex(Mutex::eMutexTypeNormal);
+ locker.Lock(g_mutex);
#ifdef __GLIBC__
optind = 0;
#else
diff --git a/source/Interpreter/Args.cpp b/source/Interpreter/Args.cpp
index 7c9f5c35e..81e6b0aa1 100644
--- a/source/Interpreter/Args.cpp
+++ b/source/Interpreter/Args.cpp
@@ -575,7 +575,8 @@ Args::ParseOptions (Options &options)
}
}
}
- OptionParser::Prepare();
+ Mutex::Locker options_locker(NULL);
+ OptionParser::Prepare(options_locker);
int val;
while (1)
{
@@ -1189,7 +1190,8 @@ Args::ParseAliasOptions (Options &options,
}
}
- OptionParser::Prepare();
+ Mutex::Locker options_locker(NULL);
+ OptionParser::Prepare(options_locker);
int val;
while (1)
{
@@ -1366,7 +1368,8 @@ Args::ParseArgsForCompletion
}
}
- OptionParser::Prepare();
+ Mutex::Locker options_locker(NULL);
+ OptionParser::Prepare(options_locker);
OptionParser::EnableError(false);
int val;