@@ -228,10 +228,11 @@ void Command::waitForEvents(QueueImplPtr Queue,
228228}
229229
230230Command::Command (CommandType Type, QueueImplPtr Queue)
231- : MQueue(std::move(Queue)), MType(Type), MEnqueued( false ) {
231+ : MQueue(std::move(Queue)), MType(Type) {
232232 MEvent.reset (new detail::event_impl (MQueue));
233233 MEvent->setCommand (this );
234234 MEvent->setContextImpl (detail::getSyclObjImpl (MQueue->get_context ()));
235+ MEnqueueStatus = EnqueueResultT::SyclEnqueueReady;
235236
236237#ifdef XPTI_ENABLE_INSTRUMENTATION
237238 if (!xptiTraceEnabled ())
@@ -451,11 +452,11 @@ void Command::emitInstrumentation(uint16_t Type, const char *Txt) {
451452
452453bool Command::enqueue (EnqueueResultT &EnqueueResult, BlockingT Blocking) {
453454 // Exit if already enqueued
454- if (MEnqueued )
455+ if (MEnqueueStatus == EnqueueResultT::SyclEnqueueSuccess )
455456 return true ;
456457
457458 // If the command is blocked from enqueueing
458- if (MIsBlockable && !MCanEnqueue ) {
459+ if (MIsBlockable && MEnqueueStatus == EnqueueResultT::SyclEnqueueBlocked ) {
459460 // Exit if enqueue type is not blocking
460461 if (!Blocking) {
461462 EnqueueResult = EnqueueResultT (EnqueueResultT::SyclEnqueueBlocked, this );
@@ -478,7 +479,7 @@ bool Command::enqueue(EnqueueResultT &EnqueueResult, BlockingT Blocking) {
478479#endif
479480
480481 // Wait if blocking
481- while (!MCanEnqueue )
482+ while (MEnqueueStatus == EnqueueResultT::SyclEnqueueBlocked )
482483 ;
483484#ifdef XPTI_ENABLE_INSTRUMENTATION
484485 emitInstrumentation (xpti::trace_barrier_end, Info.c_str ());
@@ -488,13 +489,19 @@ bool Command::enqueue(EnqueueResultT &EnqueueResult, BlockingT Blocking) {
488489 std::lock_guard<std::mutex> Lock (MEnqueueMtx);
489490
490491 // Exit if the command is already enqueued
491- if (MEnqueued )
492+ if (MEnqueueStatus == EnqueueResultT::SyclEnqueueSuccess )
492493 return true ;
493494
494495#ifdef XPTI_ENABLE_INSTRUMENTATION
495496 emitInstrumentation (xpti::trace_task_begin, nullptr );
496497#endif
497498
499+ if (MEnqueueStatus == EnqueueResultT::SyclEnqueueFailed) {
500+ EnqueueResult = EnqueueResultT (EnqueueResultT::SyclEnqueueFailed, this );
501+ return false ;
502+ }
503+
504+ MEnqueueStatus = EnqueueResultT::SyclEnqueueFailed;
498505 cl_int Res = enqueueImp ();
499506
500507 if (CL_SUCCESS != Res)
@@ -503,14 +510,14 @@ bool Command::enqueue(EnqueueResultT &EnqueueResult, BlockingT Blocking) {
503510 else
504511 // Consider the command is successfully enqueued if return code is
505512 // CL_SUCCESS
506- MEnqueued = true ;
513+ MEnqueueStatus = EnqueueResultT::SyclEnqueueSuccess ;
507514
508515 // Emit this correlation signal before the task end
509516 emitEnqueuedEventSignal (MEvent->getHandleRef ());
510517#ifdef XPTI_ENABLE_INSTRUMENTATION
511518 emitInstrumentation (xpti::trace_task_end, nullptr );
512519#endif
513- return static_cast < bool >(MEnqueued) ;
520+ return MEnqueueStatus == EnqueueResultT::SyclEnqueueSuccess ;
514521}
515522
516523void Command::resolveReleaseDependencies (std::set<Command *> &DepList) {
0 commit comments