First implementation
This commit is contained in:
		
							
								
								
									
										21
									
								
								vendor/github.com/mattn/go-pointer/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/mattn/go-pointer/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| The MIT License (MIT) | ||||
|  | ||||
| Copyright (c) 2019 Yasuhiro Matsumoto | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
							
								
								
									
										29
									
								
								vendor/github.com/mattn/go-pointer/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/mattn/go-pointer/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| # go-pointer | ||||
|  | ||||
| Utility for cgo | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| https://github.com/golang/proposal/blob/master/design/12416-cgo-pointers.md | ||||
|  | ||||
| In go 1.6, cgo argument can't be passed Go pointer. | ||||
|  | ||||
| ``` | ||||
| var s string | ||||
| C.pass_pointer(pointer.Save(&s)) | ||||
| v := *(pointer.Restore(C.get_from_pointer()).(*string)) | ||||
| ``` | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
| ``` | ||||
| go get github.com/mattn/go-pointer | ||||
| ``` | ||||
|  | ||||
| ## License | ||||
|  | ||||
| MIT | ||||
|  | ||||
| ## Author | ||||
|  | ||||
| Yasuhiro Matsumoto (a.k.a mattn) | ||||
							
								
								
									
										1
									
								
								vendor/github.com/mattn/go-pointer/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/mattn/go-pointer/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| package pointer | ||||
							
								
								
									
										57
									
								
								vendor/github.com/mattn/go-pointer/pointer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/mattn/go-pointer/pointer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| package pointer | ||||
|  | ||||
| // #include <stdlib.h> | ||||
| import "C" | ||||
| import ( | ||||
| 	"sync" | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	mutex sync.RWMutex | ||||
| 	store = map[unsafe.Pointer]interface{}{} | ||||
| ) | ||||
|  | ||||
| func Save(v interface{}) unsafe.Pointer { | ||||
| 	if v == nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Generate real fake C pointer. | ||||
| 	// This pointer will not store any data, but will bi used for indexing purposes. | ||||
| 	// Since Go doest allow to cast dangling pointer to unsafe.Pointer, we do rally allocate one byte. | ||||
| 	// Why we need indexing, because Go doest allow C code to store pointers to Go data. | ||||
| 	var ptr unsafe.Pointer = C.malloc(C.size_t(1)) | ||||
| 	if ptr == nil { | ||||
| 		panic("can't allocate 'cgo-pointer hack index pointer': ptr == nil") | ||||
| 	} | ||||
|  | ||||
| 	mutex.Lock() | ||||
| 	store[ptr] = v | ||||
| 	mutex.Unlock() | ||||
|  | ||||
| 	return ptr | ||||
| } | ||||
|  | ||||
| func Restore(ptr unsafe.Pointer) (v interface{}) { | ||||
| 	if ptr == nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	mutex.RLock() | ||||
| 	v = store[ptr] | ||||
| 	mutex.RUnlock() | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func Unref(ptr unsafe.Pointer) { | ||||
| 	if ptr == nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	mutex.Lock() | ||||
| 	delete(store, ptr) | ||||
| 	mutex.Unlock() | ||||
|  | ||||
| 	C.free(ptr) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user