Skip to content

Commit fe12abf

Browse files
committed
update
1 parent 91d266b commit fe12abf

File tree

7 files changed

+106
-40
lines changed

7 files changed

+106
-40
lines changed

Makefile

+4
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,7 @@ lint:
1717
.PHONY: dep
1818
dep:
1919
go mod tidy
20+
21+
.PHONY: clean
22+
clean:
23+
rm -f *.out

posix.go

+13-11
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,18 @@ func (s *posixSharedMemory) Read(p []byte) (int, error) {
5555
return 0, io.EOF
5656
}
5757

58-
count := int64(len(p))
59-
if s.size-s.offset < count {
60-
count = s.size - s.offset
58+
bytesToRead := int64(len(p))
59+
if s.size-s.offset < bytesToRead {
60+
bytesToRead = s.size - s.offset
6161
}
62-
buffer := C.malloc(C.size_t(count))
62+
63+
buffer := C.malloc(C.size_t(bytesToRead))
6364
if buffer == nil {
6465
return 0, fmt.Errorf("malloc failed")
6566
}
6667
defer C.free(buffer)
6768

68-
bytesRead := C.posix_shm_read(C.int(s.fd), buffer, C.size_t(count))
69+
bytesRead := C.posix_shm_read(C.int(s.fd), buffer, C.size_t(bytesToRead))
6970
if bytesRead == -1 {
7071
return 0, fmt.Errorf("read failed")
7172
}
@@ -83,23 +84,24 @@ func (s *posixSharedMemory) Write(p []byte) (n int, err error) {
8384
return 0, io.ErrShortWrite
8485
}
8586

86-
count := int64(len(p))
87-
if s.size-s.offset < count {
88-
count = s.size - s.offset
87+
bytesToWrite := int64(len(p))
88+
if s.size-s.offset < bytesToWrite {
89+
bytesToWrite = s.size - s.offset
8990
}
90-
bytesWrite := C.posix_shm_write(C.int(s.fd), unsafe.Pointer(&p[0]), C.size_t(count))
91+
92+
bytesWrite := C.posix_shm_write(C.int(s.fd), unsafe.Pointer(&p[0]), C.size_t(bytesToWrite))
9193
if bytesWrite == -1 {
9294
return 0, fmt.Errorf("write failed")
9395
}
9496

97+
n = int(bytesWrite)
9598
s.offset += int64(bytesWrite)
9699
if int(bytesWrite) < len(p) {
97100
err = io.ErrShortWrite
98101
}
99-
return int(bytesWrite), err
102+
return n, err
100103
}
101104

102-
// see lseek(2)
103105
func (s *posixSharedMemory) Seek(offset int64, whence int) (int64, error) {
104106
var newOffset int64
105107
switch whence {

shm.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ int posix_shm_create(const char* name, int flag, mode_t mode, off_t length, void
2020
if (shm_addr == MAP_FAILED) {
2121
return -1;
2222
}
23+
2324
*addr = shm_addr;
2425
return fd;
2526
}
2627

27-
int posix_shm_remove(const char* name, void *addr, size_t length) {
28+
int posix_shm_remove(const char* name, void* addr, size_t length) {
2829
int code = munmap(addr, length);
2930
if (code == -1) {
3031
return -1;
@@ -38,6 +39,7 @@ int64_t posix_shm_seek(int fd, off_t offset, int whence) {
3839
if (new_offset == (off_t)-1) {
3940
return -1;
4041
}
42+
4143
return (int64_t)new_offset;
4244
}
4345

@@ -49,22 +51,19 @@ int posix_shm_write(int fd, void* buf, size_t count) {
4951
return write(fd, buf, count);
5052
}
5153

52-
#include <stdio.h>
53-
54-
int sysv_shm_create(const char *pathname, int proj_id, size_t size, int flag, int mode, void** addr) {
54+
int sysv_shm_create(const char* pathname, int proj_id, size_t size, int flag, mode_t mode, void** addr) {
5555
key_t key = IPC_PRIVATE;
5656
if (proj_id != 0) {
5757
key = ftok(pathname, proj_id);
5858
}
59-
int id = shmget(key, size, flag | mode);
59+
60+
int id = shmget(key, size, flag|mode);
6061
if (id == -1) {
61-
perror("shmget");
6262
return -1;
6363
}
6464

6565
void* shm_addr = shmat(id, NULL, 0);
6666
if (shm_addr == (void*)-1) {
67-
perror("shmat");
6867
return -1;
6968
}
7069

@@ -77,6 +76,7 @@ int sysv_shm_remove(int shmid, void* addr) {
7776
if (code == -1) {
7877
return -1;
7978
}
79+
8080
return shmctl(shmid, IPC_RMID, NULL);
8181
}
8282

shm.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,18 @@ import (
1111
type SharedMemory interface {
1212
io.ReadWriteCloser
1313
io.Seeker
14+
15+
// Fd returns the integer Unix file descriptor of the underlying shared memory object
1416
Fd() uintptr
17+
// Raw returns the raw pointer to the memory address of the underlying shared memory object
1518
Raw() unsafe.Pointer
19+
// Size returns size of the shared memory
1620
Size() int64
21+
// Offset returns current offset of the shared memory
1722
Offset() int64
1823
}
1924

20-
// NewPosix creates POSIX shared memory object
25+
// NewPosix creates a POSIX shared memory object
2126
func NewPosix(size int64, flag int, perm os.FileMode) (SharedMemory, error) {
2227
return newPosixSharedMemory(size, flag, perm)
2328
}

shm.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ int64_t posix_shm_seek(int fd, off_t offset, int whence);
1111
int posix_shm_read(int fd, void* buf, size_t count);
1212
int posix_shm_write(int fd, void* buf, size_t count);
1313

14-
int sysv_shm_create(const char *pathname, int proj_id, size_t size, int flag, int mode, void** addr);
14+
int sysv_shm_create(const char *pathname, int proj_id, size_t size, int flag, mode_t mode, void** addr);
1515
int sysv_shm_remove(int shmid, void* addr);
1616
int sysv_shm_read(void* dest, void* src, int offset, size_t count);
1717
int sysv_shm_write(void* dest, int offset, void* src, size_t count);

shm_test.go

+61-9
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package shm
22

33
import (
4+
"io"
45
"os"
56
"testing"
67
)
78

89
const (
910
size = 1024 * 1024
1011
flag = os.O_RDWR | os.O_CREATE | os.O_EXCL
11-
perm = 0600
12+
perm = 0666
1213
)
1314

14-
func TestCreatePosixSharedMemory(t *testing.T) {
15+
func TestPosixSharedMemory(t *testing.T) {
1516
mem, err := NewPosix(size, flag, perm)
1617
if err != nil {
1718
t.Fatal(err)
@@ -28,20 +29,40 @@ func TestCreatePosixSharedMemory(t *testing.T) {
2829
if mem.Offset() != 0 {
2930
t.Fatal("wrong offset")
3031
}
31-
}
3232

33-
func TestRemovePosixSharedMemory(t *testing.T) {
34-
mem, err := NewPosix(size, flag, perm)
33+
data := []byte("hello world")
34+
n, err := mem.Write(data)
35+
if n != len(data) {
36+
t.Fatal("short write")
37+
}
38+
if mem.Offset() != int64(len(data)) {
39+
t.Fatal("invalid offset")
40+
}
41+
42+
offset, err := mem.Seek(0, io.SeekStart)
3543
if err != nil {
3644
t.Fatal(err)
3745
}
46+
if offset != 0 {
47+
t.Fatal("seek failed")
48+
}
49+
50+
buf := make([]byte, len(data))
51+
n, err = mem.Read(buf)
52+
if n != len(buf) {
53+
t.Fatal("read failed")
54+
}
55+
if string(buf) != string(data) {
56+
t.Fatal("read failed")
57+
}
58+
3859
err = mem.Close()
3960
if err != nil {
4061
t.Fatal(err)
4162
}
4263
}
4364

44-
func TestCreateSystemVSharedMemory(t *testing.T) {
65+
func TestSystemVSharedMemory(t *testing.T) {
4566
mem, err := NewSystemVPrivate(size, IPCCreate|IPCExclusive, perm)
4667
if err != nil {
4768
t.Fatal(err)
@@ -58,15 +79,46 @@ func TestCreateSystemVSharedMemory(t *testing.T) {
5879
if mem.Offset() != 0 {
5980
t.Fatal("wrong offset")
6081
}
61-
}
6282

63-
func TestRemoveSystemVSharedMemory(t *testing.T) {
64-
mem, err := NewSystemVPrivate(size, IPCCreate, perm)
83+
data := []byte("hello world")
84+
n, err := mem.Write(data)
85+
if n != len(data) {
86+
t.Fatal("short write")
87+
}
88+
if mem.Offset() != int64(len(data)) {
89+
t.Fatal("invalid offset")
90+
}
91+
92+
offset, err := mem.Seek(0, io.SeekStart)
6593
if err != nil {
6694
t.Fatal(err)
6795
}
96+
if offset != 0 {
97+
t.Fatal("seek failed")
98+
}
99+
100+
buf := make([]byte, len(data))
101+
n, err = mem.Read(buf)
102+
if n != len(buf) {
103+
t.Fatal("read failed")
104+
}
105+
if string(buf) != string(data) {
106+
t.Fatal("read failed")
107+
}
108+
68109
err = mem.Close()
69110
if err != nil {
70111
t.Fatal(err)
71112
}
72113
}
114+
115+
func TestRandomName(t *testing.T) {
116+
name1 := randomName()
117+
name2 := randomName()
118+
if len(name1) != 26 {
119+
t.Fatal("unexpected name length")
120+
}
121+
if name1 == name2 {
122+
t.Fatal("same name")
123+
}
124+
}

sysv.go

+14-11
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func newSystemVSharedMemory(size int64, flag int, perm os.FileMode, path string,
3636

3737
var addr unsafe.Pointer
3838

39-
id := C.sysv_shm_create(pathname, C.int(projectID), C.size_t(size), C.int(flag), C.int(perm), &addr)
39+
id := C.sysv_shm_create(pathname, C.int(projectID), C.size_t(size), C.int(flag), C.mode_t(perm), &addr)
4040
if id == -1 {
4141
return nil, fmt.Errorf("create System V shared memory failed")
4242
}
@@ -57,17 +57,18 @@ func (s *systemVSharedMemory) Read(p []byte) (int, error) {
5757
return 0, io.EOF
5858
}
5959

60-
count := int64(len(p))
61-
if s.size-s.offset < count {
62-
count = s.size - s.offset
60+
bytesToRead := int64(len(p))
61+
if s.size-s.offset < bytesToRead {
62+
bytesToRead = s.size - s.offset
6363
}
64-
buffer := C.malloc(C.size_t(count))
64+
65+
buffer := C.malloc(C.size_t(bytesToRead))
6566
if buffer == nil {
6667
return 0, fmt.Errorf("malloc failed")
6768
}
6869
defer C.free(buffer)
6970

70-
bytesRead := C.sysv_shm_read(buffer, s.addr, C.int(s.offset), C.size_t(count))
71+
bytesRead := C.sysv_shm_read(buffer, s.addr, C.int(s.offset), C.size_t(bytesToRead))
7172
if bytesRead == -1 {
7273
return 0, fmt.Errorf("read failed")
7374
}
@@ -85,20 +86,22 @@ func (s *systemVSharedMemory) Write(p []byte) (n int, err error) {
8586
return 0, io.ErrShortWrite
8687
}
8788

88-
count := int64(len(p))
89-
if s.size-s.offset < count {
90-
count = s.size - s.offset
89+
bytesToWrite := int64(len(p))
90+
if s.size-s.offset < bytesToWrite {
91+
bytesToWrite = s.size - s.offset
9192
}
92-
bytesWrite := C.sysv_shm_write(s.addr, C.int(s.offset), unsafe.Pointer(&p[0]), C.size_t(count))
93+
94+
bytesWrite := C.sysv_shm_write(s.addr, C.int(s.offset), unsafe.Pointer(&p[0]), C.size_t(bytesToWrite))
9395
if bytesWrite == -1 {
9496
return 0, fmt.Errorf("write failed")
9597
}
9698

99+
n = int(bytesWrite)
97100
s.offset += int64(bytesWrite)
98101
if int(bytesWrite) < len(p) {
99102
err = io.ErrShortWrite
100103
}
101-
return int(bytesWrite), err
104+
return n, err
102105
}
103106

104107
func (s *systemVSharedMemory) Seek(offset int64, whence int) (int64, error) {

0 commit comments

Comments
 (0)