mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 01:22:28 -05:00 
			
		
		
		
	[chore] Move DoOnce func wrapper to util (#2613)
		
	This commit is contained in:
		
					parent
					
						
							
								6738fd5bb0
							
						
					
				
			
			
				commit
				
					
						7a7746701d
					
				
			
		
					 5 changed files with 36 additions and 16 deletions
				
			
		|  | @ -37,6 +37,7 @@ import ( | ||||||
| 	"github.com/superseriousbusiness/gotosocial/internal/log" | 	"github.com/superseriousbusiness/gotosocial/internal/log" | ||||||
| 	"github.com/superseriousbusiness/gotosocial/internal/media" | 	"github.com/superseriousbusiness/gotosocial/internal/media" | ||||||
| 	"github.com/superseriousbusiness/gotosocial/internal/transport" | 	"github.com/superseriousbusiness/gotosocial/internal/transport" | ||||||
|  | 	"github.com/superseriousbusiness/gotosocial/internal/util" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // accountUpToDate returns whether the given account model is both updateable (i.e. | // accountUpToDate returns whether the given account model is both updateable (i.e. | ||||||
|  | @ -384,7 +385,7 @@ func (d *Dereferencer) enrichAccountSafely( | ||||||
| 	// to safely defer in case of panic, while still | 	// to safely defer in case of panic, while still | ||||||
| 	// performing more granular unlocks when needed. | 	// performing more granular unlocks when needed. | ||||||
| 	unlock := d.state.FedLocks.Lock(uriStr) | 	unlock := d.state.FedLocks.Lock(uriStr) | ||||||
| 	unlock = doOnce(unlock) | 	unlock = util.DoOnce(unlock) | ||||||
| 	defer unlock() | 	defer unlock() | ||||||
| 
 | 
 | ||||||
| 	// Perform status enrichment with passed vars. | 	// Perform status enrichment with passed vars. | ||||||
|  | @ -735,7 +736,7 @@ func (d *Dereferencer) fetchRemoteAccountAvatar(ctx context.Context, tsport tran | ||||||
| 
 | 
 | ||||||
| 	// Acquire lock for derefs map. | 	// Acquire lock for derefs map. | ||||||
| 	unlock := d.state.FedLocks.Lock(latestAcc.AvatarRemoteURL) | 	unlock := d.state.FedLocks.Lock(latestAcc.AvatarRemoteURL) | ||||||
| 	unlock = doOnce(unlock) | 	unlock = util.DoOnce(unlock) | ||||||
| 	defer unlock() | 	defer unlock() | ||||||
| 
 | 
 | ||||||
| 	// Look for an existing dereference in progress. | 	// Look for an existing dereference in progress. | ||||||
|  | @ -821,7 +822,7 @@ func (d *Dereferencer) fetchRemoteAccountHeader(ctx context.Context, tsport tran | ||||||
| 
 | 
 | ||||||
| 	// Acquire lock for derefs map. | 	// Acquire lock for derefs map. | ||||||
| 	unlock := d.state.FedLocks.Lock(latestAcc.HeaderRemoteURL) | 	unlock := d.state.FedLocks.Lock(latestAcc.HeaderRemoteURL) | ||||||
| 	unlock = doOnce(unlock) | 	unlock = util.DoOnce(unlock) | ||||||
| 	defer unlock() | 	defer unlock() | ||||||
| 
 | 
 | ||||||
| 	// Look for an existing dereference in progress. | 	// Look for an existing dereference in progress. | ||||||
|  |  | ||||||
|  | @ -28,6 +28,7 @@ import ( | ||||||
| 	"github.com/superseriousbusiness/gotosocial/internal/id" | 	"github.com/superseriousbusiness/gotosocial/internal/id" | ||||||
| 	"github.com/superseriousbusiness/gotosocial/internal/log" | 	"github.com/superseriousbusiness/gotosocial/internal/log" | ||||||
| 	"github.com/superseriousbusiness/gotosocial/internal/media" | 	"github.com/superseriousbusiness/gotosocial/internal/media" | ||||||
|  | 	"github.com/superseriousbusiness/gotosocial/internal/util" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func (d *Dereferencer) GetRemoteEmoji(ctx context.Context, requestingUsername string, remoteURL string, shortcode string, domain string, id string, emojiURI string, ai *media.AdditionalEmojiInfo, refresh bool) (*media.ProcessingEmoji, error) { | func (d *Dereferencer) GetRemoteEmoji(ctx context.Context, requestingUsername string, remoteURL string, shortcode string, domain string, id string, emojiURI string, ai *media.AdditionalEmojiInfo, refresh bool) (*media.ProcessingEmoji, error) { | ||||||
|  | @ -44,7 +45,7 @@ func (d *Dereferencer) GetRemoteEmoji(ctx context.Context, requestingUsername st | ||||||
| 
 | 
 | ||||||
| 	// Acquire lock for derefs map. | 	// Acquire lock for derefs map. | ||||||
| 	unlock := d.state.FedLocks.Lock(remoteURL) | 	unlock := d.state.FedLocks.Lock(remoteURL) | ||||||
| 	unlock = doOnce(unlock) | 	unlock = util.DoOnce(unlock) | ||||||
| 	defer unlock() | 	defer unlock() | ||||||
| 
 | 
 | ||||||
| 	// first check if we're already processing this emoji | 	// first check if we're already processing this emoji | ||||||
|  |  | ||||||
|  | @ -295,7 +295,7 @@ func (d *Dereferencer) enrichStatusSafely( | ||||||
| 	// to safely defer in case of panic, while still | 	// to safely defer in case of panic, while still | ||||||
| 	// performing more granular unlocks when needed. | 	// performing more granular unlocks when needed. | ||||||
| 	unlock := d.state.FedLocks.Lock(uriStr) | 	unlock := d.state.FedLocks.Lock(uriStr) | ||||||
| 	unlock = doOnce(unlock) | 	unlock = util.DoOnce(unlock) | ||||||
| 	defer unlock() | 	defer unlock() | ||||||
| 
 | 
 | ||||||
| 	// Perform status enrichment with passed vars. | 	// Perform status enrichment with passed vars. | ||||||
|  |  | ||||||
|  | @ -23,17 +23,6 @@ import ( | ||||||
| 	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" | 	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // doOnce wraps a function to only perform it once. |  | ||||||
| func doOnce(fn func()) func() { |  | ||||||
| 	var once int32 |  | ||||||
| 	return func() { |  | ||||||
| 		if once == 0 { |  | ||||||
| 			fn() |  | ||||||
| 			once = 1 |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // pollChanged returns whether a poll has changed in way that | // pollChanged returns whether a poll has changed in way that | ||||||
| // indicates that this should be an entirely new poll. i.e. if | // indicates that this should be an entirely new poll. i.e. if | ||||||
| // the available options have changed, or the expiry has increased. | // the available options have changed, or the expiry has increased. | ||||||
|  |  | ||||||
							
								
								
									
										29
									
								
								internal/util/sync.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								internal/util/sync.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | ||||||
|  | // GoToSocial | ||||||
|  | // Copyright (C) GoToSocial Authors admin@gotosocial.org | ||||||
|  | // SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
|  | // | ||||||
|  | // This program is free software: you can redistribute it and/or modify | ||||||
|  | // it under the terms of the GNU Affero General Public License as published by | ||||||
|  | // the Free Software Foundation, either version 3 of the License, or | ||||||
|  | // (at your option) any later version. | ||||||
|  | // | ||||||
|  | // This program is distributed in the hope that it will be useful, | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | // GNU Affero General Public License for more details. | ||||||
|  | // | ||||||
|  | // You should have received a copy of the GNU Affero General Public License | ||||||
|  | // along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | package util | ||||||
|  | 
 | ||||||
|  | // DoOnce wraps a function to only perform it once. | ||||||
|  | func DoOnce(fn func()) func() { | ||||||
|  | 	var once int32 | ||||||
|  | 	return func() { | ||||||
|  | 		if once == 0 { | ||||||
|  | 			fn() | ||||||
|  | 			once = 1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue