forked from cwtch.im/cwtch
composed apps use their own mutexs
This commit is contained in:
parent
4ecc7c0f2b
commit
2dbab8cfc4
16
app/app.go
16
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)
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue