mirror of
https://github.com/safing/portmaster
synced 2025-09-02 10:39:22 +00:00
Update profile outside of process lock
This commit is contained in:
parent
8e34be70bb
commit
d9fcf8e64d
2 changed files with 24 additions and 13 deletions
|
@ -9,16 +9,20 @@ import (
|
||||||
|
|
||||||
// GetProfile finds and assigns a profile set to the process.
|
// GetProfile finds and assigns a profile set to the process.
|
||||||
func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) {
|
func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) {
|
||||||
|
// Update profile metadata outside of *Process lock.
|
||||||
|
var localProfile *profile.Profile
|
||||||
|
defer p.updateProfileMetadata(localProfile)
|
||||||
|
|
||||||
p.Lock()
|
p.Lock()
|
||||||
defer p.Unlock()
|
defer p.Unlock()
|
||||||
|
|
||||||
// only find profiles if not already done.
|
// Check if profile is already loaded.
|
||||||
if p.profile != nil {
|
if p.profile != nil {
|
||||||
log.Tracer(ctx).Trace("process: profile already loaded")
|
log.Tracer(ctx).Trace("process: profile already loaded")
|
||||||
// Mark profile as used.
|
return
|
||||||
p.profile.MarkUsed()
|
|
||||||
return false, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If not, continue with loading the profile.
|
||||||
log.Tracer(ctx).Trace("process: loading profile")
|
log.Tracer(ctx).Trace("process: loading profile")
|
||||||
|
|
||||||
// Check if we need a special profile.
|
// Check if we need a special profile.
|
||||||
|
@ -31,11 +35,24 @@ func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the (linked) local profile.
|
// Get the (linked) local profile.
|
||||||
localProfile, err := profile.GetProfile(profile.SourceLocal, profileID, p.Path)
|
localProfile, err = profile.GetProfile(profile.SourceLocal, profileID, p.Path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Assign profile to process.
|
||||||
|
p.LocalProfileKey = localProfile.Key()
|
||||||
|
p.profile = localProfile.LayeredProfile()
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Process) updateProfileMetadata(localProfile *profile.Profile) {
|
||||||
|
// Check if there is a profile to work with.
|
||||||
|
if localProfile == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Update metadata of profile.
|
// Update metadata of profile.
|
||||||
metadataUpdated := localProfile.UpdateMetadata(p.Name)
|
metadataUpdated := localProfile.UpdateMetadata(p.Name)
|
||||||
|
|
||||||
|
@ -49,10 +66,4 @@ func (p *Process) GetProfile(ctx context.Context) (changed bool, err error) {
|
||||||
log.Warningf("process: failed to save profile %s: %s", localProfile.ScopedID(), err)
|
log.Warningf("process: failed to save profile %s: %s", localProfile.ScopedID(), err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assign profile to process.
|
|
||||||
p.LocalProfileKey = localProfile.Key()
|
|
||||||
p.profile = localProfile.LayeredProfile()
|
|
||||||
|
|
||||||
return true, nil
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -410,7 +410,7 @@ func (profile *Profile) UpdateMetadata(processName string) (changed bool) {
|
||||||
var needsUpdateFromSystem bool
|
var needsUpdateFromSystem bool
|
||||||
|
|
||||||
// Check profile name.
|
// Check profile name.
|
||||||
_, filename := filepath.Split(profile.LinkedPath)
|
filename := filepath.Base(profile.LinkedPath)
|
||||||
|
|
||||||
// Update profile name if it is empty or equals the filename, which is the
|
// Update profile name if it is empty or equals the filename, which is the
|
||||||
// case for older profiles.
|
// case for older profiles.
|
||||||
|
@ -464,7 +464,7 @@ func (profile *Profile) updateMetadataFromSystem(ctx context.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get filename of linked path for comparison.
|
// Get filename of linked path for comparison.
|
||||||
_, filename := filepath.Split(profile.LinkedPath)
|
filename := filepath.Base(profile.LinkedPath)
|
||||||
|
|
||||||
// TODO: Theoretically, the generated name from the system could be identical
|
// TODO: Theoretically, the generated name from the system could be identical
|
||||||
// to the filename. This would mean that the worker is triggered every time
|
// to the filename. This would mean that the worker is triggered every time
|
||||||
|
|
Loading…
Add table
Reference in a new issue