diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 3023b0366..f12976b44 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -197,7 +197,7 @@ }, { "ImportPath": "github.com/jbenet/goprocess", - "Rev": "67fe91f1081e806f1bb51051c972ac782ea46d85" + "Rev": "a6650d0b69f2aa0fe7c9685baf0b4d7ecc8766bf" }, { "ImportPath": "github.com/kardianos/osext", diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/context/context.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/context/context.go index 2cdf2e522..cb4aa3ef8 100644 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/context/context.go +++ b/Godeps/_workspace/src/github.com/jbenet/goprocess/context/context.go @@ -10,19 +10,23 @@ import ( // // func ProcessWithContext(ctx context.Context) goprocess.Process { // p := goprocess.WithParent(goprocess.Background()) -// go func() { -// <-ctx.Done() -// p.Close() -// }() +// CloseAfterContext(p, ctx) // return p // } // func WithContext(ctx context.Context) goprocess.Process { + p := goprocess.WithParent(goprocess.Background()) + CloseAfterContext(p, ctx) + return p +} + +// WithContextAndTeardown is a helper function to set teardown at initiation +// of WithContext +func WithContextAndTeardown(ctx context.Context, tf goprocess.TeardownFunc) goprocess.Process { if ctx == nil { panic("nil Context") } - - p := goprocess.WithParent(goprocess.Background()) + p := goprocess.WithTeardown(tf) go func() { <-ctx.Done() p.Close() @@ -39,6 +43,30 @@ func WaitForContext(ctx context.Context, p goprocess.Process) { p.WaitFor(WithContext(ctx)) } +// CloseAfterContext schedules the process to close after the given +// context is done. It is the equivalent of: +// +// func CloseAfterContext(p goprocess.Process, ctx context.Context) { +// go func() { +// <-ctx.Done() +// p.Close() +// }() +// } +// +func CloseAfterContext(p goprocess.Process, ctx context.Context) { + if p == nil { + panic("nil Process") + } + if ctx == nil { + panic("nil Context") + } + + go func() { + <-ctx.Done() + p.Close() + }() +} + // WithProcessClosing returns a context.Context derived from ctx that // is cancelled as p is Closing (after: <-p.Closing()). It is simply: // diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess.go index 17cb37799..f51ad512d 100644 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess.go +++ b/Godeps/_workspace/src/github.com/jbenet/goprocess/goprocess.go @@ -114,7 +114,7 @@ type Process interface { // // It is useful to construct simple asynchronous workers, children of p. Go(f ProcessFunc) Process - + // SetTeardown sets the process's teardown to tf. SetTeardown(tf TeardownFunc) diff --git a/Godeps/_workspace/src/github.com/jbenet/goprocess/impl-mutex.go b/Godeps/_workspace/src/github.com/jbenet/goprocess/impl-mutex.go index de246a8fa..e2a780183 100644 --- a/Godeps/_workspace/src/github.com/jbenet/goprocess/impl-mutex.go +++ b/Godeps/_workspace/src/github.com/jbenet/goprocess/impl-mutex.go @@ -119,8 +119,16 @@ func (p *process) SetTeardown(tf TeardownFunc) { if tf == nil { tf = nilTeardownFunc } + p.Lock() - p.teardown = tf + if p.teardown == nil { + select { + case <-p.Closed(): + p.teardown = tf + p.closeErr = tf() + default: + } + } p.Unlock() }