@@ -33,7 +33,6 @@ package maxminddb
3333import  (
3434	"errors" 
3535	"os" 
36- 	"reflect" 
3736	"sync" 
3837	"unsafe" 
3938
@@ -48,62 +47,83 @@ var (
4847	handleMap   =  map [uintptr ]windows.Handle {}
4948)
5049
51- func  mmap (fd  int , length  int ) (data  []byte , err  error ) {
52- 	h , errno  :=  windows .CreateFileMapping (windows .Handle (fd ), nil ,
53- 		uint32 (windows .PAGE_READONLY ), 0 , uint32 (length ), nil )
54- 	if  h  ==  0  {
55- 		return  nil , os .NewSyscallError ("CreateFileMapping" , errno )
50+ // mmap maps a file into memory and returns a memoryMap. 
51+ func  mmap (fd  int , length  int ) ([]byte , error ) {
52+ 	// Create a file mapping 
53+ 	handle , err  :=  windows .CreateFileMapping (
54+ 		windows .Handle (fd ),
55+ 		nil ,
56+ 		windows .PAGE_READONLY ,
57+ 		0 ,
58+ 		uint32 (length ),
59+ 		nil ,
60+ 	)
61+ 	if  err  !=  nil  {
62+ 		return  nil , os .NewSyscallError ("CreateFileMapping" , err )
5663	}
5764
58- 	addr , errno  :=  windows .MapViewOfFile (h , uint32 (windows .FILE_MAP_READ ), 0 ,
59- 		0 , uintptr (length ))
60- 	if  addr  ==  0  {
61- 		return  nil , os .NewSyscallError ("MapViewOfFile" , errno )
65+ 	// Map the file into memory 
66+ 	addr , err  :=  windows .MapViewOfFile (
67+ 		handle ,
68+ 		windows .FILE_MAP_READ ,
69+ 		0 ,
70+ 		0 ,
71+ 		uintptr (length ),
72+ 	)
73+ 	if  err  !=  nil  {
74+ 		windows .CloseHandle (handle )
75+ 		return  nil , os .NewSyscallError ("MapViewOfFile" , err )
6276	}
77+ 
78+ 	// Store the handle in the map 
6379	handleLock .Lock ()
64- 	handleMap [addr ] =  h 
80+ 	handleMap [addr ] =  handle 
6581	handleLock .Unlock ()
6682
67- 	m  :=  memoryMap {}
68- 	dh  :=  m .header ()
69- 	dh .Data  =  addr 
70- 	dh .Len  =  length 
71- 	dh .Cap  =  dh .Len 
72- 
73- 	return  m , nil 
83+ 	// Convert addr to a slice without triggering warnings 
84+ 	data  :=  unsafe .Slice ((* byte )(unsafe .Pointer (addr )), length )
85+ 	return  data , nil 
7486}
7587
76- func  ( m   * memoryMap )  header ()  * reflect. SliceHeader  { 
77- 	 return  ( * reflect . SliceHeader )( unsafe . Pointer ( m )) 
78- } 
79- 
80- func   flush ( addr ,  len   uintptr )  error  { 
81- 	errno   :=   windows . FlushViewOfFile ( addr ,  len ) 
82- 	return  os . NewSyscallError ( "FlushViewOfFile" ,  errno ) 
88+ // flush ensures changes to a memory-mapped region are written to disk. 
89+ func   flush ( addr ,  length   uintptr )  error  { 
90+ 	 err   :=   windows . FlushViewOfFile ( addr ,  length ) 
91+ 	 if   err   !=   nil  { 
92+ 		 return   os . NewSyscallError ( "FlushViewOfFile" ,  err ) 
93+ 	} 
94+ 	return  nil 
8395}
8496
85- func  munmap ( b  [] byte ) ( err   error ) { 
86- 	 m   :=   memoryMap ( b ) 
87- 	dh   :=   m . header () 
88- 
89- 	addr  :=  dh . Data 
90- 	length  :=  uintptr (dh . Len )
97+ //  munmap unmaps a memory-mapped file and releases associated resources. 
98+ func   munmap ( b  [] byte )  error  { 
99+ 	// Convert slice to base address and length 
100+ 	 data   :=   unsafe . SliceData ( b ) 
101+ 	addr  :=  uintptr ( unsafe . Pointer ( data )) 
102+ 	length  :=  uintptr (len ( b ) )
91103
92- 	flush (addr , length )
93- 	err  =  windows .UnmapViewOfFile (addr )
94- 	if  err  !=  nil  {
104+ 	// Flush the memory region 
105+ 	if  err  :=  flush (addr , length ); err  !=  nil  {
95106		return  err 
96107	}
97108
109+ 	// Unmap the memory 
110+ 	if  err  :=  windows .UnmapViewOfFile (addr ); err  !=  nil  {
111+ 		return  os .NewSyscallError ("UnmapViewOfFile" , err )
112+ 	}
113+ 
114+ 	// Remove the handle from the map and close it 
98115	handleLock .Lock ()
99116	defer  handleLock .Unlock ()
117+ 
100118	handle , ok  :=  handleMap [addr ]
101119	if  ! ok  {
102120		// should be impossible; we would've errored above 
103121		return  errors .New ("unknown base address" )
104122	}
105123	delete (handleMap , addr )
106124
107- 	e  :=  windows .CloseHandle (windows .Handle (handle ))
108- 	return  os .NewSyscallError ("CloseHandle" , e )
125+ 	if  err  :=  windows .CloseHandle (handle ); err  !=  nil  {
126+ 		return  os .NewSyscallError ("CloseHandle" , err )
127+ 	}
128+ 	return  nil 
109129}
0 commit comments