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  }