package event_processor
import (
"stackplz/user/event"
"time"
"golang.org/x/sys/unix"
)
type IWorker interface {
Write(event.IEventStruct) error
GetUUID() string
}
const (
MAX_TICKER_COUNT = 10
MAX_CHAN_LEN = 256
)
type eventWorker struct {
incoming chan event.IEventStruct
ticker *time.Ticker
tickerCount uint8
UUID string
processor *EventProcessor
}
func NewEventWorker(uuid string, processor *EventProcessor) IWorker {
eWorker := &eventWorker{}
eWorker.init(uuid, processor)
go func() {
eWorker.Run()
}()
return eWorker
}
func (this *eventWorker) init(uuid string, processor *EventProcessor) {
this.ticker = time.NewTicker(time.Millisecond * 100)
this.incoming = make(chan event.IEventStruct, MAX_CHAN_LEN)
this.UUID = uuid
this.processor = processor
}
func (this *eventWorker) GetUUID() string {
return this.UUID
}
func (this *eventWorker) Write(e event.IEventStruct) error {
this.incoming <- e
return nil
}
func (this *eventWorker) Display() {
}
func (this *eventWorker) parserEvent(e event.IEventStruct) {
logger := this.processor.GetLogger()
switch e.RecordType() {
case unix.PERF_RECORD_COMM:
case unix.PERF_RECORD_MMAP2:
case unix.PERF_RECORD_EXIT:
case unix.PERF_RECORD_FORK:
{
break
}
default:
{
logger.Println(e.String())
}
}
}
func (this *eventWorker) Run() {
for {
select {
case _ = <-this.ticker.C:
if this.tickerCount > MAX_TICKER_COUNT {
this.Close()
return
}
this.tickerCount++
case e := <-this.incoming:
this.tickerCount = 0
this.parserEvent(e)
}
}
}
func (this *eventWorker) Close() {
this.Display()
this.tickerCount = 0
this.processor.delWorkerByUUID(this)
}