More deadlock fixing...

Change-Id: I8db4f4b813eaefa7b3d3b4c3d3b6350cfe01b017
diff --git a/services/wsprd/ipc/server/dispatcher.go b/services/wsprd/ipc/server/dispatcher.go
index 8b96fa5..da16e45 100644
--- a/services/wsprd/ipc/server/dispatcher.go
+++ b/services/wsprd/ipc/server/dispatcher.go
@@ -3,6 +3,7 @@
 import (
 	"bytes"
 	"encoding/json"
+	"fmt"
 	"sync"
 
 	"v.io/wspr/veyron/services/wsprd/lib"
@@ -72,6 +73,16 @@
 	}
 }
 
+func (d *dispatcher) Cleanup() {
+	d.mu.Lock()
+	defer d.mu.Unlock()
+
+	for _, ch := range d.outstandingLookups {
+		verr := verror2.Convert(verror2.Internal, nil, fmt.Errorf("Cleaning up dispatcher")).(verror2.Standard)
+		ch <- lookupReply{Err: &verr}
+	}
+}
+
 // Lookup implements dispatcher interface Lookup.
 func (d *dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
 	flow := d.flowFactory.createFlow()
@@ -85,7 +96,8 @@
 		Suffix:   suffix,
 	}
 	if err := flow.Writer.Send(lib.ResponseDispatcherLookup, message); err != nil {
-		ch <- lookupReply{Err: verror2.Convert(verror2.Internal, nil, err).(*verror2.Standard)}
+		verr := verror2.Convert(verror2.Internal, nil, err).(verror2.Standard)
+		ch <- lookupReply{Err: &verr}
 	}
 	reply := <-ch
 
diff --git a/services/wsprd/ipc/server/server.go b/services/wsprd/ipc/server/server.go
index 321c624..b18e0af 100644
--- a/services/wsprd/ipc/server/server.go
+++ b/services/wsprd/ipc/server/server.go
@@ -4,6 +4,7 @@
 
 import (
 	"encoding/json"
+	"fmt"
 	"sync"
 	"time"
 
@@ -476,6 +477,16 @@
 	}
 	s.mu.Lock()
 	defer s.mu.Unlock()
+
+	if s.dispatcher != nil {
+		s.dispatcher.Cleanup()
+	}
+
+	for _, ch := range s.outstandingAuthRequests {
+		ch <- fmt.Errorf("Cleaning up server")
+	}
+	s.outstandingAuthRequests = make(map[int32]chan error)
+
 	for _, ch := range s.outstandingServerRequests {
 		select {
 		case ch <- &result: