JCC-CSScheduler/manager/internal/jobmgr/event/utils.go

77 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package event
import (
"context"
"gitlink.org.cn/cloudream/common/pkgs/future"
"gitlink.org.cn/cloudream/scheduler/manager/internal/jobmgr"
)
// WaitType 等待一个特定类型的事件。
// 通过给定的上下文和事件集,这个函数会阻塞直到匹配指定类型的事件发生。
// ctx: 用于控制等待过程的上下文,如果上下文被取消或到期,等待将被终止。
// set: 指向一个事件集,这个事件集会被用来等待特定类型的事件。
// 返回值 T: 等待到的事件,它会被强制转换为函数参数类型 T。
// 返回值 bool: 表示等待操作是否成功。如果成功等到事件,返回 true如果因为上下文被取消或到期而终止返回 false。
func WaitType[T jobmgr.Event](ctx context.Context, set *jobmgr.EventSet) (T, bool) {
// 使用 set.Wait 方法等待一个满足给定条件的事件。
// 条件函数检查事件是否能被转换为类型 T。
ret, ok := set.Wait(ctx, func(evt jobmgr.Event) bool {
_, ok := evt.(T)
return ok
})
if ret == nil {
var r T
return r, false // 如果事件为空则返回false。
}
// 因为 set.Wait 返回的事件类型是 jobmgr.Event这里将它转换为 T 类型,并返回转换结果及操作成功标志。
return ret.(T), ok
}
// WaitTypeAnd 等待一个特定类型的事件并检查该事件是否满足给定的条件。
// ctx: 上下文,用于控制等待过程的取消或超时。
// set: 事件集合,从中等待事件发生。
// cond: 一个函数,用于检查等待的事件是否满足特定条件。
// 返回值为满足条件的事件和一个布尔值,指示获取事件是否成功。
func WaitTypeAnd[T jobmgr.Event](ctx context.Context, set *jobmgr.EventSet, cond func(val T) bool) (T, bool) {
// 等待一个满足特定类型和条件的事件。
ret, ok := set.Wait(ctx, func(evt jobmgr.Event) bool {
// 尝试将事件断言为特定类型T并检查断言是否成功。
e, ok := evt.(T)
if !ok {
return false // 如果事件不是期望的类型T则返回false。
}
// 如果事件是类型T且满足给定条件则返回true。
return cond(e)
})
if ret == nil {
var r T
return r, false // 如果事件为空则返回false。
}
// 断言返回的事件为类型T并返回该事件和操作成功标志。
return ret.(T), ok
}
func BeginWaitType[T jobmgr.Event](set *jobmgr.EventSet) future.Future1[jobmgr.Event] {
// 等待一个满足特定类型和条件的事件。
return set.BeginWait(func(evt jobmgr.Event) bool {
_, ok := evt.(T)
return ok
})
}
func BeginWaitTypeAnd[T jobmgr.Event](set *jobmgr.EventSet, cond func(val T) bool) future.Future1[jobmgr.Event] {
// 等待一个满足特定类型和条件的事件。
return set.BeginWait(func(evt jobmgr.Event) bool {
// 尝试将事件断言为特定类型T并检查断言是否成功。
e, ok := evt.(T)
if !ok {
return false // 如果事件不是期望的类型T则返回false。
}
// 如果事件是类型T且满足给定条件则返回true。
return cond(e)
})
}