summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2015-10-26 16:16:25 -0400
committerLuke Shumaker <lukeshu@sbcglobal.net>2015-10-26 16:16:25 -0400
commitaa17f05b81357cb3c63bee30b361c682ab12205e (patch)
tree263f664711ba57411396afcb147cd7d8faacbdf3
parent5b2b2f445d3ba4688e94ecb80c56c7940024e776 (diff)
dlfcn: dlerror requires a global lock anyway
-rw-r--r--src/dl/dlfcn.go23
-rw-r--r--src/dl/dlsym_reserved.go8
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}
}