From b1ebd4e1001ca7721b233ca981ce6df39eceacea Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 1 Oct 2021 11:38:46 +0200 Subject: [PATCH] unix: enable Sysv shared memory support on darwin/arm64 Keep it disabled on ios though. For golang/go#45696 For golang/go#46084 Change-Id: I3d551227a4ebc0eebabdd16b175aa6a75ea9de19 Reviewed-on: https://go-review.googlesource.com/c/sys/+/353509 Trust: Tobias Klauser Run-TryBot: Tobias Klauser Reviewed-by: Ian Lance Taylor --- unix/example_sysvshm_test.go | 5 ++- unix/sysvshm_unix.go | 4 +-- unix/sysvshm_unix_other.go | 4 +-- unix/zsyscall_darwin_arm64.go | 59 +++++++++++++++++++++++++++++++++++ unix/ztypes_darwin_arm64.go | 36 +++++++++++++++++++++ 5 files changed, 101 insertions(+), 7 deletions(-) diff --git a/unix/example_sysvshm_test.go b/unix/example_sysvshm_test.go index 537f7701..66ef2edf 100644 --- a/unix/example_sysvshm_test.go +++ b/unix/example_sysvshm_test.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build (darwin && amd64) || (linux && !android) -// +build darwin,amd64 linux,!android +//go:build (darwin && !ios) || (linux && !android) +// +build darwin,!ios linux,!android package unix_test @@ -14,7 +14,6 @@ import ( ) func ExampleSysvShmGet() { - // create shared memory region of 1024 bytes id, err := unix.SysvShmGet(unix.IPC_PRIVATE, 1024, unix.IPC_CREAT|unix.IPC_EXCL|0o600) if err != nil { diff --git a/unix/sysvshm_unix.go b/unix/sysvshm_unix.go index 7d6ba360..0bb4c8de 100644 --- a/unix/sysvshm_unix.go +++ b/unix/sysvshm_unix.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build (darwin && amd64) || linux -// +build darwin,amd64 linux +//go:build (darwin && !ios) || linux +// +build darwin,!ios linux package unix diff --git a/unix/sysvshm_unix_other.go b/unix/sysvshm_unix_other.go index 579b53bf..71bddefd 100644 --- a/unix/sysvshm_unix_other.go +++ b/unix/sysvshm_unix_other.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build (darwin && amd64) -// +build darwin,amd64 +//go:build darwin && !ios +// +build darwin,!ios package unix diff --git a/unix/zsyscall_darwin_arm64.go b/unix/zsyscall_darwin_arm64.go index f2ee2bd3..cf71be3e 100644 --- a/unix/zsyscall_darwin_arm64.go +++ b/unix/zsyscall_darwin_arm64.go @@ -734,6 +734,65 @@ var libc_sendfile_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func shmat(id int, addr uintptr, flag int) (ret uintptr, err error) { + r0, _, e1 := syscall_syscall(libc_shmat_trampoline_addr, uintptr(id), uintptr(addr), uintptr(flag)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmat shmat "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) { + r0, _, e1 := syscall_syscall(libc_shmctl_trampoline_addr, uintptr(id), uintptr(cmd), uintptr(unsafe.Pointer(buf))) + result = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmctl shmctl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmdt(addr uintptr) (err error) { + _, _, e1 := syscall_syscall(libc_shmdt_trampoline_addr, uintptr(addr), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmdt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmdt shmdt "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmget(key int, size int, flag int) (id int, err error) { + r0, _, e1 := syscall_syscall(libc_shmget_trampoline_addr, uintptr(key), uintptr(size), uintptr(flag)) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmget_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmget shmget "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/unix/ztypes_darwin_arm64.go b/unix/ztypes_darwin_arm64.go index 96f0e6ae..c17f45c5 100644 --- a/unix/ztypes_darwin_arm64.go +++ b/unix/ztypes_darwin_arm64.go @@ -639,3 +639,39 @@ type Ucred struct { Ngroups int16 Groups [16]uint32 } + +type SysvIpcPerm struct { + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint16 + _ uint16 + _ int32 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Lpid int32 + Cpid int32 + Nattch uint16 + _ [34]byte +} + +const ( + IPC_CREAT = 0x200 + IPC_EXCL = 0x400 + IPC_NOWAIT = 0x800 + IPC_PRIVATE = 0x0 +) + +const ( + IPC_RMID = 0x0 + IPC_SET = 0x1 + IPC_STAT = 0x2 +) + +const ( + SHM_RDONLY = 0x1000 + SHM_RND = 0x2000 +)