/*! * Copyright (c) 2023-2025 by Contributors * \file serve/engine_state.cc */ #include "engine_state.h" namespace mlc { namespace llm { namespace serve { TVM_FFI_STATIC_INIT_BLOCK() { EngineStateObj::RegisterReflection(); } EngineState::EngineState() { data_ = tvm::ffi::make_object(); } void EngineStateObj::Reset() { running_queue.clear(); waiting_queue.clear(); request_states.clear(); id_manager.Reset(); metrics.Reset(); if (prefix_cache.defined()) { prefix_cache->Reset(); } running_rsentries_changed = true; postproc_workspace = ActionPostProcessWorkspace(); } RequestState EngineStateObj::GetRequestState(Request request) { TVM_FFI_ICHECK(request->rstate != nullptr) << "The state of the request has not been defined."; return GetRef(static_cast(request->rstate)); } const std::vector& EngineStateObj::GetRunningRequestStateEntries() { if (running_rsentries_changed) { cached_running_rsentries_.clear(); for (const Request& request : running_queue) { for (const RequestStateEntry& rsentry : GetRequestState(request)->entries) { // One request entry is considered as running for decode if it is a leaf and has // finished all input prefill. if (rsentry->status == RequestStateStatus::kAlive && rsentry->child_indices.empty() && rsentry->mstates[0]->inputs.empty()) { cached_running_rsentries_.push_back(rsentry); } } } running_rsentries_changed = false; } return cached_running_rsentries_; // } } // namespace serve } // namespace llm } // namespace mlc