Source file src/cmd/vendor/golang.org/x/sys/unix/sysvshm_unix.go

     1  // Copyright 2021 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build (darwin && !ios) || linux
     6  // +build darwin,!ios linux
     7  
     8  package unix
     9  
    10  import (
    11  	"unsafe"
    12  
    13  	"golang.org/x/sys/internal/unsafeheader"
    14  )
    15  
    16  // SysvShmAttach attaches the Sysv shared memory segment associated with the
    17  // shared memory identifier id.
    18  func SysvShmAttach(id int, addr uintptr, flag int) ([]byte, error) {
    19  	addr, errno := shmat(id, addr, flag)
    20  	if errno != nil {
    21  		return nil, errno
    22  	}
    23  
    24  	// Retrieve the size of the shared memory to enable slice creation
    25  	var info SysvShmDesc
    26  
    27  	_, err := SysvShmCtl(id, IPC_STAT, &info)
    28  	if err != nil {
    29  		// release the shared memory if we can't find the size
    30  
    31  		// ignoring error from shmdt as there's nothing sensible to return here
    32  		shmdt(addr)
    33  		return nil, err
    34  	}
    35  
    36  	// Use unsafe to convert addr into a []byte.
    37  	// TODO: convert to unsafe.Slice once we can assume Go 1.17
    38  	var b []byte
    39  	hdr := (*unsafeheader.Slice)(unsafe.Pointer(&b))
    40  	hdr.Data = unsafe.Pointer(addr)
    41  	hdr.Cap = int(info.Segsz)
    42  	hdr.Len = int(info.Segsz)
    43  	return b, nil
    44  }
    45  
    46  // SysvShmDetach unmaps the shared memory slice returned from SysvShmAttach.
    47  //
    48  // It is not safe to use the slice after calling this function.
    49  func SysvShmDetach(data []byte) error {
    50  	if len(data) == 0 {
    51  		return EINVAL
    52  	}
    53  
    54  	return shmdt(uintptr(unsafe.Pointer(&data[0])))
    55  }
    56  
    57  // SysvShmGet returns the Sysv shared memory identifier associated with key.
    58  // If the IPC_CREAT flag is specified a new segment is created.
    59  func SysvShmGet(key, size, flag int) (id int, err error) {
    60  	return shmget(key, size, flag)
    61  }
    62  

View as plain text