summaryrefslogtreecommitdiff
path: root/src/dl/dlfcn.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/dl/dlfcn.go')
-rw-r--r--src/dl/dlfcn.go23
1 files changed, 13 insertions, 10 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