mirror of https://github.com/Hilbis/Hilbish
76 lines
1.2 KiB
Go
76 lines
1.2 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
|
||
|
"github.com/yuin/gopher-lua"
|
||
|
)
|
||
|
|
||
|
var jobs *jobHandler
|
||
|
|
||
|
type job struct {
|
||
|
cmd string
|
||
|
running bool
|
||
|
id int
|
||
|
pid int
|
||
|
exitCode int
|
||
|
}
|
||
|
|
||
|
func (j *job) start(pid int) {
|
||
|
j.pid = pid
|
||
|
j.running = true
|
||
|
hooks.Em.Emit("job.start", j.lua())
|
||
|
}
|
||
|
|
||
|
func (j *job) finish() {
|
||
|
j.running = false
|
||
|
hooks.Em.Emit("job.done", j.lua())
|
||
|
}
|
||
|
|
||
|
func (j *job) lua() *lua.LTable {
|
||
|
// returns lua table for job
|
||
|
// because userdata is gross
|
||
|
luaJob := l.NewTable()
|
||
|
|
||
|
l.SetField(luaJob, "cmd", lua.LString(j.cmd))
|
||
|
l.SetField(luaJob, "running", lua.LBool(j.running))
|
||
|
l.SetField(luaJob, "id", lua.LNumber(j.id))
|
||
|
l.SetField(luaJob, "pid", lua.LNumber(j.pid))
|
||
|
l.SetField(luaJob, "exitCode", lua.LNumber(j.exitCode))
|
||
|
|
||
|
return luaJob
|
||
|
}
|
||
|
|
||
|
type jobHandler struct {
|
||
|
jobs map[int]*job
|
||
|
latestID int
|
||
|
mu *sync.RWMutex
|
||
|
}
|
||
|
|
||
|
func newJobHandler() *jobHandler {
|
||
|
return &jobHandler{
|
||
|
jobs: make(map[int]*job),
|
||
|
latestID: 0,
|
||
|
mu: &sync.RWMutex{},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (j *jobHandler) add(cmd string) {
|
||
|
j.mu.Lock()
|
||
|
defer j.mu.Unlock()
|
||
|
|
||
|
j.latestID++
|
||
|
j.jobs[j.latestID] = &job{
|
||
|
cmd: cmd,
|
||
|
running: false,
|
||
|
id: j.latestID,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (j *jobHandler) getLatest() *job {
|
||
|
j.mu.RLock()
|
||
|
defer j.mu.RUnlock()
|
||
|
|
||
|
return j.jobs[j.latestID]
|
||
|
}
|