[Meta] transfer metadata
authorJaeyun <jy1210.jung@samsung.com>
Wed, 20 Jul 2022 11:42:27 +0000 (20:42 +0900)
committerMyungJoo Ham <myungjoo.ham@samsung.com>
Thu, 4 Aug 2022 11:23:57 +0000 (20:23 +0900)
When sending edge-data, transfer the metadata to destination.

Signed-off-by: Jaeyun <jy1210.jung@samsung.com>
src/libnnstreamer-edge/nnstreamer-edge-common.c
src/libnnstreamer-edge/nnstreamer-edge-common.h
src/libnnstreamer-edge/nnstreamer-edge-internal.c

index 15ed6d21113243c07ed35d8c729b4ba75ccba4fd..9474003a5076fbb70730f450fc1903d2ceb4edf9 100644 (file)
@@ -875,3 +875,43 @@ nns_edge_data_get_info (nns_edge_data_h data_h, const char *key, char **value)
 
   return nns_edge_metadata_get (&ed->metadata, key, value);
 }
+
+/**
+ * @brief Serialize metadata in edge data.
+ * @note This is internal function, DO NOT export this. Caller should release the returned value using free().
+ */
+int
+nns_edge_data_serialize_meta (nns_edge_data_h data_h, void **data,
+    size_t *data_len)
+{
+  nns_edge_data_s *ed;
+
+  ed = (nns_edge_data_s *) data_h;
+
+  if (!NNS_EDGE_MAGIC_IS_VALID (ed)) {
+    nns_edge_loge ("Invalid param, given edge data is invalid.");
+    return NNS_EDGE_ERROR_INVALID_PARAMETER;
+  }
+
+  return nns_edge_metadata_serialize (&ed->metadata, data, data_len);
+}
+
+/**
+ * @brief Deserialize metadata in edge data.
+ * @note This is internal function, DO NOT export this. Caller should release the returned value using free().
+ */
+int
+nns_edge_data_deserialize_meta (nns_edge_data_h data_h, void *data,
+    size_t data_len)
+{
+  nns_edge_data_s *ed;
+
+  ed = (nns_edge_data_s *) data_h;
+
+  if (!NNS_EDGE_MAGIC_IS_VALID (ed)) {
+    nns_edge_loge ("Invalid param, given edge data is invalid.");
+    return NNS_EDGE_ERROR_INVALID_PARAMETER;
+  }
+
+  return nns_edge_metadata_deserialize (&ed->metadata, data, data_len);
+}
index ab20825b8f56e48029de944c7839b3c2895e2b81..f8b53520c2b0a572ca08f81d05c5695833bf19a4 100644 (file)
@@ -263,6 +263,18 @@ int nns_edge_event_set_data (nns_edge_event_h event_h, void *data, size_t data_l
  */
 int nns_edge_data_is_valid (nns_edge_data_h data_h);
 
+/**
+ * @brief Serialize metadata in edge data.
+ * @note This is internal function, DO NOT export this. Caller should release the returned value using free().
+ */
+int nns_edge_data_serialize_meta (nns_edge_data_h data_h, void **data, size_t *data_len);
+
+/**
+ * @brief Deserialize metadata in edge data.
+ * @note This is internal function, DO NOT export this. Caller should release the returned value using free().
+ */
+int nns_edge_data_deserialize_meta (nns_edge_data_h data_h, void *data, size_t data_len);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index c5a2b15e817ede93b775f7a91a17c7b702681ac0..2a8d946b72e0513d2b3f75af9d4cd5c859da272e 100644 (file)
@@ -40,6 +40,7 @@ typedef struct
   /* memory info */
   uint32_t num;
   size_t mem_size[NNS_EDGE_DATA_LIMIT];
+  size_t meta_size;
 } nns_edge_cmd_info_s;
 
 /**
@@ -49,6 +50,7 @@ typedef struct
 {
   nns_edge_cmd_info_s info;
   void *mem[NNS_EDGE_DATA_LIMIT];
+  void *meta;
 } nns_edge_cmd_s;
 
 /**
@@ -197,7 +199,13 @@ _nns_edge_cmd_clear (nns_edge_cmd_s * cmd)
 
   for (i = 0; i < cmd->info.num; i++) {
     SAFE_FREE (cmd->mem[i]);
+    cmd->info.mem_size[i] = 0U;
   }
+
+  SAFE_FREE (cmd->meta);
+
+  cmd->info.num = 0U;
+  cmd->info.meta_size = 0U;
 }
 
 /**
@@ -256,16 +264,24 @@ _nns_edge_cmd_send (nns_edge_conn_s * conn, nns_edge_cmd_s * cmd)
     }
   }
 
+  if (cmd->info.meta_size > 0) {
+    if (!_send_raw_data (conn->socket, cmd->meta, cmd->info.meta_size)) {
+      nns_edge_loge ("Failed to send metadata to socket.");
+      return NNS_EDGE_ERROR_IO;
+    }
+  }
+
   return NNS_EDGE_ERROR_NONE;
 }
 
 /**
  * @brief Receive edge command from connected device.
+ * @note Before calling this function, you should initialize edge-cmd by using _nns_edge_cmd_init().
  */
 static int
 _nns_edge_cmd_receive (nns_edge_conn_s * conn, nns_edge_cmd_s * cmd)
 {
-  unsigned int i, n;
+  unsigned int n;
   int ret = NNS_EDGE_ERROR_NONE;
 
   if (!conn || !cmd)
@@ -299,22 +315,35 @@ _nns_edge_cmd_receive (nns_edge_conn_s * conn, nns_edge_cmd_s * cmd)
     if (!cmd->mem[n]) {
       nns_edge_loge ("Failed to allocate memory to receive data from socket.");
       ret = NNS_EDGE_ERROR_OUT_OF_MEMORY;
-      break;
+      goto error;
     }
 
     if (!_receive_raw_data (conn->socket, cmd->mem[n], cmd->info.mem_size[n])) {
       nns_edge_loge ("Failed to receive %uth memory from socket.", n++);
       ret = NNS_EDGE_ERROR_IO;
-      break;
+      goto error;
     }
   }
 
-  if (ret != NNS_EDGE_ERROR_NONE) {
-    for (i = 0; i < n; i++) {
-      SAFE_FREE (cmd->mem[i]);
+  if (cmd->info.meta_size > 0) {
+    cmd->meta = malloc (cmd->info.meta_size);
+    if (!cmd->meta) {
+      nns_edge_loge ("Failed to allocate memory to receive meta from socket.");
+      ret = NNS_EDGE_ERROR_OUT_OF_MEMORY;
+      goto error;
+    }
+
+    if (!_receive_raw_data (conn->socket, cmd->meta, cmd->info.meta_size)) {
+      nns_edge_loge ("Failed to receive metadata from socket.");
+      ret = NNS_EDGE_ERROR_IO;
+      goto error;
     }
   }
 
+  return NNS_EDGE_ERROR_NONE;
+
+error:
+  _nns_edge_cmd_clear (cmd);
   return ret;
 }
 
@@ -335,7 +364,10 @@ _nns_edge_transfer_data (nns_edge_conn_s * conn, nns_edge_data_h data_h,
   for (i = 0; i < cmd.info.num; i++)
     nns_edge_data_get (data_h, i, &cmd.mem[i], &cmd.info.mem_size[i]);
 
+  nns_edge_data_serialize_meta (data_h, &cmd.meta, &cmd.info.meta_size);
+
   ret = _nns_edge_cmd_send (conn, &cmd);
+  SAFE_FREE (cmd.meta);
 
   return ret;
 }
@@ -731,6 +763,9 @@ _nns_edge_message_handler (void *thread_data)
     for (i = 0; i < cmd.info.num; i++)
       nns_edge_data_add (data_h, cmd.mem[i], cmd.info.mem_size[i], NULL);
 
+    if (cmd.info.meta_size > 0)
+      nns_edge_data_deserialize_meta (data_h, cmd.meta, cmd.info.meta_size);
+
     /* Set client ID in edge data */
     val = nns_edge_strdup_printf ("%ld", (long int) client_id);
     nns_edge_data_set_info (data_h, "client_id", val);