mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 08:12:26 -05:00 
			
		
		
		
	
		
			
	
	
		
			42 lines
		
	
	
	
		
			883 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			42 lines
		
	
	
	
		
			883 B
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | //go:build go1.22 && !go1.25 | ||
|  | 
 | ||
|  | package mutexes | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"sync" | ||
|  | 	"sync/atomic" | ||
|  | 	"unsafe" | ||
|  | ) | ||
|  | 
 | ||
|  | // syncCond_last_ticket is an unsafe function that returns | ||
|  | // the ticket of the last awoken / notified goroutine by a | ||
|  | // a sync.Cond{}. it relies on expected memory layout. | ||
|  | func syncCond_last_ticket(c *sync.Cond) uint32 { | ||
|  | 
 | ||
|  | 	// NOTE: must remain in | ||
|  | 	// sync with runtime.notifyList{}. | ||
|  | 	// | ||
|  | 	// goexperiment.staticlockranking | ||
|  | 	// does change it slightly, but | ||
|  | 	// this does not alter the first | ||
|  | 	// 2 fields which are all we need. | ||
|  | 	type notifyList struct { | ||
|  | 		_      atomic.Uint32 | ||
|  | 		notify uint32 | ||
|  | 		// ... other fields | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// NOTE: must remain in | ||
|  | 	// sync with sync.Cond{}. | ||
|  | 	type syncCond struct { | ||
|  | 		_ struct{} | ||
|  | 		L sync.Locker | ||
|  | 		n notifyList | ||
|  | 		// ... other fields | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// This field must be atomcially accessed. | ||
|  | 	cptr := (*syncCond)(unsafe.Pointer(c)) | ||
|  | 	return atomic.LoadUint32(&cptr.n.notify) | ||
|  | } |