]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: add a clear_g_str_vec() function to clear g_str_vec
authorJeff Layton <jlayton@redhat.com>
Wed, 11 Oct 2017 15:16:38 +0000 (11:16 -0400)
committerJeff Layton <jlayton@redhat.com>
Wed, 11 Oct 2017 15:16:38 +0000 (11:16 -0400)
Prefix str_vec and str_vec_lock with "g_" to make it clear that they are
truly global values. Add a new clear_g_str_vec function to allow it to
be explicitly cleaned out by callers that need that functionality
(mostly testcase for now).

Tracker: http://tracker.ceph.com/issues/21512
Signed-off-by: Jeff Layton <jlayton@redhat.com>
src/common/ceph_argparse.cc
src/common/ceph_argparse.h
src/test/ceph_argparse.cc

index 7630d20322e4d62ed344de81ae15172dbe4a20a5..7a2e8ea918232d449eb23827b6b4988f188bb960 100644 (file)
@@ -82,13 +82,20 @@ bool split_dashdash(const std::vector<const char*>& args,
   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;
@@ -100,21 +107,23 @@ void env_to_vec(std::vector<const char*>& args, const char *name)
   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;
index 9e33d939b17e33efade2642c1dea2ab819e90ea3..900b18f31a797134d544bbfc580a6298a8d1d6cb 100644 (file)
@@ -41,6 +41,7 @@ public:
 
 /////////////////////// Functions ///////////////////////
 extern void string_to_vec(std::vector<std::string>& args, std::string argstr);
+extern void clear_g_str_vec();
 extern void env_to_vec(std::vector<const char*>& args, const char *name=NULL);
 extern void argv_to_vec(int argc, const char **argv,
                  std::vector<const char*>& args);
index c4f99c8ba1123742f9a8db2b6775b153e7ba910f..7ff4e3ca005f271fbef613a431a57568a70f71f0 100644 (file)
@@ -373,17 +373,21 @@ TEST(CephArgParse, env_to_vec) {
     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]);
@@ -396,6 +400,7 @@ TEST(CephArgParse, env_to_vec) {
     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]);
@@ -410,6 +415,7 @@ TEST(CephArgParse, env_to_vec) {
     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]);
@@ -423,6 +429,7 @@ TEST(CephArgParse, env_to_vec) {
     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]);
@@ -435,6 +442,7 @@ TEST(CephArgParse, env_to_vec) {
     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]);
@@ -449,6 +457,7 @@ TEST(CephArgParse, env_to_vec) {
     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]);
@@ -463,6 +472,7 @@ TEST(CephArgParse, env_to_vec) {
     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]);