From: Jeff Layton Date: Wed, 11 Oct 2017 15:16:38 +0000 (-0400) Subject: common: add a clear_g_str_vec() function to clear g_str_vec X-Git-Tag: v13.0.1~565^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f72ace0a5666db49bb390ff4ec6808e6e55a779f;p=ceph-ci.git common: add a clear_g_str_vec() function to clear g_str_vec 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 --- diff --git a/src/common/ceph_argparse.cc b/src/common/ceph_argparse.cc index 7630d20322e..7a2e8ea9182 100644 --- a/src/common/ceph_argparse.cc +++ b/src/common/ceph_argparse.cc @@ -82,13 +82,20 @@ bool split_dashdash(const std::vector& args, return dashdash; } +static std::mutex g_str_vec_lock; +static vector 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& args, const char *name) { if (!name) name = "CEPH_ARGS"; - char *p = getenv(name); - if (!p) - return; bool dashdash = false; std::vector options; @@ -100,21 +107,23 @@ void env_to_vec(std::vector& args, const char *name) std::vector env_arguments; std::vector env; - static std::mutex str_vec_lock; - static vector 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::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::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; diff --git a/src/common/ceph_argparse.h b/src/common/ceph_argparse.h index 9e33d939b17..900b18f31a7 100644 --- a/src/common/ceph_argparse.h +++ b/src/common/ceph_argparse.h @@ -41,6 +41,7 @@ public: /////////////////////// Functions /////////////////////// extern void string_to_vec(std::vector& args, std::string argstr); +extern void clear_g_str_vec(); extern void env_to_vec(std::vector& args, const char *name=NULL); extern void argv_to_vec(int argc, const char **argv, std::vector& args); diff --git a/src/test/ceph_argparse.cc b/src/test/ceph_argparse.cc index c4f99c8ba11..7ff4e3ca005 100644 --- a/src/test/ceph_argparse.cc +++ b/src/test/ceph_argparse.cc @@ -373,17 +373,21 @@ TEST(CephArgParse, env_to_vec) { std::vector 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]);