summaryrefslogtreecommitdiff
path: root/internal/federation/dereferencing/emoji.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/federation/dereferencing/emoji.go')
-rw-r--r--internal/federation/dereferencing/emoji.go33
1 files changed, 15 insertions, 18 deletions
diff --git a/internal/federation/dereferencing/emoji.go b/internal/federation/dereferencing/emoji.go
index 4a44d716a..3e9452f14 100644
--- a/internal/federation/dereferencing/emoji.go
+++ b/internal/federation/dereferencing/emoji.go
@@ -37,23 +37,23 @@ func (d *deref) GetRemoteEmoji(ctx context.Context, requestingUsername string, r
processingEmoji *media.ProcessingEmoji
)
- d.dereferencingEmojisLock.Lock() // LOCK HERE
+ // Acquire lock for derefs map.
+ unlock := d.derefEmojisMu.Lock()
+ defer unlock()
// first check if we're already processing this emoji
- if alreadyProcessing, ok := d.dereferencingEmojis[shortcodeDomain]; ok {
+ if alreadyProcessing, ok := d.derefEmojis[shortcodeDomain]; ok {
// we're already on it, no worries
processingEmoji = alreadyProcessing
} else {
// not processing it yet, let's start
t, err := d.transportController.NewTransportForUsername(ctx, requestingUsername)
if err != nil {
- d.dereferencingEmojisLock.Unlock()
return nil, fmt.Errorf("GetRemoteEmoji: error creating transport to fetch emoji %s: %s", shortcodeDomain, err)
}
derefURI, err := url.Parse(remoteURL)
if err != nil {
- d.dereferencingEmojisLock.Unlock()
return nil, fmt.Errorf("GetRemoteEmoji: error parsing url for emoji %s: %s", shortcodeDomain, err)
}
@@ -63,29 +63,26 @@ func (d *deref) GetRemoteEmoji(ctx context.Context, requestingUsername string, r
newProcessing, err := d.mediaManager.ProcessEmoji(ctx, dataFunc, nil, shortcode, id, emojiURI, ai, refresh)
if err != nil {
- d.dereferencingEmojisLock.Unlock()
return nil, fmt.Errorf("GetRemoteEmoji: error processing emoji %s: %s", shortcodeDomain, err)
}
// store it in our map to indicate it's in process
- d.dereferencingEmojis[shortcodeDomain] = newProcessing
+ d.derefEmojis[shortcodeDomain] = newProcessing
processingEmoji = newProcessing
}
- d.dereferencingEmojisLock.Unlock()
+ // Unlock map.
+ unlock()
- load := func(innerCtx context.Context) error {
- _, err := processingEmoji.LoadEmoji(innerCtx)
- return err
- }
-
- cleanup := func() {
- d.dereferencingEmojisLock.Lock()
- delete(d.dereferencingHeaders, shortcodeDomain)
- d.dereferencingEmojisLock.Unlock()
- }
+ defer func() {
+ // On exit safely remove emoji from map.
+ unlock := d.derefEmojisMu.Lock()
+ delete(d.derefEmojis, shortcodeDomain)
+ unlock()
+ }()
- if err := loadAndCleanup(ctx, load, cleanup); err != nil {
+ // Start emoji attachment loading (blocking call).
+ if _, err := processingEmoji.LoadEmoji(ctx); err != nil {
return nil, err
}