Merge "discovery: change Advertise() to return done channel"
diff --git a/go/src/vanadium/discovery/internal/discovery.go b/go/src/vanadium/discovery/internal/discovery.go
index b5a3d58..c577c59 100644
--- a/go/src/vanadium/discovery/internal/discovery.go
+++ b/go/src/vanadium/discovery/internal/discovery.go
@@ -7,13 +7,13 @@
import (
"sync"
- "v.io/v23/context"
- "v.io/v23/discovery"
- "v.io/v23/verror"
-
"mojo/public/go/bindings"
mojom "mojom/vanadium/discovery"
+
+ "v.io/v23/context"
+ "v.io/v23/discovery"
"v.io/v23/security"
+ "v.io/v23/verror"
)
type id uint32
@@ -74,14 +74,17 @@
for i, pattern := range patterns {
perms[i] = security.BlessingPattern(pattern)
}
- err := d.s.Advertise(ctx, vService, perms)
+ done, err := d.s.Advertise(ctx, vService, perms)
if err != nil {
cancel()
return 0, v2mError(err), nil
}
d.mu.Lock()
currId := d.nextAdv
- d.activeAdvs[currId] = cancel
+ d.activeAdvs[currId] = func() {
+ cancel()
+ <-done
+ }
d.nextAdv += 2
d.mu.Unlock()
return uint32(currId), nil, nil
@@ -89,11 +92,11 @@
func (d *DiscoveryService) stopAdvertising(handle uint32) error {
d.mu.Lock()
- cancel := d.activeAdvs[id(handle)]
+ stop := d.activeAdvs[id(handle)]
delete(d.activeAdvs, id(handle))
d.mu.Unlock()
- if cancel != nil {
- cancel()
+ if stop != nil {
+ stop()
}
return nil
}
diff --git a/go/src/vanadium/discovery/internal/discovery_test.go b/go/src/vanadium/discovery/internal/discovery_test.go
index 7cc2dd2..b9ff152 100644
--- a/go/src/vanadium/discovery/internal/discovery_test.go
+++ b/go/src/vanadium/discovery/internal/discovery_test.go
@@ -6,19 +6,20 @@
import (
"reflect"
+ "sync"
"testing"
+ "third_party/go/tool/android_arm/src/fmt"
+
+ mojom "mojom/vanadium/discovery"
+
"v.io/v23/context"
"v.io/v23/discovery"
- idiscovery "v.io/x/ref/lib/discovery"
- vtest "v.io/x/ref/test"
-
- _ "v.io/x/ref/runtime/factories/generic"
-
- mojom "mojom/vanadium/discovery"
- "sync"
- "third_party/go/tool/android_arm/src/fmt"
"v.io/v23/security"
+
+ idiscovery "v.io/x/ref/lib/discovery"
+ _ "v.io/x/ref/runtime/factories/generic"
+ vtest "v.io/x/ref/test"
)
type mockAdv struct {
@@ -34,20 +35,23 @@
deleteCh chan struct{}
}
-func (d *discoveryMock) Advertise(ctx *context.T, s discovery.Service, perms []security.BlessingPattern) error {
+func (d *discoveryMock) Advertise(ctx *context.T, s discovery.Service, perms []security.BlessingPattern) (<-chan struct{}, error) {
d.mu.Lock()
currId := d.id
d.services[currId] = s
d.id++
d.mu.Unlock()
- c := func() {
+ done := make(chan struct{})
+ stop := func() {
d.mu.Lock()
delete(d.services, currId)
d.mu.Unlock()
- d.deleteCh <- struct{}{}
+ close(done)
+
+ go func() { d.deleteCh <- struct{}{} }()
}
- d.trigger.Add(c, ctx.Done())
- return nil
+ d.trigger.Add(stop, ctx.Done())
+ return done, nil
}
func (*discoveryMock) Scan(ctx *context.T, query string) (<-chan discovery.Update, error) {