nabbar/golib

Progress & Semaphone aren't incremented on defer worker

Opened this issue · 1 comments

package main

import (
  "context"
  "runtime"
  "time"

  "github.com/nabbar/golib/semaphore"
  mpbv8 "github.com/vbauerster/mpb/v8"
)

const total = 100

func main() {
  // Create bar from semaphore
  sem := semaphore.New(context.Background(), runtime.GOMAXPROCS(0), true, mpbv8.WithWidth(64)).
    BarNumber("test", "", total, false, nil)

  // Defer semaphore end
  defer sem.DeferMain()

  for _ = range total {
    // Try to acquire new worker on semaphore
    if e := sem.NewWorker(); e != nil {
      panic(e)
    }

    // Execute goroutine calling DeferWorker
    go func() {
      defer sem.DeferWorker() // progress & semaphone current won't be incremented on defer worker
      time.Sleep(100 * time.Millisecond)
      //sem.Inc(1) // workaround
    }()
  }
 if e := sem.WaitAll(); e != nil {
    panic(e)
  }
}

Hi @sabouaram & @nabbar

I think this issue can be fixed by updating the function DeferWorker in file semaphore/bar/semaphore.go as follow :

func (o *bar) DeferWorker() {
	o.Inc(1)          // Increment current value of the bar
	o.s.DeferWorker() // Release one thread from semaphore
}

Regards,
Thomas 🤠