From aa17f05b81357cb3c63bee30b361c682ab12205e Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 26 Oct 2015 16:16:25 -0400 Subject: dlfcn: dlerror requires a global lock anyway --- src/dl/dlfcn.go | 23 +++++++++++++---------- src/dl/dlsym_reserved.go | 8 ++++---- 2 files changed, 17 insertions(+), 14 deletions(-) (limited to 'src') 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} } -- cgit v1.2.2