Browse Source

Use a separate lock for the subscriber stuff

Jakob Borg 11 years ago
parent
commit
c3c9c4cde5
1 changed files with 10 additions and 7 deletions
  1. 10 7
      internal/config/wrapper.go

+ 10 - 7
internal/config/wrapper.go

@@ -49,8 +49,10 @@ type ConfigWrapper struct {
 	deviceMap map[protocol.DeviceID]DeviceConfiguration
 	folderMap map[string]FolderConfiguration
 	replaces  chan Configuration
-	subs      []Handler
 	mut       sync.Mutex
+
+	subs []Handler
+	sMut sync.Mutex
 }
 
 // Wrap wraps an existing Configuration structure and ties it to a file on
@@ -84,26 +86,27 @@ func Load(path string, myID protocol.DeviceID) (*ConfigWrapper, error) {
 // be run manually.
 func (w *ConfigWrapper) Serve() {
 	for cfg := range w.replaces {
-		w.mut.Lock()
+		w.sMut.Lock()
 		subs := w.subs
-		w.mut.Unlock()
+		w.sMut.Unlock()
 		for _, h := range subs {
 			h.Changed(cfg)
 		}
 	}
 }
 
-// Stop stops the Serve() loop.
+// Stop stops the Serve() loop. Set and Replace operations will panic after a
+// Stop.
 func (w *ConfigWrapper) Stop() {
 	close(w.replaces)
 }
 
-// Subscriber registers the given handler to be called on any future
+// Subscribe registers the given handler to be called on any future
 // configuration changes.
 func (w *ConfigWrapper) Subscribe(h Handler) {
-	w.mut.Lock()
+	w.sMut.Lock()
 	w.subs = append(w.subs, h)
-	w.mut.Unlock()
+	w.sMut.Unlock()
 }
 
 // Raw returns the currently wrapped Configuration object.