11package  kernel
22
3- // Writer implementation that minimizes memory copies where possible 
4- // by using direct memory operations, though buffer growth requires copying 
3+ // Writer implementation that minimizes memory copies 
54
65/* 
76#include "kernel/bitcoinkernel.h" 
@@ -20,9 +19,8 @@ import (
2019// writerCallbackData holds the growing buffer that collects written bytes 
2120// Uses a capacity-based growth strategy to reduce reallocations 
2221type  writerCallbackData  struct  {
23- 	buffer    []byte  // Pre-allocated buffer 
24- 	position  int     // Current write position 
25- 	err       error 
22+ 	buffer  []byte  // Pre-allocated buffer 
23+ 	err     error 
2624}
2725
2826//export go_writer_callback_bridge 
@@ -32,40 +30,18 @@ func go_writer_callback_bridge(bytes unsafe.Pointer, size C.size_t, userdata uns
3230	// Retrieve original Go callback data struct 
3331	data  :=  handle .Value ().(* writerCallbackData )
3432
35- 	bytesSize  :=  int (size )
36- 	requiredCapacity  :=  data .position  +  bytesSize 
37- 
38- 	// Grow buffer if needed (double capacity strategy) 
39- 	if  requiredCapacity  >  len (data .buffer ) {
40- 		newCapacity  :=  len (data .buffer ) *  2 
41- 		if  newCapacity  <  requiredCapacity  {
42- 			newCapacity  =  requiredCapacity 
43- 		}
44- 		newBuffer  :=  make ([]byte , newCapacity )
45- 		copy (newBuffer [:data .position ], data .buffer [:data .position ])
46- 		data .buffer  =  newBuffer 
47- 	}
48- 
49- 	if  bytesSize  >  0  {
50- 		// Get pointer to destination in Go buffer 
51- 		dstPtr  :=  unsafe .Pointer (& data .buffer [data .position ])
52- 		// Use C's memmove to copy directly 
53- 		C .memmove (dstPtr , bytes , size )
54- 		data .position  +=  bytesSize 
33+ 	if  size  >  0  {
34+ 		// Create a Go slice view of the C memory 
35+ 		cBytes  :=  unsafe .Slice ((* byte )(bytes ), int (size ))
36+ 		data .buffer  =  append (data .buffer , cBytes ... )
5537	}
56- 
57- 	return  0  // success 
38+ 	return  0 
5839}
5940
6041// writeToBytes is a helper function that uses a callback pattern to collect bytes 
6142// It takes a function that calls the C API with the writer callback 
6243func  writeToBytes (writerFunc  func (C.btck_WriteBytes , unsafe.Pointer ) C.int ) ([]byte , error ) {
63- 	// Pre-allocate buffer with reasonable initial capacity 
64- 	initialCapacity  :=  1024  // Start with 1KB, will grow as needed 
65- 	callbackData  :=  & writerCallbackData {
66- 		buffer :   make ([]byte , initialCapacity ),
67- 		position : 0 ,
68- 	}
44+ 	callbackData  :=  & writerCallbackData {}
6945
7046	// Create cgo handle for the callback data 
7147	handle  :=  cgo .NewHandle (callbackData )
@@ -82,5 +58,5 @@ func writeToBytes(writerFunc func(C.btck_WriteBytes, unsafe.Pointer) C.int) ([]b
8258	}
8359
8460	// Return exactly the bytes that were written (slice the buffer to actual size) 
85- 	return  callbackData .buffer [: callbackData . position ] , nil 
61+ 	return  callbackData .buffer , nil 
8662}
0 commit comments