[FIX] Remove static variables in device existence check
authorDongju Chae <dongju.chae@samsung.com>
Tue, 11 Jan 2022 09:31:45 +0000 (18:31 +0900)
committer채동주/NPU Lab(SR)/Staff Engineer/삼성전자 <dongju.chae@samsung.com>
Wed, 12 Jan 2022 01:29:38 +0000 (10:29 +0900)
This patch removes static variables when checking the number
of available devices. It possibly makes some race conditions.

Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
src/core/npu/NPUdrvAPI.h
src/core/npu/NPUdrvAPI_triv2.cc

index 36161f5..7d87129 100644 (file)
@@ -122,7 +122,7 @@ class CuseElement;
 /** @brief Driver APIs for TRIV2 */
 class TrinityVision2API : public DriverAPI {
  public:
-  static int getNumDevices ();
+  static int getNumDevices (std::bitset<CHAR_BIT> *bitset = nullptr);
   TrinityVision2API (int dev_id);
   ~TrinityVision2API ();
 
@@ -162,7 +162,6 @@ class TrinityVision2API : public DriverAPI {
  private:
   int getDrvVersion () const;
   static const std::string dev_node_base;
-  static std::bitset<CHAR_BIT> dev_bitset;
 
 #ifdef ENABLE_CUSE
   static ThreadSafeMap<int, CuseElement> cuse_map;
index 5901631..354f4da 100644 (file)
@@ -38,7 +38,6 @@ constexpr int max_num_devs = 8;
 constexpr size_t default_buf_size = (256 * PAGE_SIZE);
 
 const std::string TrinityVision2API::dev_node_base = "triv2";
-std::bitset<CHAR_BIT> TrinityVision2API::dev_bitset = 0;
 
 #ifdef ENABLE_CUSE
 /** @brief Cuse-hwmem element */
@@ -70,6 +69,7 @@ ThreadSafeMap<int, CuseElement> TrinityVision2API::cuse_map;
  * @param[in] dev_id device id
  */
 TrinityVision2API::TrinityVision2API (int dev_id) : DriverAPI (dev_id) {
+  std::bitset<CHAR_BIT> dev_bitset;
   int num_devs;
 
   if (dev_id > max_num_devs) {
@@ -78,10 +78,9 @@ TrinityVision2API::TrinityVision2API (int dev_id) : DriverAPI (dev_id) {
   }
 
   /* Rescan the device nodes to check for newly added or removed one */
-  TrinityVision2API::dev_bitset.reset ();
-  num_devs = TrinityVision2API::getNumDevices ();
-
-  if ((dev_id > num_devs) || !(TrinityVision2API::dev_bitset.test (dev_id))) {
+  dev_bitset.reset ();
+  num_devs = TrinityVision2API::getNumDevices (&dev_bitset);
+  if ((dev_id > num_devs) || !dev_bitset.test (dev_id)) {
     this->dev_id_ = -1;
     return;
   }
@@ -155,11 +154,12 @@ TrinityVision2API::checkSanity () {
 
 /**
  * @brief get number of available devices. should be enough
+ * @param[in] bitset bitset to indicate the existance of devices
  * @return number of available devices.
  */
 int
-TrinityVision2API::getNumDevices () {
-  static std::string path;
+TrinityVision2API::getNumDevices (std::bitset<CHAR_BIT> *bitset) {
+  std::string path;
   struct stat sb;
   int cnt = 0;
   int ret;
@@ -171,7 +171,8 @@ TrinityVision2API::getNumDevices () {
     ret = stat (path.c_str (), &sb);
     if (ret == 0 && S_ISCHR (sb.st_mode)) {
       cnt++;
-      TrinityVision2API::dev_bitset.set (i);
+      if (bitset)
+        bitset->set (i);
     }
   }