Fix mutex being unlocked by a different thread that locked it 13/161113/2
authorLukasz Pawelczyk <l.pawelczyk@samsung.com>
Tue, 21 Nov 2017 13:26:32 +0000 (14:26 +0100)
committerLukasz Pawelczyk <l.pawelczyk@samsung.com>
Thu, 23 Nov 2017 11:56:00 +0000 (12:56 +0100)
Change-Id: I35a4a4a72eb8d14ac561c6a819c92f12979a9b15

tools/cli/ode-admin-cli.cpp

index 424d78c..8227d2b 100644 (file)
@@ -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<std::mutex> 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<std::mutex> 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;
 }