// Copyright (C) 2014-2018 Goodrain Co., Ltd. // RAINBOND, Application Management Platform // 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 . 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 }