Browse Source

composed apps use their own mutexs

pull/292/head
Dan Ballard 7 months ago
parent
commit
2dbab8cfc4
3 changed files with 22 additions and 19 deletions
  1. +8
    -8
      app/app.go
  2. +8
    -6
      app/appClient.go
  3. +6
    -5
      app/appService.go

+ 8
- 8
app/app.go View File

@@ -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)
}


+ 8
- 6
app/appClient.go View File

@@ -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()


+ 6
- 5
app/appService.go View File

@@ -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…
Cancel
Save