You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
2.1 KiB
Go
119 lines
2.1 KiB
Go
/*
|
|
****************************
|
|
struct EventSystem
|
|
****************************
|
|
session의 Job queue
|
|
각 세션마다 자기 자신이 처리해야 할 Event struct의 Event ID를 저장하는 JobQ를 가진다.
|
|
*/
|
|
|
|
package icsevent
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
|
)
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//전역 세션용 이벤트 시스템 구조체.
|
|
type EventSystem struct {
|
|
id int //session id
|
|
JobQ *RRData //event id q for session
|
|
m *sync.Mutex
|
|
}
|
|
|
|
var bigEvtSystem []*EventSystem
|
|
var onceEvtSystem sync.Once
|
|
|
|
//make singleton EventSystem struct
|
|
func GetEvtSystemInstance() []*EventSystem {
|
|
onceEvtSystem.Do(func() {
|
|
bigEvtSystem = make([]*EventSystem, channelNum)
|
|
|
|
for iter := 0; iter < channelNum; iter++ {
|
|
bigEvtSystem[iter] = new(EventSystem)
|
|
bigEvtSystem[iter].Init(iter)
|
|
}
|
|
})
|
|
|
|
return bigEvtSystem
|
|
}
|
|
|
|
func SetChannelNum(chNum int) {
|
|
channelNum = chNum
|
|
}
|
|
|
|
func (es *EventSystem) Init(id int) {
|
|
es.id = id
|
|
es.JobQ = NewRRData()
|
|
es.m = &sync.Mutex{}
|
|
}
|
|
|
|
func GetMyEventSystem(id int) *EventSystem {
|
|
es := GetEvtSystemInstance()
|
|
return es[id]
|
|
}
|
|
|
|
func (es *EventSystem) GetMyID() int {
|
|
return es.id
|
|
}
|
|
|
|
func (es *EventSystem) PutJob(event *Event) (err *icserror.IcsError) {
|
|
if event == nil {
|
|
return icserror.ICSERRInvalidParam
|
|
}
|
|
if es.JobQ == nil {
|
|
return icserror.ICSERREVTNotInit
|
|
}
|
|
|
|
es.m.Lock()
|
|
rrerr := Push(es.JobQ, event.ID)
|
|
if rrerr != nil {
|
|
es.m.Unlock()
|
|
return rrerr
|
|
}
|
|
es.m.Unlock()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (es *EventSystem) GetJob() (pos int, err *icserror.IcsError) {
|
|
if es.JobQ == nil {
|
|
return -1, icserror.ICSERREVTNotInit
|
|
}
|
|
|
|
es.m.Lock()
|
|
var data interface{}
|
|
var h *RRData
|
|
h, data, err = Pop(es.JobQ)
|
|
//es.JobQ, data, err = icsutil.Pop(es.JobQ)
|
|
if err != nil || data == nil {
|
|
//err.Print()
|
|
es.m.Unlock()
|
|
return -1, err
|
|
}
|
|
|
|
switch v := data.(type) {
|
|
case int:
|
|
es.JobQ = h
|
|
pos = v
|
|
|
|
default:
|
|
pos = -1
|
|
es.m.Unlock()
|
|
return pos, nil
|
|
}
|
|
es.m.Unlock()
|
|
|
|
return pos, nil
|
|
}
|
|
|
|
func (es *EventSystem) ClearJob() (err *icserror.IcsError) {
|
|
h := NewEventH()
|
|
for pos, err := es.GetJob(); err != nil; {
|
|
h.removeEvent(pos)
|
|
}
|
|
|
|
return nil
|
|
}
|