github.com/DARA-Project/GoDist-Scheduler@v0.0.0-20201030134746-668de4acea0d/examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "os" 8 "runtime" 9 "runtime/pprof" 10 ) 11 12 type Consumer struct { 13 msgs *chan int 14 } 15 16 // NewConsumer creates a Consumer 17 func NewConsumer(msgs *chan int) *Consumer { 18 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:19:21") 19 return &Consumer{msgs: msgs} 20 } 21 22 // consume reads the msgs channel 23 func (c *Consumer) consume() { 24 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:25:27") 25 fmt.Println("[consume]: Started") 26 for { 27 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:28:103") 28 msg := <-*c.msgs 29 fmt.Println("[consume]: Received:", msg) 30 } 31 } 32 33 // Producer definition 34 type Producer struct { 35 msgs *chan int 36 done *chan bool 37 } 38 39 // NewProducer creates a Producer 40 func NewProducer(msgs *chan int, done *chan bool) *Producer { 41 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:42:103") 42 return &Producer{msgs: msgs, done: done} 43 } 44 45 // produce creates and sends the message through msgs channel 46 func (p *Producer) produce(max int) { 47 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:48:103") 48 fmt.Println("[produce]: Started") 49 for i := 0; i < max; i++ { 50 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:51:103") 51 fmt.Println("[produce]: Sending ", i) 52 *p.msgs <- i 53 } 54 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:55:55") 55 *p.done <- true 56 fmt.Println("[produce]: Done") 57 } 58 59 func main() { 60 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:61:103") 61 62 cpuprofile := flag.String("cpuprofile", "", "write cpu profile to `file`") 63 memprofile := flag.String("memprofile", "", "write memory profile to `file`") 64 65 max := flag.Int("n", 5, "defines the number of messages") 66 67 flag.Parse() 68 69 if *cpuprofile != "" { 70 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:77:103") 71 f, err := os.Create(*cpuprofile) 72 if err != nil { 73 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:80:84") 74 log.Fatal("could not create CPU profile: ", err) 75 } 76 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:83:86") 77 if err := pprof.StartCPUProfile(f); err != nil { 78 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:85:86") 79 log.Fatal("could not start CPU profile: ", err) 80 } 81 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:88:84") 82 defer pprof.StopCPUProfile() 83 } 84 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:91:105") 85 86 var msgs = make(chan int) // channel to send messages 87 var done = make(chan bool) // channel to control when production is done 88 89 go NewProducer(&msgs, &done).produce(*max) 90 91 go NewConsumer(&msgs).consume() 92 93 <-done 94 95 runtime.DaraLog("LeftElements", "main.leftElements", runtime.NumSendings(msgs) - runtime.NumDeliveries(msgs)) 96 97 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:97:119") 98 99 if *memprofile != "" { 100 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:100:102") 101 f, err := os.Create(*memprofile) 102 if err != nil { 103 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:103:112") 104 log.Fatal("could not create memory profile: ", err) 105 } 106 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:106:115") 107 runtime.GC() 108 if err := pprof.WriteHeapProfile(f); err != nil { 109 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:109:119") 110 log.Fatal("could not write memory profile: ", err) 111 } 112 runtime.ReportBlockCoverage("../examples/ProducerConsumerInstrument/ProducerConsumerInstrument.go:112:111") 113 f.Close() 114 } 115 }