go-hep.org/x/hep@v0.38.1/fwk/internal/fwktest/reducer.go (about) 1 // Copyright ©2017 The go-hep Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package fwktest 6 7 import ( 8 "fmt" 9 "reflect" 10 "sync" 11 12 "go-hep.org/x/hep/fwk" 13 ) 14 15 type reducer struct { 16 fwk.TaskBase 17 18 input string 19 exp int64 20 sum int64 21 nevts int 22 mux sync.RWMutex 23 } 24 25 func (tsk *reducer) Configure(ctx fwk.Context) error { 26 err := tsk.DeclInPort(tsk.input, reflect.TypeOf(int64(0))) 27 if err != nil { 28 return err 29 } 30 31 return err 32 } 33 34 func (tsk *reducer) StartTask(ctx fwk.Context) error { 35 var err error 36 return err 37 } 38 39 func (tsk *reducer) StopTask(ctx fwk.Context) error { 40 var err error 41 42 tsk.mux.RLock() 43 sum := tsk.sum 44 nevts := tsk.nevts 45 tsk.mux.RUnlock() 46 47 msg := ctx.Msg() 48 if sum != tsk.exp { 49 msg.Errorf("expected sum=%v. got=%v (nevts=%d)\n", tsk.exp, sum, nevts) 50 return fmt.Errorf("%s: expected sum=%v. got=%v (nevts=%d)", tsk.Name(), tsk.exp, sum, nevts) 51 } 52 msg.Debugf("expected sum=%v. got=%v (all GOOD) (nevts=%d)\n", tsk.exp, sum, nevts) 53 54 return err 55 } 56 57 func (tsk *reducer) Process(ctx fwk.Context) error { 58 var err error 59 60 tsk.mux.Lock() 61 tsk.nevts += 1 62 tsk.mux.Unlock() 63 64 store := ctx.Store() 65 v, err := store.Get(tsk.input) 66 if err != nil { 67 return err 68 } 69 70 val := v.(int64) 71 tsk.mux.Lock() 72 tsk.sum += val 73 sum := tsk.sum 74 tsk.mux.Unlock() 75 76 msg := ctx.Msg() 77 msg.Infof("sum=%d (id=%d|%d)\n", sum, ctx.ID(), ctx.Slot()) 78 return err 79 } 80 81 func newreducer(typ, name string, mgr fwk.App) (fwk.Component, error) { 82 var err error 83 84 tsk := &reducer{ 85 TaskBase: fwk.NewTask(typ, name, mgr), 86 input: "Input", 87 sum: 0, 88 exp: 0, 89 nevts: 0, 90 } 91 92 err = tsk.DeclProp("Input", &tsk.input) 93 if err != nil { 94 return nil, err 95 } 96 97 err = tsk.DeclProp("Sum", &tsk.exp) 98 if err != nil { 99 return nil, err 100 } 101 102 return tsk, err 103 } 104 105 func init() { 106 fwk.Register(reflect.TypeOf(reducer{}), newreducer) 107 }