chore: fix .gitignore
feat(waiter): waiting for signal
This commit is contained in:
parent
9c74296c27
commit
8cf92167df
3
.gitignore
vendored
3
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
/cmd/wingmate/wingmatecmd/pidproxy/pidproxy
|
/cmd/wingmate/wingmate
|
||||||
|
/cmd/pidproxy/pidproxy
|
||||||
@ -8,7 +8,8 @@ RUN make all
|
|||||||
|
|
||||||
FROM debian:bookworm
|
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/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/dummy/dummy /usr/local/bin/wmdummy
|
||||||
COPY --from=builder /root/wingmate/cmd/experiment/starter/starter /usr/local/bin/wmstarter
|
COPY --from=builder /root/wingmate/cmd/experiment/starter/starter /usr/local/bin/wmstarter
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package init
|
package init
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -34,17 +35,19 @@ func (i *Init) Start() {
|
|||||||
wg *sync.WaitGroup
|
wg *sync.WaitGroup
|
||||||
signalTrigger chan any
|
signalTrigger chan any
|
||||||
sighandlerExit chan any
|
sighandlerExit chan any
|
||||||
|
sigchld chan os.Signal
|
||||||
)
|
)
|
||||||
|
|
||||||
signalTrigger = make(chan any)
|
signalTrigger = make(chan any)
|
||||||
sighandlerExit = make(chan any)
|
sighandlerExit = make(chan any)
|
||||||
|
sigchld = make(chan os.Signal, 1)
|
||||||
|
|
||||||
wg = &sync.WaitGroup{}
|
wg = &sync.WaitGroup{}
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go i.waiter(wg, signalTrigger, sighandlerExit)
|
go i.waiter(wg, signalTrigger, sighandlerExit, sigchld)
|
||||||
|
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go i.sighandler(wg, signalTrigger, sighandlerExit)
|
go i.sighandler(wg, signalTrigger, sighandlerExit, sigchld)
|
||||||
|
|
||||||
for _, s := range i.config.Services() {
|
for _, s := range i.config.Services() {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import (
|
|||||||
"golang.org/x/sys/unix"
|
"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 wg.Done()
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
@ -35,7 +35,10 @@ signal:
|
|||||||
isOpen = false
|
isOpen = false
|
||||||
}
|
}
|
||||||
case unix.SIGCHLD:
|
case unix.SIGCHLD:
|
||||||
// do nothing
|
select {
|
||||||
|
case sigchld <- s:
|
||||||
|
default:
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case <-selfExit:
|
case <-selfExit:
|
||||||
|
|||||||
@ -2,20 +2,20 @@ package init
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
|
||||||
|
|
||||||
"gitea.suyono.dev/suyono/wingmate"
|
"gitea.suyono.dev/suyono/wingmate"
|
||||||
"golang.org/x/sys/unix"
|
"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 (
|
var (
|
||||||
ws unix.WaitStatus
|
ws unix.WaitStatus
|
||||||
// pid int
|
|
||||||
err error
|
err error
|
||||||
running bool
|
running bool
|
||||||
flagged bool
|
flagged bool
|
||||||
|
waitingForSignal bool
|
||||||
)
|
)
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
|
||||||
@ -25,15 +25,28 @@ func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag
|
|||||||
|
|
||||||
running = true
|
running = true
|
||||||
flagged = true
|
flagged = true
|
||||||
|
waitingForSignal = true
|
||||||
wait:
|
wait:
|
||||||
for {
|
for {
|
||||||
if running {
|
if running {
|
||||||
|
if waitingForSignal {
|
||||||
|
select {
|
||||||
|
case <-runningFlag:
|
||||||
|
wingmate.Log().Info().Msg("waiter received shutdown signal...")
|
||||||
|
running = false
|
||||||
|
case <-sigchld:
|
||||||
|
waitingForSignal = false
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
select {
|
select {
|
||||||
case <-runningFlag:
|
case <-runningFlag:
|
||||||
wingmate.Log().Info().Msg("waiter received shutdown signal...")
|
wingmate.Log().Info().Msg("waiter received shutdown signal...")
|
||||||
running = false
|
running = false
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = unix.Wait4(-1, &ws, 0, nil); err != nil {
|
if _, err = unix.Wait4(-1, &ws, 0, nil); err != nil {
|
||||||
@ -50,7 +63,7 @@ wait:
|
|||||||
}
|
}
|
||||||
|
|
||||||
wingmate.Log().Warn().Msgf("Wait4 returns error: %+v", err)
|
wingmate.Log().Warn().Msgf("Wait4 returns error: %+v", err)
|
||||||
time.Sleep(time.Millisecond * 100)
|
waitingForSignal = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user