[Comm/FD] Allow to read file contents via a file descriptor
authorDongju Chae <dongju.chae@samsung.com>
Thu, 20 May 2021 06:49:02 +0000 (15:49 +0900)
committer채동주/On-Device Lab(SR)/Staff Engineer/삼성전자 <dongju.chae@samsung.com>
Tue, 25 May 2021 04:31:40 +0000 (13:31 +0900)
This patch allows to read file contents via a file descriptor.
Some user may want to pass just a file descriptor, not file name.

Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
include/common/typedef.h
src/core/comm/plugin-comm-ip.cc
tests/unittests/ne_core_handler_test.cc
tests/utils/ne_test_utils.cc

index aab8d9d..81818c4 100644 (file)
@@ -107,6 +107,7 @@ typedef struct {
   union {
     struct {                /** BUFFER_FILE */
       const char *filepath; /**< The filepath for the data */
+      int fd;               /**< The file descriptor (optional) */
     };
     struct {             /** BUFFER_MAPPED/DMABUF */
       void *addr;        /**< Mapped address of the buffer */
index b1274ce..6b47620 100644 (file)
@@ -13,6 +13,8 @@
 
 #include "CommPlugin.h"
 
+#include <unistd.h>
+
 #include <cstring>
 #include <fstream>
 #include <memory>
@@ -59,21 +61,28 @@ class CommPluginIP : public CommPlugin {
     /** Note that npu-engine does not support data manipulation for the BUFFER_DMABUF.
       * In this case, ensure that the data format is compatible with the device. */
     if (buf->type == BUFFER_FILE) {
-      std::ifstream ifs (buf->filepath, std::ios::binary);
-      if (ifs.good ()) {
-        ifs.seekg (offset);
-        if (func != nullptr) {
-          char *tmp = new char[size];
-
-          ifs.read (tmp, size);
-          func (data, tmp, size);
-
-          delete[] tmp;
-        } else {
-          ifs.read (static_cast<char *> (data), size);
+      if (buf->filepath != nullptr) {
+        std::ifstream ifs (buf->filepath, std::ios::binary);
+        if (ifs.good ()) {
+          ifs.seekg (offset);
+          if (func != nullptr) {
+            char *tmp = new char[size];
+
+            ifs.read (tmp, size);
+            func (data, tmp, size);
+
+            delete[] tmp;
+          } else {
+            ifs.read (static_cast<char *> (data), size);
+          }
+          count = ifs.gcount ();
+          ifs.close ();
         }
-        count = ifs.gcount ();
-        ifs.close ();
+      } else if (buf->fd >= 0) {
+        lseek (buf->fd, offset, SEEK_SET);
+        count = ::read (buf->fd, data, size);
+      } else {
+        return -EINVAL;
       }
     } else if (buf->type == BUFFER_MAPPED) {
       if (buf->addr == nullptr)
index 75939fc..9593227 100644 (file)
@@ -87,7 +87,7 @@ TEST (ne_core_handler_test, device_instance_uninitilized_n) {
 
   void *addr = nullptr;
   Model *model;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   input_buffers input;
 
   EXPECT_EQ (triv2->allocMemory (4096, &addr), -EPERM);
@@ -190,7 +190,7 @@ TEST (ne_core_handler_test, triv2_set_model) {
       Device::createInstance (NPUCOND_TRIV2_CONN_SOCIP, 0));
   ASSERT_NE (device.get (), nullptr);
 
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   Model *model = nullptr;
@@ -209,7 +209,7 @@ TEST (ne_core_handler_test, triv2_set_model_invalid_args_n) {
       Device::createInstance (NPUCOND_TRIV2_CONN_SOCIP, 0));
   ASSERT_NE (device.get (), nullptr);
 
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   Model *model = nullptr;
@@ -228,7 +228,7 @@ TEST (ne_core_handler_test, triv2_set_model_invalid_data_n) {
       Device::createInstance (NPUCOND_TRIV2_CONN_SOCIP, 0));
   ASSERT_NE (device.get (), nullptr);
 
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   Model *model = nullptr;
@@ -255,6 +255,7 @@ TEST (ne_core_handler_test, triv2_set_model_invalid_data_n) {
   /** generic_buffer: invalid filepath */
   model_buf.type = BUFFER_FILE;
   model_buf.filepath = nullptr;
+  model_buf.fd = -1;
   EXPECT_NE (device->setModel (&model_buf, &model), 0);
 
   /** generic_buffer: invalid dmabuf */
@@ -319,7 +320,7 @@ TEST (ne_core_handler_test, triv2_run) {
   ASSERT_NE (device.get (), nullptr);
 
   /** prepare model */
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   Model *model = nullptr;
@@ -381,7 +382,7 @@ TEST (ne_core_handler_test, triv2_run_invalid_args_n) {
   /** TRIV2 requires valid model and buffer arguments */
 
   /** prepare model */
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   Model *model = nullptr;
@@ -411,7 +412,7 @@ TEST (ne_core_handler_test, triv2_run_invalid_opmode_n) {
   ASSERT_NE (device.get (), nullptr);
 
   /** prepare model */
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   Model *model = nullptr;
@@ -442,7 +443,7 @@ TEST (ne_core_handler_test, triv2_stop) {
   ASSERT_NE (device.get (), nullptr);
 
   /** prepare model */
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   Model *model = nullptr;
@@ -491,7 +492,7 @@ TEST (ne_core_handler_test, handler_register_model) {
   ASSERT_NE (handler, nullptr);
 
   uint32_t modelid_start, modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   EXPECT_EQ (handler->registerModel (&model_buf, &modelid_start), 0);
@@ -535,7 +536,7 @@ TEST (ne_core_handler_test, handler_register_model_invalid_args_01_n) {
   ASSERT_NE (handler, nullptr);
 
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   EXPECT_NE (handler->registerModel (nullptr, nullptr), 0);
@@ -557,7 +558,7 @@ TEST (ne_core_handler_test, handler_register_model_invalid_args_02_n) {
   ASSERT_NE (handler, nullptr);
 
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   /** Set invalid buffer type */
@@ -584,7 +585,7 @@ TEST (ne_core_handler_test, handler_unregister_model_invalid_id_n) {
   EXPECT_NE (handler->unregisterModel (2), 0);
 
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   /** already unregistered */
@@ -608,7 +609,7 @@ TEST (ne_core_handler_test, handler_get_model_invalid_id_n) {
   ASSERT_NE (handler, nullptr);
 
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   EXPECT_EQ (handler->getModel (0), nullptr);
@@ -634,7 +635,7 @@ TEST (ne_core_handler_test, handler_set_data_info) {
   ASSERT_NE (handler, nullptr);
 
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   EXPECT_EQ (handler->registerModel (&model_buf, &modelid), 0);
@@ -663,7 +664,7 @@ TEST (ne_core_handler_test, handler_set_data_info_invalid_args_n) {
   ASSERT_NE (handler, nullptr);
 
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   tensors_data_info in;
@@ -697,7 +698,7 @@ TEST (ne_core_handler_test, handler_set_constraint) {
   ASSERT_NE (handler, nullptr);
 
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   EXPECT_EQ (handler->registerModel (&model_buf, &modelid), 0);
@@ -730,7 +731,7 @@ TEST (ne_core_handler_test, handler_set_constraint_invalid_args_n) {
   ASSERT_NE (handler, nullptr);
 
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   npuConstraint constraint;
@@ -756,7 +757,7 @@ TEST (ne_core_handler_test, handler_generic_buffer) {
   HostHandler *handler = device->getHostHandler ();
   ASSERT_NE (handler, nullptr);
 
-  generic_buffer buf;
+  generic_buffer buf = {0};
   buf.size = 4096;
   buf.type = BUFFER_MAPPED;
 
@@ -799,7 +800,7 @@ TEST (ne_core_handler_test, handler_generic_buffer_n) {
       0);
 
   /** invalid type */
-  generic_buffer buf;
+  generic_buffer buf = {0};
   buf.size = 4096;
   buf.type = BUFFER_UNDEFINED;
   EXPECT_NE (handler->allocGenericBuffer (&buf), 0);
@@ -820,6 +821,7 @@ TEST (ne_core_handler_test, handler_generic_buffer_n) {
   buf.type = BUFFER_FILE;
   buf.size = 4096;
   buf.filepath = nullptr;
+  buf.fd = -1;
   EXPECT_NE (handler->allocGenericBuffer (&buf), 0);
 
   buf.type = BUFFER_DMABUF;
@@ -875,7 +877,7 @@ TEST (ne_core_handler_test, handler_triv2_run_sync) {
 
   /** model */
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   EXPECT_EQ (handler->registerModel (&model_buf, &modelid), 0);
@@ -912,7 +914,7 @@ TEST (ne_core_handler_test, handler_triv2_run_sync_n) {
 
   /** model */
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   EXPECT_EQ (handler->registerModel (&model_buf, &modelid), 0);
@@ -950,7 +952,7 @@ TEST (ne_core_handler_test, handler_triv2_run_async) {
 
   /** model */
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   EXPECT_EQ (handler->registerModel (&model_buf, &modelid), 0);
@@ -987,7 +989,7 @@ TEST (ne_core_handler_test, handler_triv2_run_async_n) {
 
   /** model */
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   EXPECT_EQ (handler->registerModel (&model_buf, &modelid), 0);
@@ -1049,7 +1051,7 @@ TEST (ne_core_handler_test, handler_triv2_get_memory_status) {
 
   /** model */
   uint32_t modelid;
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   create_model_buffer (model_buf);
 
   ASSERT_EQ (handler->registerModel (&model_buf, &modelid), 0);
index 515c346..af926c0 100644 (file)
@@ -360,7 +360,7 @@ UtilTrinity::loadModel (std::string dirpath, uint32_t *model_id_ptr,
   if (meta == nullptr)
     return -EINVAL;
 
-  generic_buffer model_buf;
+  generic_buffer model_buf = {0};
   UtilModel *model;
   uint32_t model_id;
   int status = -EINVAL;