diff options
| author | Szczepan Zalega <szczepan@nitrokey.com> | 2017-01-31 18:10:59 +0100 | 
|---|---|---|
| committer | Szczepan Zalega <szczepan@nitrokey.com> | 2017-03-11 15:41:40 +0100 | 
| commit | cb6b2dd65e1f0132353159b83ae05c944d8e62f0 (patch) | |
| tree | ba7f8a91390f15f03a4f90c93ecd45f9e7ae3749 | |
| parent | aa668f74e95617fd0544327a2b57bf654a6f9a2d (diff) | |
| download | libnitrokey-cb6b2dd65e1f0132353159b83ae05c944d8e62f0.tar.gz libnitrokey-cb6b2dd65e1f0132353159b83ae05c944d8e62f0.tar.bz2 | |
Make disconnect thread safe. Check is device actually connected by invoking its checking method
Signed-off-by: Szczepan Zalega <szczepan@nitrokey.com>
| -rw-r--r-- | NitrokeyManager.cc | 32 | ||||
| -rw-r--r-- | include/NitrokeyManager.h | 3 | 
2 files changed, 26 insertions, 9 deletions
| diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index ee7ca92..3213417 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -100,16 +100,32 @@ namespace nitrokey{      bool NitrokeyManager::disconnect() {        std::lock_guard<std::mutex> lock(mex_dev_com); -      if (!is_connected()){ -        return false; -      } -      const auto res = device->disconnect(); -      device = nullptr; -      return res; +      return _disconnect_no_lock();      } -    bool NitrokeyManager::is_connected() const throw(){ -      return device != nullptr; +  bool NitrokeyManager::_disconnect_no_lock() { +    //do not use directly without locked mutex, +    //used by is_connected, disconnect +    if (device == nullptr){ +      return false; +    } +    const auto res = device->disconnect(); +    device = nullptr; +    return res; +  } + +  bool NitrokeyManager::is_connected() throw(){ +      std::lock_guard<std::mutex> lock(mex_dev_com); +      if(device != nullptr){ +        auto connected = device->is_connected(); +        if(connected){ +          return true; +        } else { +          _disconnect_no_lock(); +          return false; +        } +      } +      return false;      }      void NitrokeyManager::set_debug(bool state) { diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h index 3e38cc3..4a98e94 100644 --- a/include/NitrokeyManager.h +++ b/include/NitrokeyManager.h @@ -43,7 +43,7 @@ namespace nitrokey {          bool connect(const char *device_model);          bool connect();          bool disconnect(); -        bool is_connected() const throw() ; +        bool is_connected() throw() ;          DeviceModel get_connected_device_model() const;            void set_debug(bool state);          stick10::GetStatus::ResponsePayload get_status(); @@ -156,6 +156,7 @@ namespace nitrokey {                                           bool use_8_digits, bool use_enter, bool use_tokenID, const char *token_ID,                                           const char *temporary_password) const; +      bool _disconnect_no_lock();      };  } | 
