mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-19 03:25:16 +00:00
93 lines
1.7 KiB
Go
93 lines
1.7 KiB
Go
|
package suture
|
||
|
|
||
|
// sum type pattern for type-safe message passing; see
|
||
|
// http://www.jerf.org/iri/post/2917
|
||
|
|
||
|
type supervisorMessage interface {
|
||
|
isSupervisorMessage()
|
||
|
}
|
||
|
|
||
|
type listServices struct {
|
||
|
c chan []Service
|
||
|
}
|
||
|
|
||
|
func (ls listServices) isSupervisorMessage() {}
|
||
|
|
||
|
type removeService struct {
|
||
|
id serviceID
|
||
|
}
|
||
|
|
||
|
func (rs removeService) isSupervisorMessage() {}
|
||
|
|
||
|
func (s *Supervisor) sync() {
|
||
|
s.control <- syncSupervisor{}
|
||
|
}
|
||
|
|
||
|
type syncSupervisor struct {
|
||
|
}
|
||
|
|
||
|
func (ss syncSupervisor) isSupervisorMessage() {}
|
||
|
|
||
|
func (s *Supervisor) fail(id serviceID, err interface{}, stacktrace []byte) {
|
||
|
s.control <- serviceFailed{id, err, stacktrace}
|
||
|
}
|
||
|
|
||
|
type serviceFailed struct {
|
||
|
id serviceID
|
||
|
err interface{}
|
||
|
stacktrace []byte
|
||
|
}
|
||
|
|
||
|
func (sf serviceFailed) isSupervisorMessage() {}
|
||
|
|
||
|
func (s *Supervisor) serviceEnded(id serviceID) {
|
||
|
s.sendControl(serviceEnded{id})
|
||
|
}
|
||
|
|
||
|
type serviceEnded struct {
|
||
|
id serviceID
|
||
|
}
|
||
|
|
||
|
func (s serviceEnded) isSupervisorMessage() {}
|
||
|
|
||
|
// added by the Add() method
|
||
|
type addService struct {
|
||
|
service Service
|
||
|
name string
|
||
|
response chan serviceID
|
||
|
}
|
||
|
|
||
|
func (as addService) isSupervisorMessage() {}
|
||
|
|
||
|
// Stop stops the Supervisor.
|
||
|
//
|
||
|
// This function will not return until either all Services have stopped, or
|
||
|
// they timeout after the timeout value given to the Supervisor at creation.
|
||
|
func (s *Supervisor) Stop() {
|
||
|
done := make(chan struct{})
|
||
|
if s.sendControl(stopSupervisor{done}) {
|
||
|
<-done
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type stopSupervisor struct {
|
||
|
done chan struct{}
|
||
|
}
|
||
|
|
||
|
func (ss stopSupervisor) isSupervisorMessage() {}
|
||
|
|
||
|
func (s *Supervisor) panic() {
|
||
|
s.control <- panicSupervisor{}
|
||
|
}
|
||
|
|
||
|
type serviceTerminated struct {
|
||
|
id serviceID
|
||
|
}
|
||
|
|
||
|
func (st serviceTerminated) isSupervisorMessage() {}
|
||
|
|
||
|
type panicSupervisor struct {
|
||
|
}
|
||
|
|
||
|
func (ps panicSupervisor) isSupervisorMessage() {}
|