77 lines
3.0 KiB
Go
77 lines
3.0 KiB
Go
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)
|
||
})
|
||
}
|