mirror of
				https://github.com/v2fly/v2ray-core.git
				synced 2025-10-31 17:59:15 +00:00 
			
		
		
		
	
		
			
	
	
		
			30 lines
		
	
	
		
			369 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			30 lines
		
	
	
		
			369 B
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | package signal | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"sync" | ||
|  | 	"sync/atomic" | ||
|  | ) | ||
|  | 
 | ||
|  | type Once struct { | ||
|  | 	m    sync.Mutex | ||
|  | 	done uint32 | ||
|  | } | ||
|  | 
 | ||
|  | func (o *Once) Do(f func()) { | ||
|  | 	if atomic.LoadUint32(&o.done) == 1 { | ||
|  | 		return | ||
|  | 	} | ||
|  | 	o.m.Lock() | ||
|  | 	defer o.m.Unlock() | ||
|  | 	if o.done == 0 { | ||
|  | 		atomic.StoreUint32(&o.done, 1) | ||
|  | 		f() | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (o *Once) Reset() { | ||
|  | 	o.m.Lock() | ||
|  | 	defer o.m.Unlock() | ||
|  | 	atomic.StoreUint32(&o.done, 0) | ||
|  | } |