Guest User

Untitled

a guest
Jun 22nd, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.79 KB | None | 0 0
  1. // Compete compete for resource
  2. func (mux *GreedyMutex) Compete(ctx context.Context, resource interface{}) {
  3. mux.Lock()
  4. greedyEntities := []PrioritizedEntity{}
  5. defer func() { go mux.Compete(ctx, resource) }()
  6. defer mux.Unlock()
  7. defer func() {
  8. var winner PrioritizedEntity
  9. for _, entity := range greedyEntities {
  10. if winner == nil || winner.GetPriority() < entity.GetPriority() {
  11. winner = entity
  12. }
  13. }
  14. if winner != nil {
  15. winner.AccessResource(resource)
  16. }
  17. }()
  18. // wait until have a request for resource
  19. entity := <-mux.queue
  20. greedyEntities = append(greedyEntities, entity)
  21. c := time.NewTicker(mux.TimeToWait)
  22. for {
  23. select {
  24. case <-ctx.Done():
  25. return
  26. case <-c.C:
  27. c.Stop()
  28. return
  29. case entity := <-mux.queue:
  30. greedyEntities = append(greedyEntities, entity)
  31. }
  32. }
  33. }
Add Comment
Please, Sign In to add comment