mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 17:02:25 -05:00 
			
		
		
		
	
		
			
	
	
		
			59 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			59 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package atomics | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"sync/atomic" | ||
|  | 	"time" | ||
|  | 	"unsafe" | ||
|  | ) | ||
|  | 
 | ||
|  | // Time provides user-friendly means of performing atomic operations on time.Time types. | ||
|  | type Time struct{ ptr unsafe.Pointer } | ||
|  | 
 | ||
|  | // NewTime will return a new Time instance initialized with zero value. | ||
|  | func NewTime() *Time { | ||
|  | 	var v time.Time | ||
|  | 	return &Time{ | ||
|  | 		ptr: unsafe.Pointer(&v), | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // Store will atomically store time.Time value in address contained within v. | ||
|  | func (v *Time) Store(val time.Time) { | ||
|  | 	atomic.StorePointer(&v.ptr, unsafe.Pointer(&val)) | ||
|  | } | ||
|  | 
 | ||
|  | // Load will atomically load time.Time value at address contained within v. | ||
|  | func (v *Time) Load() time.Time { | ||
|  | 	return *(*time.Time)(atomic.LoadPointer(&v.ptr)) | ||
|  | } | ||
|  | 
 | ||
|  | // CAS performs a compare-and-swap for a(n) time.Time value at address contained within v. | ||
|  | func (v *Time) CAS(cmp, swp time.Time) bool { | ||
|  | 	for { | ||
|  | 		// Load current value at address | ||
|  | 		ptr := atomic.LoadPointer(&v.ptr) | ||
|  | 		cur := *(*time.Time)(ptr) | ||
|  | 
 | ||
|  | 		// Perform comparison against current | ||
|  | 		if !(cur.Equal(cmp)) { | ||
|  | 			return false | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Attempt to replace pointer | ||
|  | 		if atomic.CompareAndSwapPointer( | ||
|  | 			&v.ptr, | ||
|  | 			ptr, | ||
|  | 			unsafe.Pointer(&swp), | ||
|  | 		) { | ||
|  | 			return true | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // Swap atomically stores new time.Time value into address contained within v, and returns previous value. | ||
|  | func (v *Time) Swap(swp time.Time) time.Time { | ||
|  | 	ptr := unsafe.Pointer(&swp) | ||
|  | 	ptr = atomic.SwapPointer(&v.ptr, ptr) | ||
|  | 	return *(*time.Time)(ptr) | ||
|  | } |