utils.go 904 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // License: GPLv3 Copyright: 2023, Kovid Goyal, <kovid at kovidgoyal.net>
  2. package images
  3. import (
  4. "fmt"
  5. "runtime"
  6. "sync"
  7. "sync/atomic"
  8. )
  9. var _ = fmt.Print
  10. type Context struct {
  11. num_of_threads atomic.Int32
  12. }
  13. func (self *Context) SetNumberOfThreads(n int) {
  14. self.num_of_threads.Store(int32(n))
  15. }
  16. func (self *Context) NumberOfThreads() int {
  17. return int(self.num_of_threads.Load())
  18. }
  19. // parallel processes the data in separate goroutines.
  20. func (self *Context) Parallel(start, stop int, fn func(<-chan int)) {
  21. count := stop - start
  22. if count < 1 {
  23. return
  24. }
  25. procs := self.NumberOfThreads()
  26. if procs <= 0 {
  27. procs = runtime.NumCPU()
  28. }
  29. if procs > count {
  30. procs = count
  31. }
  32. c := make(chan int, count)
  33. for i := start; i < stop; i++ {
  34. c <- i
  35. }
  36. close(c)
  37. var wg sync.WaitGroup
  38. for i := 0; i < procs; i++ {
  39. wg.Add(1)
  40. go func() {
  41. defer wg.Done()
  42. fn(c)
  43. }()
  44. }
  45. wg.Wait()
  46. }