return dashdash;
}
+static std::mutex g_str_vec_lock;
+static vector<string> g_str_vec;
+
+void clear_g_str_vec()
+{
+ g_str_vec_lock.lock();
+ g_str_vec.clear();
+ g_str_vec_lock.unlock();
+}
+
void env_to_vec(std::vector<const char*>& args, const char *name)
{
if (!name)
name = "CEPH_ARGS";
- char *p = getenv(name);
- if (!p)
- return;
bool dashdash = false;
std::vector<const char*> options;
std::vector<const char*> env_arguments;
std::vector<const char*> env;
- static std::mutex str_vec_lock;
- static vector<string> str_vec;
-
/*
* We can only populate str_vec once. Other threads could hold pointers into
* it, so clearing it out and replacing it is not currently safe.
*/
- str_vec_lock.lock();
- if (str_vec.empty())
- get_str_vec(p, " ", str_vec);
- str_vec_lock.unlock();
-
- for (vector<string>::iterator i = str_vec.begin();
- i != str_vec.end();
- ++i)
+ g_str_vec_lock.lock();
+ if (g_str_vec.empty()) {
+ char *p = getenv(name);
+ if (!p) {
+ g_str_vec_lock.unlock();
+ return;
+ }
+ get_str_vec(p, " ", g_str_vec);
+ }
+ g_str_vec_lock.unlock();
+
+ vector<string>::iterator i;
+ for (i = g_str_vec.begin(); i != g_str_vec.end(); ++i)
env.push_back(i->c_str());
if (split_dashdash(env, env_options, env_arguments))
dashdash = true;
std::vector<const char*> args;
unsetenv("CEPH_ARGS");
unsetenv("WHATEVER");
+ clear_g_str_vec();
env_to_vec(args);
EXPECT_EQ(0u, args.size());
+ clear_g_str_vec();
env_to_vec(args, "WHATEVER");
EXPECT_EQ(0u, args.size());
args.push_back("a");
setenv("CEPH_ARGS", "b c", 0);
+ clear_g_str_vec();
env_to_vec(args);
EXPECT_EQ(3u, args.size());
EXPECT_EQ(string("b"), args[1]);
EXPECT_EQ(string("c"), args[2]);
setenv("WHATEVER", "d e", 0);
+ clear_g_str_vec();
env_to_vec(args, "WHATEVER");
EXPECT_EQ(5u, args.size());
EXPECT_EQ(string("d"), args[3]);
args.push_back("--");
args.push_back("c");
setenv("CEPH_ARGS", "b -- d", 0);
+ clear_g_str_vec();
env_to_vec(args);
EXPECT_EQ(5u, args.size());
EXPECT_EQ(string("a"), args[0]);
args.push_back("a");
args.push_back("--");
setenv("CEPH_ARGS", "b -- c", 0);
+ clear_g_str_vec();
env_to_vec(args);
EXPECT_EQ(4u, args.size());
EXPECT_EQ(string("a"), args[0]);
args.push_back("--");
args.push_back("c");
setenv("CEPH_ARGS", "b -- d", 0);
+ clear_g_str_vec();
env_to_vec(args);
EXPECT_EQ(4u, args.size());
EXPECT_EQ(string("b"), args[0]);
unsetenv("CEPH_ARGS");
args.push_back("b");
setenv("CEPH_ARGS", "c -- d", 0);
+ clear_g_str_vec();
env_to_vec(args);
EXPECT_EQ(4u, args.size());
EXPECT_EQ(string("b"), args[0]);
args.push_back("--");
args.push_back("c");
setenv("CEPH_ARGS", "-- d", 0);
+ clear_g_str_vec();
env_to_vec(args);
EXPECT_EQ(4u, args.size());
EXPECT_EQ(string("a"), args[0]);
args.push_back("--");
args.push_back("c");
setenv("CEPH_ARGS", "d", 0);
+ clear_g_str_vec();
env_to_vec(args);
EXPECT_EQ(4u, args.size());
EXPECT_EQ(string("a"), args[0]);