diff --git a/app/app.go b/app/app.go index d31bf11..e4427ec 100644 --- a/app/app.go +++ b/app/app.go @@ -25,7 +25,7 @@ type applicationCore struct { eventBuses map[string]event.Manager directory string - acmutex sync.Mutex + coremutex sync.Mutex } type application struct { @@ -85,8 +85,8 @@ func (ac *applicationCore) CreatePeer(name string) (*model.Profile, error) { profile := storage.NewProfile(name) - ac.acmutex.Lock() - defer ac.acmutex.Unlock() + ac.coremutex.Lock() + defer ac.coremutex.Unlock() _, exists := ac.eventBuses[profile.Onion] if exists { @@ -100,8 +100,8 @@ func (ac *applicationCore) CreatePeer(name string) (*model.Profile, error) { } func (ac *applicationCore) DeletePeer(onion string) { - ac.acmutex.Lock() - defer ac.acmutex.Unlock() + ac.coremutex.Lock() + defer ac.coremutex.Unlock() ac.eventBuses[onion].Shutdown() delete(ac.eventBuses, onion) @@ -144,7 +144,7 @@ func (app *application) CreatePeer(name string, password string) { func (app *application) DeletePeer(onion string) { log.Infof("DeletePeer called on %v\n", onion) app.appmutex.Lock() - defer app.appmutex.Lock() + defer app.appmutex.Unlock() app.appletPlugins.ShutdownPeer(onion) app.plugins.Delete(onion) @@ -198,9 +198,9 @@ func (ac *applicationCore) LoadProfiles(password string, timeline bool, loadProf continue } - ac.acmutex.Lock() + ac.coremutex.Lock() ac.eventBuses[profile.Onion] = eventBus - ac.acmutex.Unlock() + ac.coremutex.Unlock() loadProfileFn(profile, profileStore) } diff --git a/app/appClient.go b/app/appClient.go index 0d76eab..8a6bd59 100644 --- a/app/appClient.go +++ b/app/appClient.go @@ -9,6 +9,7 @@ import ( "git.openprivacy.ca/openprivacy/libricochet-go/log" "path" "strconv" + "sync" ) type applicationClient struct { @@ -16,6 +17,7 @@ type applicationClient struct { appletPeers appBus event.Manager + acmutex sync.Mutex } // NewAppClient returns an Application that acts as a client to a AppService, connected by the IPCBridge supplied @@ -76,8 +78,8 @@ func (ac *applicationClient) newPeer(localID, password string, reload bool) { peer := peer.FromProfile(profile) peer.Init(eventBus) - ac.mutex.Lock() - defer ac.mutex.Unlock() + ac.acmutex.Lock() + defer ac.acmutex.Unlock() ac.peers[profile.Onion] = peer ac.eventBuses[profile.Onion] = eventBus npEvent := event.NewEvent(event.NewPeer, map[event.Field]string{event.Identity: profile.Onion}) @@ -114,11 +116,11 @@ func (ac *applicationClient) ChangePeerPassword(onion, oldpass, newpass string) } func (ac *applicationClient) handleDeletedPeer(onion string) { - ac.mutex.Lock() + ac.acmutex.Lock() + defer ac.acmutex.Unlock() ac.peers[onion].Shutdown() delete(ac.peers, onion) ac.eventBuses[onion].Publish(event.NewEventList(event.ShutdownPeer, event.Identity, onion)) - ac.mutex.Unlock() ac.applicationCore.DeletePeer(onion) } @@ -141,8 +143,8 @@ func (ac *applicationClient) QueryACNStatus() { // ShutdownPeer shuts down a peer and removes it from the app's management func (ac *applicationClient) ShutdownPeer(onion string) { - ac.mutex.Lock() - defer ac.mutex.Unlock() + ac.acmutex.Lock() + defer ac.acmutex.Unlock() ac.eventBuses[onion].Shutdown() delete(ac.eventBuses, onion) ac.peers[onion].Shutdown() diff --git a/app/appService.go b/app/appService.go index 328756e..e52ae48 100644 --- a/app/appService.go +++ b/app/appService.go @@ -11,6 +11,7 @@ import ( "git.openprivacy.ca/openprivacy/libricochet-go/log" "path" "strconv" + "sync" ) type applicationService struct { @@ -20,6 +21,7 @@ type applicationService struct { storage map[string]storage.ProfileStore engines map[string]connections.Engine + asmutex sync.Mutex } // ApplicationService is the back end of an application that manages engines and writing storage and communicates to an ApplicationClient by an IPCBridge @@ -123,10 +125,10 @@ func (as *applicationService) loadProfiles(password string) { blockedPeers := profile.BlockedPeers() identity := primitives.InitializeIdentity(profile.Name, &profile.Ed25519PrivateKey, &profile.Ed25519PublicKey) engine := connections.NewProtocolEngine(identity, profile.Ed25519PrivateKey, as.acn, as.eventBuses[profile.Onion], profile.GetContacts(), blockedPeers) - as.mutex.Lock() + as.asmutex.Lock() as.storage[profile.Onion] = profileStore as.engines[profile.Onion] = engine - as.mutex.Unlock() + as.asmutex.Unlock() message := event.IPCMessage{Dest: DestApp, Message: event.NewEvent(event.NewPeer, map[event.Field]string{event.Identity: profile.LocalID, event.Password: password})} as.bridge.Write(&message) count++ @@ -148,7 +150,8 @@ func (as *applicationService) getACNStatusHandler() func(int, string) { } func (as *applicationService) deletePeer(onion string) { - as.mutex.Lock() + as.asmutex.Lock() + defer as.asmutex.Unlock() as.appletPlugins.ShutdownPeer(onion) as.plugins.Delete(onion) @@ -160,8 +163,6 @@ func (as *applicationService) deletePeer(onion string) { as.storage[onion].Delete() delete(as.storage, onion) - as.mutex.Unlock() - as.applicationCore.DeletePeer(onion) }