From: Lukasz Pawelczyk Date: Tue, 21 Nov 2017 13:26:32 +0000 (+0100) Subject: Fix mutex being unlocked by a different thread that locked it X-Git-Tag: submit/tizen/20171201.152910~19 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9663c37625780ce3fd175a53e7deabcff0f960c3;p=platform%2Fcore%2Fsecurity%2Fode.git Fix mutex being unlocked by a different thread that locked it Change-Id: I35a4a4a72eb8d14ac561c6a819c92f12979a9b15 --- diff --git a/tools/cli/ode-admin-cli.cpp b/tools/cli/ode-admin-cli.cpp index 424d78c..8227d2b 100644 --- a/tools/cli/ode-admin-cli.cpp +++ b/tools/cli/ode-admin-cli.cpp @@ -37,6 +37,9 @@ extern char** environ; +std::mutex mtx; +bool mountFlag = false; + static inline int usage(const std::string name) { std::cout << "Usage: " << name << " [Option]" << std::endl @@ -524,22 +527,24 @@ static inline int get_state(const std::string name) } static void mount_event_cb(void *user_data) { - std::mutex *pMtx = (std::mutex*)user_data; - pMtx->unlock(); + std::unique_lock lock(mtx); + std::condition_variable *pCond = (std::condition_variable*)user_data; + mountFlag = true; + pCond->notify_one(); } static inline int wait_for_mount(const std::string name) { int ret; - std::mutex mtx; - mtx.lock(); + std::unique_lock lock(mtx); + std::condition_variable cond; if (name == "internal") { std::cout << "Wait for internal storage mount..." << std::endl; - ret = ode_internal_encryption_set_mount_event_cb(mount_event_cb, &mtx); + ret = ode_internal_encryption_set_mount_event_cb(mount_event_cb, &cond); } else if (name == "external") { std::cout << "Wait for external storage mount..." << std::endl; - ret = ode_external_encryption_set_mount_event_cb(mount_event_cb, &mtx); + ret = ode_external_encryption_set_mount_event_cb(mount_event_cb, &cond); } else { printSelectableStorage(); return -1; @@ -550,8 +555,9 @@ static inline int wait_for_mount(const std::string name) return -1; } - mtx.lock(); + cond.wait(lock, []{return mountFlag;}); std::cout << "Mount is completed"<< std::endl; + mountFlag = false; return ret; }