You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.6 KiB
61 lines
1.6 KiB
// Copyright 2021 The Go Authors. All rights reserved. |
|
// Use of this source code is governed by a BSD-style |
|
// license that can be found in the LICENSE file. |
|
|
|
//go:build (darwin && !ios) || linux |
|
// +build darwin,!ios linux |
|
|
|
package unix |
|
|
|
import ( |
|
"unsafe" |
|
|
|
"golang.org/x/sys/internal/unsafeheader" |
|
) |
|
|
|
// SysvShmAttach attaches the Sysv shared memory segment associated with the |
|
// shared memory identifier id. |
|
func SysvShmAttach(id int, addr uintptr, flag int) ([]byte, error) { |
|
addr, errno := shmat(id, addr, flag) |
|
if errno != nil { |
|
return nil, errno |
|
} |
|
|
|
// Retrieve the size of the shared memory to enable slice creation |
|
var info SysvShmDesc |
|
|
|
_, err := SysvShmCtl(id, IPC_STAT, &info) |
|
if err != nil { |
|
// release the shared memory if we can't find the size |
|
|
|
// ignoring error from shmdt as there's nothing sensible to return here |
|
shmdt(addr) |
|
return nil, err |
|
} |
|
|
|
// Use unsafe to convert addr into a []byte. |
|
// TODO: convert to unsafe.Slice once we can assume Go 1.17 |
|
var b []byte |
|
hdr := (*unsafeheader.Slice)(unsafe.Pointer(&b)) |
|
hdr.Data = unsafe.Pointer(addr) |
|
hdr.Cap = int(info.Segsz) |
|
hdr.Len = int(info.Segsz) |
|
return b, nil |
|
} |
|
|
|
// SysvShmDetach unmaps the shared memory slice returned from SysvShmAttach. |
|
// |
|
// It is not safe to use the slice after calling this function. |
|
func SysvShmDetach(data []byte) error { |
|
if len(data) == 0 { |
|
return EINVAL |
|
} |
|
|
|
return shmdt(uintptr(unsafe.Pointer(&data[0]))) |
|
} |
|
|
|
// SysvShmGet returns the Sysv shared memory identifier associated with key. |
|
// If the IPC_CREAT flag is specified a new segment is created. |
|
func SysvShmGet(key, size, flag int) (id int, err error) { |
|
return shmget(key, size, flag) |
|
}
|
|
|