| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | package hawk | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | #include <hawk.h> | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | import "C" | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | import "sync" | 
					
						
							|  |  |  | import "weak" | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | type Instance struct { | 
					
						
							|  |  |  | 	c *C.hawk_t // c object | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | 	//g *Hawk     // go object | 
					
						
							|  |  |  | 	g weak.Pointer[Hawk] // go object | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type InstanceTable struct { | 
					
						
							|  |  |  | 	mtx        sync.Mutex | 
					
						
							|  |  |  | 	insts      []Instance | 
					
						
							|  |  |  | 	free_slots []int | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | 	next       int | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | var inst_table InstanceTable | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | func (itab *InstanceTable) add_instance(c *C.hawk_t, g *Hawk) int { | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | 	var n int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | 	itab.mtx.Lock() | 
					
						
							|  |  |  | 	defer itab.mtx.Unlock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | 	n = len(itab.free_slots) | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | 	if n <= 0 { // no free slots | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | 		itab.insts = append(itab.insts, Instance{c: c, g: weak.Make(g)}) | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | 		return len(itab.insts) - 1 | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		var slot int | 
					
						
							|  |  |  | 		n-- | 
					
						
							|  |  |  | 		slot = itab.free_slots[n] | 
					
						
							|  |  |  | 		itab.free_slots = itab.free_slots[:n] | 
					
						
							|  |  |  | 		itab.insts[slot].c = c | 
					
						
							|  |  |  | 		return slot | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (itab *InstanceTable) delete_instance(slot int) Instance { | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | 	var h Instance | 
					
						
							|  |  |  | 	var n int | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	itab.mtx.Lock() | 
					
						
							|  |  |  | 	defer itab.mtx.Unlock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	h = itab.insts[slot] | 
					
						
							|  |  |  | 	itab.insts[slot].c = nil | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | 	itab.insts[slot].g = weak.Make((*Hawk)(nil)) // this may not even be necessary as it's a weak pointer | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	n = len(itab.insts) | 
					
						
							| 
									
										
										
										
											2025-10-30 23:47:56 +09:00
										 |  |  | 	if slot == n - 1 { | 
					
						
							|  |  |  | 		itab.insts = itab.insts[:n - 1] | 
					
						
							| 
									
										
										
										
											2025-10-26 23:18:23 +09:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		itab.free_slots = append(itab.free_slots, slot) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return h | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (itab *InstanceTable) slot_to_instance(slot int) Instance { | 
					
						
							|  |  |  | 	itab.mtx.Lock() | 
					
						
							|  |  |  | 	defer itab.mtx.Unlock() | 
					
						
							|  |  |  | 	return itab.insts[slot] | 
					
						
							|  |  |  | } |