--- /dev/null
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Job.h"
+
+#include "util/logging.h"
+
+namespace neurun
+{
+namespace exec
+{
+
+Job::Job(const model::operation::Index &index, IFunction *fn,
+ const model::operand::IndexSet &inputs, const model::operand::IndexSet &outputs)
+ : _index{index}, _fn{fn}, _outputs{outputs}
+{
+ for (auto input : inputs)
+ {
+ _blocking_inputs.insert(input);
+ }
+}
+
+void Job::onNotified(const model::operand::Index &operand)
+{
+ std::string s;
+ for (auto e : _blocking_inputs)
+ {
+ s += std::to_string(e.value());
+ s += " ";
+ }
+ VERBOSE(Job) << "Job #" << _index.value() << " notified operand : " << operand.value()
+ << " / blocking inputs { " << s << "}" << std::endl;
+
+ auto itr = _blocking_inputs.find(operand);
+ if (itr != _blocking_inputs.end())
+ {
+ _blocking_inputs.erase(itr);
+ }
+}
+
+void Job::onNotified(const model::operand::IndexSet &operands)
+{
+ for (auto operand : operands)
+ {
+ onNotified(operand);
+ }
+}
+
+void Job::run() { _fn->run(); }
+
+} // namespace exec
+} // namespace neurun
--- /dev/null
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __NEURUN_EXEC_JOB_H__
+#define __NEURUN_EXEC_JOB_H__
+
+#include <unordered_set>
+
+#include "interface/IFunction.h"
+#include "model/operation/Index.h"
+#include "model/operand/IndexSet.h"
+
+namespace neurun
+{
+namespace exec
+{
+
+class Job
+{
+public:
+ /**
+ * @brief Constructs a Job object
+ *
+ * @param index Operation index for this job
+ * @param fn compiled code to run this job
+ * @param inputs Input operand list
+ * @param outputs Output operand list
+ */
+ Job(const model::operation::Index &index, IFunction *fn, const model::operand::IndexSet &inputs,
+ const model::operand::IndexSet &outputs);
+ /**
+ * @brief Remove the given operand from blocking input list
+ *
+ * @param operand Operand to be notified
+ */
+ void onNotified(const model::operand::Index &operand);
+ /**
+ * @brief Remove the given operands from blocking input list
+ *
+ * @param operands Operands to be notified
+ */
+ void onNotified(const model::operand::IndexSet &operands);
+ /**
+ * @brief Execute the compiled code
+ */
+ void run();
+ /**
+ * @brief Check if this job is ready for execution
+ *
+ * @return @true if there is no blockin inputs
+ */
+ bool ready() const { return _blocking_inputs.empty(); }
+ /**
+ * @brief Return operation index
+ *
+ * @return Operation index
+ */
+ model::operation::Index index() const { return _index; }
+ /**
+ * @brief Return output indices
+ *
+ * @return Output indices
+ */
+ const model::operand::IndexSet &outputs() const { return _outputs; }
+
+private:
+ model::operation::Index _index;
+ IFunction *_fn;
+ std::unordered_set<model::operand::Index> _blocking_inputs;
+ const model::operand::IndexSet _outputs;
+};
+
+} // namespace exec
+} // namespace neurun
+
+#endif // __NEURUN_EXEC_JOB_H__