Created
June 21, 2018 06:44
-
-
Save hauxe/e503c82527d0f2b8bb94714096e0a735 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Compete compete for resource | |
func (mux *GreedyMutex) Compete(ctx context.Context, resource interface{}) { | |
mux.Lock() | |
greedyEntities := []PrioritizedEntity{} | |
defer func() { go mux.Compete(ctx, resource) }() | |
defer mux.Unlock() | |
defer func() { | |
var winner PrioritizedEntity | |
for _, entity := range greedyEntities { | |
if winner == nil || winner.GetPriority() < entity.GetPriority() { | |
winner = entity | |
} | |
} | |
if winner != nil { | |
winner.AccessResource(resource) | |
} | |
}() | |
// wait until have a request for resource | |
entity := <-mux.queue | |
greedyEntities = append(greedyEntities, entity) | |
c := time.NewTicker(mux.TimeToWait) | |
for { | |
select { | |
case <-ctx.Done(): | |
return | |
case <-c.C: | |
c.Stop() | |
return | |
case entity := <-mux.queue: | |
greedyEntities = append(greedyEntities, entity) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment