mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 13:32:25 -05:00 
			
		
		
		
	
		
			
	
	
		
			77 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package structr | ||
|  | 
 | ||
|  | type result[T any] struct { | ||
|  | 	// linked list entry this result is | ||
|  | 	// stored under in Cache.lruList. | ||
|  | 	entry elem[*result[T]] | ||
|  | 
 | ||
|  | 	// keys tracks the indices | ||
|  | 	// result is stored under. | ||
|  | 	keys []*indexkey[T] | ||
|  | 
 | ||
|  | 	// cached value. | ||
|  | 	value T | ||
|  | 
 | ||
|  | 	// cached error. | ||
|  | 	err error | ||
|  | } | ||
|  | 
 | ||
|  | func result_acquire[T any](c *Cache[T]) *result[T] { | ||
|  | 	var res *result[T] | ||
|  | 
 | ||
|  | 	if len(c.resPool) == 0 { | ||
|  | 		// Allocate new result. | ||
|  | 		res = new(result[T]) | ||
|  | 	} else { | ||
|  | 		// Pop result from pool slice. | ||
|  | 		res = c.resPool[len(c.resPool)-1] | ||
|  | 		c.resPool = c.resPool[:len(c.resPool)-1] | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// Push to front of LRU list. | ||
|  | 	c.lruList.pushFront(&res.entry) | ||
|  | 	res.entry.Value = res | ||
|  | 
 | ||
|  | 	return res | ||
|  | } | ||
|  | 
 | ||
|  | func result_release[T any](c *Cache[T], res *result[T]) { | ||
|  | 	// Remove from the LRU list. | ||
|  | 	c.lruList.remove(&res.entry) | ||
|  | 	res.entry.Value = nil | ||
|  | 
 | ||
|  | 	var zero T | ||
|  | 
 | ||
|  | 	// Reset all result fields. | ||
|  | 	res.keys = res.keys[:0] | ||
|  | 	res.value = zero | ||
|  | 	res.err = nil | ||
|  | 
 | ||
|  | 	// Release result to memory pool. | ||
|  | 	c.resPool = append(c.resPool, res) | ||
|  | } | ||
|  | 
 | ||
|  | func result_dropIndex[T any](c *Cache[T], res *result[T], index *Index[T]) { | ||
|  | 	for i := 0; i < len(res.keys); i++ { | ||
|  | 
 | ||
|  | 		if res.keys[i].index != index { | ||
|  | 			// Prof. Obiwan: | ||
|  | 			// this is not the index | ||
|  | 			// we are looking for. | ||
|  | 			continue | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Get index key ptr. | ||
|  | 		ikey := res.keys[i] | ||
|  | 
 | ||
|  | 		// Move all index keys down + reslice. | ||
|  | 		copy(res.keys[i:], res.keys[i+1:]) | ||
|  | 		res.keys = res.keys[:len(res.keys)-1] | ||
|  | 
 | ||
|  | 		// Release ikey to memory pool. | ||
|  | 		indexkey_release(c, ikey) | ||
|  | 
 | ||
|  | 		return | ||
|  | 	} | ||
|  | } |