diff options
author | Luke Shumaker <lukeshu@sbcglobal.net> | 2015-10-26 16:16:25 -0400 |
---|---|---|
committer | Luke Shumaker <lukeshu@sbcglobal.net> | 2015-10-26 16:16:25 -0400 |
commit | aa17f05b81357cb3c63bee30b361c682ab12205e (patch) | |
tree | 263f664711ba57411396afcb147cd7d8faacbdf3 /src/dl | |
parent | 5b2b2f445d3ba4688e94ecb80c56c7940024e776 (diff) |
dlfcn: dlerror requires a global lock anyway
Diffstat (limited to 'src/dl')
-rw-r--r-- | src/dl/dlfcn.go | 23 | ||||
-rw-r--r-- | src/dl/dlsym_reserved.go | 8 |
2 files changed, 17 insertions, 14 deletions
diff --git a/src/dl/dlfcn.go b/src/dl/dlfcn.go index eb40794..e240540 100644 --- a/src/dl/dlfcn.go +++ b/src/dl/dlfcn.go @@ -58,33 +58,36 @@ const ( type Handle struct { c unsafe.Pointer o int - l sync.RWMutex } +var dllock sync.Mutex + // Open a shared object file, returning a Handle to it, or an error. // If name is an empty string, then the returned handle is the global // symbol table for the current process; if the name contains a slash, // then it is interpretted as a pathname; otherwise, it is // interpretted in an implementation-defined manner. -func Open(name string, flags Flag) (*Handle, error) { +func Open(name string, flags Flag) (Handle, error) { nameC := C.CString(name) defer C.free(unsafe.Pointer(nameC)) if name == "" { nameC = nil } + dllock.Lock() + defer dllock.Unlock() dlerror() ptr := C.dlopen(nameC, C.int(flags)) if ptr == nil { - return &Handle{}, dlerror() + return Handle{}, dlerror() } - return &Handle{c: ptr, o: 1}, nil + return Handle{c: ptr, o: 1}, nil } // Look up a symbol, and return a pointer to it. -func (h *Handle) Sym(symbol string) (unsafe.Pointer, error) { - h.l.RLock() - defer h.l.RUnlock() +func (h Handle) Sym(symbol string) (unsafe.Pointer, error) { + dllock.Lock() + defer dllock.Unlock() if h.o == 0 { return nil, HandleClosedError @@ -104,9 +107,9 @@ func (h *Handle) Sym(symbol string) (unsafe.Pointer, error) { // Close this handle on a shared object; decrementint the reference // count; if the reference count drops below 0, then the object is // unloaded. -func (h *Handle) Close() error { - h.l.Lock() - defer h.l.Unlock() +func (h Handle) Close() error { + dllock.Lock() + defer dllock.Unlock() if h.o == 0 { return HandleClosedError diff --git a/src/dl/dlsym_reserved.go b/src/dl/dlsym_reserved.go index cfa0dca..081e012 100644 --- a/src/dl/dlsym_reserved.go +++ b/src/dl/dlsym_reserved.go @@ -44,7 +44,7 @@ var ( // the executable and its dependencies, as well as symbols in // shared objects that were dynamically loaded with the // RTLD_GLOBAL flag. - RTLD_DEFAULT *Handle + RTLD_DEFAULT Handle // This Handle represents the shared object search order after // the current object. This allows one to provide a wrapper @@ -54,10 +54,10 @@ var ( // "real" function provided in another shared object (or for // that matter, the "next" definition of the function in cases // where there are multiple layers of preloading). - RTLD_NEXT *Handle + RTLD_NEXT Handle ) func init() { - RTLD_DEFAULT = &Handle{c: unsafe.Pointer(uintptr(C.rtld_default)), o: 2} - RTLD_DEFAULT = &Handle{c: unsafe.Pointer(uintptr(C.rtld_next)), o: 2} + RTLD_DEFAULT = Handle{c: unsafe.Pointer(uintptr(C.rtld_default)), o: 2} + RTLD_DEFAULT = Handle{c: unsafe.Pointer(uintptr(C.rtld_next)), o: 2} } |