It handles each request's result code, for both sync and async calls.
Signed-off-by: Jiho Chu <jiho.chu@samsung.com>
*/
int removeNPU_request (npudev_h dev, int req_id);
+/**
+ * @brief Get request's operation result
+ * @param[in] dev The NPU device handle
+ * @param[in] req_id The request's ID
+ * @return 0 if no error. Otherwise a negative error code
+ */
+int getNPU_requestResult (npudev_h dev, int req_id);
+
/**
* @brief Get the request's model id
* @param[in] dev The NPU device handle
return status;
}
+/**
+ * @brief Get request result
+ * @param[in] req_id The request's ID
+ * @return 0 if no error. Otherwise a negative errno
+ */
+int
+HostHandler::getRequestResult (int req_id) {
+ return device_->getRequestResult (req_id);
+}
+
/**
* @brief Get the request's model id
* @param[in] req_id The request's ID
return 0;
}
+/**
+ * @brief Get request's result
+ * @param[in] req_id The request's ID
+ * @return 0 if no error. Otherwise a negative errno
+ */
+int
+TrinityVision2::getRequestResult (int req_id) {
+ Request *req = scheduler_->findRequest (req_id);
+ if (req == nullptr) {
+ logerr (TAG, "Unable to find the request with ID (%d)\n", req_id);
+ return -ENOENT;
+ }
+
+ if (req->isSubmitted () && req->getOpmode () != NPUINPUT_HW_RECURRING) {
+ logerr (TAG, "The request is not handled yet\n");
+ return -EBUSY;
+ }
+
+ return req->getResult ();
+}
+
/**
* @brief Get the request's model id
* @param[in] req_id The request's ID
int createRequest (uint32_t model_id, int *req_id);
int removeRequest (int req_id);
+ int getRequestResult (int req_id);
int getRequestModel (int req_id, uint32_t *model_id);
int setRequestData (int req_id, input_buffers *input, tensors_data_info *in_info,
virtual int createRequest (const Model *model, int *req_id) = 0;
virtual int removeRequest (int req_id) = 0;
+ virtual int getRequestResult (int req_id) = 0;
virtual int getRequestModel (int req_id, uint32_t *model_id) = 0;
virtual int setRequestData (int req_id, input_buffers *input, tensors_data_info *in_info,
int createRequest (const Model *model, int *req_id);
int removeRequest (int req_id);
+ int getRequestResult (int req_id);
int getRequestModel (int req_id, uint32_t *model_id);
int setRequestData (int req_id, input_buffers *input, tensors_data_info *in_info,
return -EINVAL;
}
- taskFunc func = std::bind (&HostInputService::invoke, this, api, req, callback);
+ taskFunc func =
+ std::bind (&HostInputService::invoke, this, api, const_cast<Request *> (req), callback);
ThreadTask *task = new ThreadTask (req->getID (), func);
return ThreadPool::getInstance ().enqueueTask (task);
}
* @return 0 if no error, otherwise a negative errno
*/
int
-HostInputService::invoke (const DriverAPI *api, const Request *req, outputCallback callback) {
+HostInputService::invoke (const DriverAPI *api, Request *req, outputCallback callback) {
device_state_t state;
const Model *model;
HWmem *data;
else /* no inference data; skip */
ret = 0;
+ req->setResult (ret);
+
handle_callback:
if (callback != nullptr)
callback ();
return -EINVAL;
}
- return invoke (api, req, callback);
+ return invoke (api, const_cast<Request *> (req), callback);
}
/**
* @return req_id if no error, otherwise a negative errno
*/
int
-HwInputService::invoke (const DriverAPI *api, const Request *req, outputCallback callback) {
+HwInputService::invoke (const DriverAPI *api, Request *req, outputCallback callback) {
device_state_t state;
const Model *model;
HWmem *data;
else /* no inference data; skip */
ret = 0;
+ req->setResult (ret);
+
handle_callback:
if (callback != nullptr)
callback ();
private:
/** do not allow to directly call invoke () */
- int invoke (const DriverAPI *api, const Request *request, outputCallback callback = nullptr);
+ int invoke (const DriverAPI *api, Request *request, outputCallback callback = nullptr);
/** singleton pattern */
static std::unique_ptr<HostInputService> instance_;
static std::once_flag once_flag_;
int remove (const DriverAPI *api, int request_id);
private:
- int invoke (const DriverAPI *api, const Request *request, outputCallback callback = nullptr);
+ int invoke (const DriverAPI *api, Request *request, outputCallback callback = nullptr);
/** singleton pattern */
static std::unique_ptr<HwInputService> instance_;
static std::once_flag once_flag_;
public:
EmulReq (int req_id) : req_id_ (req_id), cout_orig_ (nullptr) {}
- void run_emul (char *prog, char **segt, char *metadata, std::string cmd_path,
- std::string prof_path) {
+ int run_emul (char *prog, char **segt, char *metadata, std::string cmd_path,
+ std::string prof_path) {
+ int ret;
+
setMute (true);
- run_triv2_emul (prog, segt, metadata, cmd_path.c_str (), prof_path.c_str ());
+ ret = run_triv2_emul (prog, segt, metadata, cmd_path.c_str (), prof_path.c_str ());
setMute (false);
delete[] segt;
+
+ return ret;
}
void setMute (bool mute) {
if (createDirectory (prof_path)) {
prof_path += "/req_id_" + std::to_string (req_id);
- req->run_emul (prog, segt, static_cast<char *> (elem_metadata->getAddr ()), cmd_path,
- prof_path);
+ status = req->run_emul (prog, segt, static_cast<char *> (elem_metadata->getAddr ()),
+ cmd_path, prof_path);
} else {
logerr (TAG, "Unable to create a profile directory: %s\n", prof_path.c_str ());
delete[] segt;
+ status = -EINVAL;
}
delete req;
}
}
- return 0;
+ return status;
}
/**
return host_handler->removeRequest (req_id);
}
+/**
+ * @brief Remove the request instance
+ * @param[in] dev The NPU device handle
+ * @param[in] req_id The request's ID
+ * @return 0 if no error. Otherwise a negative errno
+ */
+int
+getNPU_requestResult (npudev_h dev, int req_id) {
+ INIT_HOST_HANDLER (host_handler, dev);
+
+ return host_handler->getRequestResult (req_id);
+}
+
/**
* @brief Get the request's model id
* @param[in] dev The NPU device handle