Skip to content

Commit 43e4800

Browse files
authored
Merge pull request #197 from amenzhinsky/lib
sdjournal: fix concurrent map access
2 parents bc4673a + c8cc474 commit 43e4800

File tree

3 files changed

+132
-98
lines changed

3 files changed

+132
-98
lines changed

sdjournal/functions.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// Copyright 2015 RedHat, Inc.
2+
// Copyright 2015 CoreOS, Inc.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
package sdjournal
17+
18+
import (
19+
"github.com/coreos/pkg/dlopen"
20+
"sync"
21+
"unsafe"
22+
)
23+
24+
var (
25+
// lazy initialized
26+
libsystemdHandle *dlopen.LibHandle
27+
28+
libsystemdMutex = &sync.Mutex{}
29+
libsystemdFunctions = map[string]unsafe.Pointer{}
30+
libsystemdNames = []string{
31+
// systemd < 209
32+
"libsystemd-journal.so.0",
33+
"libsystemd-journal.so",
34+
35+
// systemd >= 209 merged libsystemd-journal into libsystemd proper
36+
"libsystemd.so.0",
37+
"libsystemd.so",
38+
}
39+
)
40+
41+
func getFunction(name string) (unsafe.Pointer, error) {
42+
libsystemdMutex.Lock()
43+
defer libsystemdMutex.Unlock()
44+
45+
if libsystemdHandle == nil {
46+
h, err := dlopen.GetHandle(libsystemdNames)
47+
if err != nil {
48+
return nil, err
49+
}
50+
51+
libsystemdHandle = h
52+
}
53+
54+
f, ok := libsystemdFunctions[name]
55+
if !ok {
56+
var err error
57+
f, err = libsystemdHandle.GetSymbolPointer(name)
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
libsystemdFunctions[name] = f
63+
}
64+
65+
return f, nil
66+
}

sdjournal/functions_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright 2015 RedHat, Inc.
2+
// Copyright 2015 CoreOS, Inc.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
package sdjournal
17+
18+
import "testing"
19+
20+
func TestGetFunction(t *testing.T) {
21+
f, err := getFunction("sd_journal_open")
22+
23+
if err != nil {
24+
t.Errorf("Error getting an existing function: %s", err)
25+
}
26+
27+
if f == nil {
28+
t.Error("Got nil function pointer")
29+
}
30+
31+
_, err = getFunction("non_existent_function")
32+
33+
if err == nil {
34+
t.Error("Expected to get an error, got nil")
35+
}
36+
}

0 commit comments

Comments
 (0)