#pragma once
#include <atomic>
#include <memory>
#include "infer_request.h"
#include "status.h"
namespace triton { namespace core {
class SequenceBatchScheduler;
class Sequencer {
public:
virtual Status SetupSequenceRequest(
std::unique_ptr<InferenceRequest>& irequest)
{
const auto& correlation_id = irequest->CorrelationId();
if (!correlation_id.InSequence()) {
return Status(
Status::Code::INVALID_ARG,
"inference request to model '" + irequest->ModelName() +
"' must specify a non-zero or non-empty correlation ID");
}
return Status::Success;
}
virtual void AddReleaseCallback(
std::unique_ptr<InferenceRequest>& irequest,
InferenceRequest::InternalReleaseFn&& callback)
{
irequest->AddInternalReleaseCallback(std::move(callback));
}
virtual Status RescheduleRequest(
std::unique_ptr<InferenceRequest>& request, const uint32_t flags)
{
return Status::Success;
}
};
class IterativeSequencer : public Sequencer {
public:
IterativeSequencer(SequenceBatchScheduler* base) : base_(base) {}
Status SetupSequenceRequest(
std::unique_ptr<InferenceRequest>& irequest) override
{
const auto& correlation_id = irequest->CorrelationId();
if (!correlation_id.InSequence()) {
irequest->SetCorrelationId(InferenceRequest::SequenceId(sequence_id_++));
irequest->SetFlags(TRITONSERVER_REQUEST_FLAG_SEQUENCE_START);
}
return Status::Success;
}
void AddReleaseCallback(
std::unique_ptr<InferenceRequest>& irequest,
InferenceRequest::InternalReleaseFn&& callback) override
{
if (irequest->Flags() & TRITONSERVER_REQUEST_FLAG_SEQUENCE_START) {
irequest->AddInternalReleaseCallback(std::move(callback));
}
}
Status RescheduleRequest(
std::unique_ptr<InferenceRequest>& request,
const uint32_t flags) override;
private:
std::atomic<uint64_t> sequence_id_{1};
SequenceBatchScheduler* const base_;
};
}}