Skip to content

Commit

Permalink
[ml-remote-service] Add service event cb
Browse files Browse the repository at this point in the history
Add remote service event callback

Signed-off-by: gichan2-jang <[email protected]>
  • Loading branch information
gichan-jang committed Nov 16, 2023
1 parent 597174f commit 0bc1ac8
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 124 deletions.
28 changes: 24 additions & 4 deletions c/include/nnstreamer-tizen-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,24 @@ typedef struct {
char *fw_name; /**< The explicit framework name given by user */
} ml_single_preset;

typedef void *ml_service_event_h;

/**
* @brief Enumeration for the event types of ml-service.
*/
typedef enum {
ML_SERVICE_EVENT_MODEL_REGISTERED = 0,
ML_SERVICE_EVENT_PIPELINE_REGISTERED,

NNS_EDGE_EVENT_TYPE_UNKNOWN
} ml_service_event_e;

/**
* @brief Callback for the ml-service event.
* @return User should return ML_ERROR_NONE if an event is successfully handled.
*/
typedef int (*ml_service_event_cb) (ml_service_event_e event_type, void *user_data);

/**
* @brief Opens an ML model with the custom options and returns the instance as a handle.
* This is internal function to handle various options in public APIs.
Expand Down Expand Up @@ -68,6 +86,8 @@ char * ml_api_get_version_string (void);
* @details The caller should set one of "remote_sender" and "remote_receiver" as a service type in @a ml_option.
* @remarks The @a handle should be destroyed using ml_service_destroy().
* @param[in] option The option used for creating query service.
* @param[in] cb The ml-service callbacks for event handling.
* @param[in] user_data Private data for the callback. This value is passed to the callback when service is received.
* @param[out] handle Newly created query service handle is returned.
* @return @c 0 on Success. Otherwise a negative error value.
* @retval #ML_ERROR_NONE Successful.
Expand All @@ -77,7 +97,7 @@ char * ml_api_get_version_string (void);
* @retval #ML_ERROR_STREAMS_PIPE Failed to launch the pipeline.
* @retval #ML_ERROR_TRY_AGAIN The pipeline is not ready yet.
*/
int ml_service_remote_create (ml_option_h option, ml_service_h *handle);
int ml_service_remote_create (ml_option_h option, ml_service_event_cb cb, void *user_data, ml_service_h *handle);

/**
* @todo DRAFT. API name should be determined later.
Expand Down Expand Up @@ -106,7 +126,7 @@ int ml_service_remote_create (ml_option_h option, ml_service_h *handle);
* gchar *client_connect_type = g_strdup ("TCP");
* ml_option_set (client_option_h, "connect-type", client_connect_type, g_free);
*
* status = ml_service_remote_create (client_option_h, &client_h);
* status = ml_service_remote_create (client_option_h, NULL, NULL, &client_h);
*
* // ================== Server side ==================
* ml_service_h server_h;
Expand All @@ -122,7 +142,7 @@ int ml_service_remote_create (ml_option_h option, ml_service_h *handle);
* ml_option_set (server_option_h, "connect-type", server_connect_type, g_free);
*
* // Create ml-remote service.
* ml_service_remote_create (server_option_h, &server_h)
* ml_service_remote_create (server_option_h, NULL, NULL, &server_h)
*
* // ================== Client side ==================
* // Send neural network model url to the query server.
Expand All @@ -140,7 +160,7 @@ int ml_service_remote_create (ml_option_h option, ml_service_h *handle);
* ml_option_set (client_option_h, "dest_host", dest_host, g_free);
*
* // Create query service.
* ml_service_remote_create (client_option_h, &client_h);
* ml_service_remote_create (client_option_h, NULL, NULL, &client_h);
*
* ml_option_h query_option_h = NULL;
* ml_option_create (&query_option_h);
Expand Down
71 changes: 50 additions & 21 deletions c/src/ml-api-service-remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ typedef struct
{
nns_edge_h edge_h;
nns_edge_node_type_e node_type;

ml_service_event_cb event_cb;
void *user_data;
} _ml_remote_service_s;

/**
Expand Down Expand Up @@ -335,14 +338,16 @@ _mlrs_get_data_from_uri (gchar * uri, GByteArray * array)
* @brief Process ml remote service
*/
static int
_mlrs_process_remote_service (nns_edge_data_h data_h)
_mlrs_process_remote_service (nns_edge_data_h data_h, void *user_data)
{
void *data;
nns_size_t data_len;
g_autofree gchar *service_str = NULL;
g_autofree gchar *service_key = NULL;
ml_remote_service_type_e service_type;
int ret = NNS_EDGE_ERROR_NONE;
_ml_remote_service_s *remote_s = (_ml_remote_service_s *) user_data;
ml_service_event_e event_type = NNS_EDGE_EVENT_TYPE_UNKNOWN;

ret = nns_edge_data_get (data_h, 0, &data, &data_len);
if (NNS_EDGE_ERROR_NONE != ret) {
Expand Down Expand Up @@ -372,7 +377,9 @@ _mlrs_process_remote_service (nns_edge_data_h data_h)
_ml_error_report_return (NNS_EDGE_ERROR_IO,
"Failed to get data from uri: %s.", (gchar *) data);
}
if (!_mlrs_model_register (service_key, data_h, array->data, array->len)) {
if (_mlrs_model_register (service_key, data_h, array->data, array->len)) {
event_type = ML_SERVICE_EVENT_MODEL_REGISTERED;
} else {
_ml_error_report ("Failed to register model downloaded from: %s.",
(gchar *) data);
ret = NNS_EDGE_ERROR_UNKNOWN;
Expand All @@ -382,7 +389,9 @@ _mlrs_process_remote_service (nns_edge_data_h data_h)
}
case ML_REMOTE_SERVICE_TYPE_MODEL_RAW:
{
if (!_mlrs_model_register (service_key, data_h, data, data_len)) {
if (_mlrs_model_register (service_key, data_h, data, data_len)) {
event_type = ML_SERVICE_EVENT_MODEL_REGISTERED;
} else {
_ml_error_report ("Failed to register model downloaded from: %s.",
(gchar *) data);
ret = NNS_EDGE_ERROR_UNKNOWN;
Expand All @@ -400,17 +409,30 @@ _mlrs_process_remote_service (nns_edge_data_h data_h)
"Failed to get data from uri: %s.", (gchar *) data);
}
ret = ml_service_set_pipeline (service_key, (gchar *) array->data);
if (ML_ERROR_NONE == ret) {
event_type = ML_SERVICE_EVENT_PIPELINE_REGISTERED;
}
g_byte_array_free (array, TRUE);
break;
}
case ML_REMOTE_SERVICE_TYPE_PIPELINE_RAW:
ret = ml_service_set_pipeline (service_key, (gchar *) data);
if (ML_ERROR_NONE == ret) {
event_type = ML_SERVICE_EVENT_PIPELINE_REGISTERED;
}
break;
default:
_ml_error_report ("Unknown service type or not supported yet. "
"Service num: %d", service_type);
break;
}

if (remote_s && event_type != NNS_EDGE_EVENT_TYPE_UNKNOWN) {
if (remote_s->event_cb) {
remote_s->event_cb (event_type, remote_s->user_data);
}
}

return ret;
}

Expand All @@ -434,7 +456,7 @@ _mlrs_edge_event_cb (nns_edge_event_h event_h, void *user_data)
if (NNS_EDGE_ERROR_NONE != ret)
return ret;

ret = _mlrs_process_remote_service (data_h);
ret = _mlrs_process_remote_service (data_h, user_data);
break;
}
default:
Expand All @@ -451,41 +473,46 @@ _mlrs_edge_event_cb (nns_edge_event_h event_h, void *user_data)
* @brief Create edge handle.
*/
static int
_mlrs_create_edge_handle (nns_edge_h * edge_h, edge_info_s * edge_info)
_mlrs_create_edge_handle (_ml_remote_service_s * remote_s,
edge_info_s * edge_info)
{
int ret = 0;
nns_edge_h edge_h = NULL;

ret = nns_edge_create_handle (edge_info->topic, edge_info->conn_type,
edge_info->node_type, edge_h);
edge_info->node_type, &edge_h);

if (NNS_EDGE_ERROR_NONE != ret) {
_ml_error_report ("nns_edge_create_handle failed.");
return ret;
}

ret = nns_edge_set_event_callback (*edge_h, _mlrs_edge_event_cb, NULL);
ret = nns_edge_set_event_callback (edge_h, _mlrs_edge_event_cb, remote_s);
if (NNS_EDGE_ERROR_NONE != ret) {
_ml_error_report ("nns_edge_set_event_callback failed.");
nns_edge_release_handle (*edge_h);
nns_edge_release_handle (edge_h);
return ret;
}

_mlrs_set_edge_info (edge_info, *edge_h);
_mlrs_set_edge_info (edge_info, edge_h);

ret = nns_edge_start (*edge_h);
ret = nns_edge_start (edge_h);
if (NNS_EDGE_ERROR_NONE != ret) {
_ml_error_report ("nns_edge_start failed.");
nns_edge_release_handle (*edge_h);
nns_edge_release_handle (edge_h);
return ret;
}

if (edge_info->node_type == NNS_EDGE_NODE_TYPE_SUB) {
ret = nns_edge_connect (*edge_h, edge_info->dest_host,
edge_info->dest_port);
ret = nns_edge_connect (edge_h, edge_info->dest_host, edge_info->dest_port);

if (NNS_EDGE_ERROR_NONE != ret) {
_ml_error_report ("nns_edge_connect failed.");
nns_edge_release_handle (*edge_h);
nns_edge_release_handle (edge_h);
return ret;
}
}
remote_s->edge_h = edge_h;

return ret;
}
Expand Down Expand Up @@ -514,11 +541,11 @@ ml_service_remote_release_internal (void *priv)
* @brief Creates ml-service handle with given ml-option handle.
*/
int
ml_service_remote_create (ml_option_h option, ml_service_h * handle)
ml_service_remote_create (ml_option_h option, ml_service_event_cb cb,
void *user_data, ml_service_h * handle)
{
ml_service_s *mls;
_ml_remote_service_s *remote_s;
nns_edge_h edge_h = NULL;
edge_info_s *edge_info = NULL;
int ret = ML_ERROR_NONE;

Expand All @@ -545,16 +572,18 @@ ml_service_remote_create (ml_option_h option, ml_service_h * handle)

_mlrs_get_edge_info (option, edge_info);

ret = _mlrs_create_edge_handle (&edge_h, edge_info);
remote_s = g_new0 (_ml_remote_service_s, 1);
remote_s->node_type = edge_info->node_type;
remote_s->event_cb = cb;
remote_s->user_data = user_data;

ret = _mlrs_create_edge_handle (remote_s, edge_info);
if (ML_ERROR_NONE != ret) {
g_free (edge_info);
g_free (remote_s);
return ret;
}

remote_s = g_new0 (_ml_remote_service_s, 1);
remote_s->edge_h = edge_h;
remote_s->node_type = edge_info->node_type;

mls = g_new0 (ml_service_s, 1);
mls->type = ML_SERVICE_TYPE_REMOTE;
mls->priv = remote_s;
Expand Down
Loading

0 comments on commit 0bc1ac8

Please sign in to comment.