gopkg.in/simversity/gottp.v3@v3.0.0-20160401065405-576cf030ca0e/worker.go (about)

     1  package gottp
     2  
     3  import (
     4  	"log"
     5  	"sync"
     6  	"time"
     7  )
     8  
     9  var worker func(chan bool)
    10  
    11  var errChan = make(chan bool)
    12  
    13  var exitChan = make(chan bool, 1)
    14  
    15  var wg = new(sync.WaitGroup)
    16  
    17  func spawner() {
    18  	go workerWrapper()
    19  
    20  	_, ok := <-errChan
    21  	if !ok {
    22  		log.Println("Timing out in 10 seconds")
    23  		time.Sleep(10 * time.Second)
    24  		wg.Done()
    25  		return
    26  	}
    27  
    28  	go spawner()
    29  }
    30  
    31  func workerWrapper() {
    32  	wg.Add(1)
    33  	defer wg.Done()
    34  
    35  	// Trusing the fact that Tracer will always execute callback.
    36  	defer Tracer.Notify(func(reason string) string {
    37  		errChan <- true
    38  		return "Exception in worker: " + reason
    39  	})
    40  
    41  	worker(exitChan)
    42  }
    43  
    44  func RunWorker(wk func(chan bool)) {
    45  	if worker != nil {
    46  		panic("Worker already running.")
    47  	}
    48  	worker = wk
    49  	go spawner()
    50  }
    51  
    52  func shutdownWorker() {
    53  	if worker == nil {
    54  		return
    55  	}
    56  
    57  	log.Println("Preparing for shutdown")
    58  	exitChan <- true
    59  	close(errChan)
    60  	wg.Wait()
    61  }