dotcloud/docker

View on GitHub
libcontainerd/queue/queue.go

Summary

Maintainability
A
0 mins
Test Coverage
package queue // import "github.com/docker/docker/libcontainerd/queue"

import "sync"

// Queue is the structure used for holding functions in a queue.
type Queue struct {
    sync.Mutex
    fns map[string]chan struct{}
}

// Append adds an item to a queue.
func (q *Queue) Append(id string, f func()) {
    q.Lock()
    defer q.Unlock()

    if q.fns == nil {
        q.fns = make(map[string]chan struct{})
    }

    done := make(chan struct{})

    fn, ok := q.fns[id]
    q.fns[id] = done
    go func() {
        if ok {
            <-fn
        }
        f()
        close(done)

        q.Lock()
        if q.fns[id] == done {
            delete(q.fns, id)
        }
        q.Unlock()
    }()
}