parent
9c74296c27
commit
8cf92167df
|
@ -1 +1,2 @@
|
|||
/cmd/wingmate/wingmatecmd/pidproxy/pidproxy
|
||||
/cmd/wingmate/wingmate
|
||||
/cmd/pidproxy/pidproxy
|
|
@ -8,7 +8,8 @@ RUN make all
|
|||
|
||||
FROM debian:bookworm
|
||||
|
||||
RUN ln -sf /usr/share/zoneinfo/Australia/Sydney /etc/localtime
|
||||
RUN ln -sf /usr/share/zoneinfo/Australia/Sydney /etc/localtime && \
|
||||
apt update && apt install -y procps
|
||||
COPY --from=builder /root/wingmate/cmd/wingmate/wingmate /usr/local/bin/wingmate
|
||||
COPY --from=builder /root/wingmate/cmd/experiment/dummy/dummy /usr/local/bin/wmdummy
|
||||
COPY --from=builder /root/wingmate/cmd/experiment/starter/starter /usr/local/bin/wmstarter
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package init
|
||||
|
||||
import (
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
@ -34,17 +35,19 @@ func (i *Init) Start() {
|
|||
wg *sync.WaitGroup
|
||||
signalTrigger chan any
|
||||
sighandlerExit chan any
|
||||
sigchld chan os.Signal
|
||||
)
|
||||
|
||||
signalTrigger = make(chan any)
|
||||
sighandlerExit = make(chan any)
|
||||
sigchld = make(chan os.Signal, 1)
|
||||
|
||||
wg = &sync.WaitGroup{}
|
||||
wg.Add(1)
|
||||
go i.waiter(wg, signalTrigger, sighandlerExit)
|
||||
go i.waiter(wg, signalTrigger, sighandlerExit, sigchld)
|
||||
|
||||
wg.Add(1)
|
||||
go i.sighandler(wg, signalTrigger, sighandlerExit)
|
||||
go i.sighandler(wg, signalTrigger, sighandlerExit, sigchld)
|
||||
|
||||
for _, s := range i.config.Services() {
|
||||
wg.Add(1)
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
func (i *Init) sighandler(wg *sync.WaitGroup, trigger chan<- any, selfExit <-chan any) {
|
||||
func (i *Init) sighandler(wg *sync.WaitGroup, trigger chan<- any, selfExit <-chan any, sigchld chan<- os.Signal) {
|
||||
defer wg.Done()
|
||||
|
||||
defer func() {
|
||||
|
@ -35,7 +35,10 @@ signal:
|
|||
isOpen = false
|
||||
}
|
||||
case unix.SIGCHLD:
|
||||
// do nothing
|
||||
select {
|
||||
case sigchld <- s:
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
case <-selfExit:
|
||||
|
|
|
@ -2,20 +2,20 @@ package init
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gitea.suyono.dev/suyono/wingmate"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag chan<- any) {
|
||||
func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag chan<- any, sigchld <-chan os.Signal) {
|
||||
var (
|
||||
ws unix.WaitStatus
|
||||
// pid int
|
||||
err error
|
||||
running bool
|
||||
flagged bool
|
||||
ws unix.WaitStatus
|
||||
err error
|
||||
running bool
|
||||
flagged bool
|
||||
waitingForSignal bool
|
||||
)
|
||||
defer wg.Done()
|
||||
|
||||
|
@ -25,14 +25,27 @@ func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag
|
|||
|
||||
running = true
|
||||
flagged = true
|
||||
waitingForSignal = true
|
||||
wait:
|
||||
for {
|
||||
if running {
|
||||
select {
|
||||
case <-runningFlag:
|
||||
wingmate.Log().Info().Msg("waiter received shutdown signal...")
|
||||
running = false
|
||||
default:
|
||||
if waitingForSignal {
|
||||
select {
|
||||
case <-runningFlag:
|
||||
wingmate.Log().Info().Msg("waiter received shutdown signal...")
|
||||
running = false
|
||||
case <-sigchld:
|
||||
waitingForSignal = false
|
||||
}
|
||||
|
||||
} else {
|
||||
select {
|
||||
case <-runningFlag:
|
||||
wingmate.Log().Info().Msg("waiter received shutdown signal...")
|
||||
running = false
|
||||
default:
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,7 +63,7 @@ wait:
|
|||
}
|
||||
|
||||
wingmate.Log().Warn().Msgf("Wait4 returns error: %+v", err)
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
waitingForSignal = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue