@@ -87,25 +87,17 @@ func libOpen(name string, initializer PluginInitializer) (*Plugin, error) {
8787 plugins = make (map [string ]* Plugin )
8888 }
8989
90- p = & Plugin {handler : uintptr (h ), filepath : filepath }
90+ p = & Plugin {handler : uintptr (h ), filepath : filepath , name : name }
9191
92- lookupFunc := func (symName string ) (uintptr , error ) {
93- cname := make ([]byte , len (symName )+ 1 )
94- copy (cname , symName )
92+ if initializer != nil {
93+ lookupFunc := produceLookup (h , name )
9594
96- p := C .dlplugin_lookup (h , (* C .char )(unsafe .Pointer (& cname [0 ])), & cErr )
97- if p == 0 {
98- return 0 , errors .New (`dlplugin.Open("` + name + `"): could not find symbol ` + symName + `: ` + C .GoString (cErr ))
99- }
95+ if err := initializer .Init (lookupFunc ); err != nil {
96+ C .dlplugin_close (C .uintptr_t (p .handler ))
97+ pluginsMu .Unlock ()
10098
101- return uintptr (p ), nil
102- }
103-
104- if err := initializer .Init (lookupFunc ); err != nil {
105- C .dlplugin_close (C .uintptr_t (p .handler ))
106- pluginsMu .Unlock ()
107-
108- return nil , err
99+ return nil , err
100+ }
109101 }
110102
111103 plugins [filepath ] = p
@@ -125,7 +117,33 @@ func libClose(p *Plugin) error {
125117 return nil
126118}
127119
120+ func produceLookup (h C.uintptr_t , name string ) func (symName string ) (uintptr , error ) {
121+ return func (symName string ) (uintptr , error ) {
122+ var cErr * C.char
123+ cname := make ([]byte , len (symName )+ 1 )
124+ copy (cname , symName )
125+
126+ p := C .dlplugin_lookup (h , (* C .char )(unsafe .Pointer (& cname [0 ])), & cErr )
127+ if p == 0 {
128+ return 0 , errors .New (`dlplugin.Open("` + name + `"): could not find symbol ` + symName + `: ` + C .GoString (cErr ))
129+ }
130+
131+ return uintptr (p ), nil
132+ }
133+ }
134+
135+ func libInit (p * Plugin , initializer PluginInitializer ) error {
136+ pluginsMu .RLock ()
137+
138+ lookup := produceLookup (C .uintptr_t (p .handler ), p .name )
139+ err := initializer .Init (lookup )
140+
141+ pluginsMu .RUnlock ()
142+
143+ return err
144+ }
145+
128146var (
129- pluginsMu sync.Mutex
147+ pluginsMu sync.RWMutex
130148 plugins map [string ]* Plugin
131149)
0 commit comments