Rainbond/pkg/node/event/event.go
2017-11-07 11:40:44 +08:00

114 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// RAINBOND, Application Management Platform
// Copyright (C) 2014-2017 Goodrain Co., Ltd.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version. For any non-GPL usage of Rainbond,
// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd.
// must be obtained first.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package event
import (
"fmt"
"os"
"os/signal"
"reflect"
"syscall"
)
const (
EXIT = "exit"
WAIT = "wait"
)
var (
Events = make(map[string][]func(interface{}), 2)
)
func On(name string, fs ...func(interface{})) error {
evs, ok := Events[name]
if !ok {
evs = make([]func(interface{}), 0, len(fs))
}
for _, f := range fs {
fp := reflect.ValueOf(f).Pointer()
for i := 0; i < len(evs); i++ {
if reflect.ValueOf(evs[i]).Pointer() == fp {
return fmt.Errorf("func[%v] already exists in event[%s]", fp, name)
}
}
evs = append(evs, f)
}
Events[name] = evs
return nil
}
func Emit(name string, arg interface{}) {
evs, ok := Events[name]
if !ok {
return
}
for _, f := range evs {
f(arg)
}
}
func EmitAll(arg interface{}) {
for _, fs := range Events {
for _, f := range fs {
f(arg)
}
}
return
}
func Off(name string, f func(interface{})) error {
evs, ok := Events[name]
if !ok || len(evs) == 0 {
return fmt.Errorf("envet[%s] doesn't have any funcs", name)
}
fp := reflect.ValueOf(f).Pointer()
for i := 0; i < len(evs); i++ {
if reflect.ValueOf(evs[i]).Pointer() == fp {
evs = append(evs[:i], evs[i+1:]...)
Events[name] = evs
return nil
}
}
return fmt.Errorf("%v func dones't exist in event[%s]", fp, name)
}
func OffAll(name string) error {
Events[name] = nil
return nil
}
// 等待信号
// 如果信号参数为空,则会等待常见的终止信号
// SIGINT 2 A 键盘中断如break键被按下
// SIGTERM 15 A 终止信号
func Wait(sig ...os.Signal) os.Signal {
c := make(chan os.Signal, 1)
if len(sig) == 0 {
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
} else {
signal.Notify(c, sig...)
}
return <-c
}