qjs/loop.go

52 lines
729 B
Go

package quickjs
type Job func()
type Loop struct {
jobChan chan Job
}
func NewLoop() *Loop {
return &Loop{
jobChan: make(chan Job, 1024),
}
}
// AddJob adds a job to the loop.
func (l *Loop) scheduleJob(j Job) error {
l.jobChan <- j
return nil
}
// AddJob adds a job to the loop.
func (l *Loop) isLoopPending() bool {
return len(l.jobChan) > 0
}
// run executes all pending jobs.
func (l *Loop) run() error {
for {
select {
case job, ok := <-l.jobChan:
if !ok {
break
}
job()
default:
// Escape valve!
// If this isn't here, we deadlock...
}
if len(l.jobChan) == 0 {
break
}
}
return nil
}
// stop stops the loop.
func (l *Loop) stop() error {
close(l.jobChan)
return nil
}