(root)/
glibc-2.38/
support/
support_shared_allocate.c
       1  /* Allocate a memory region shared across processes.
       2     Copyright (C) 2017-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <errno.h>
      20  #include <stddef.h>
      21  #include <support/support.h>
      22  #include <support/xunistd.h>
      23  #include <sys/mman.h>
      24  
      25  /* Header for the allocation.  It contains the size of the allocation
      26     for subsequent unmapping.  */
      27  struct header
      28  {
      29    size_t total_size;
      30    char data[] __attribute__ ((aligned (__alignof__ (max_align_t))));
      31  };
      32  
      33  void *
      34  support_shared_allocate (size_t size)
      35  {
      36    size_t total_size = size + offsetof (struct header, data);
      37    if (total_size < size)
      38      {
      39        errno = ENOMEM;
      40        oom_error (__func__, size);
      41        return NULL;
      42      }
      43    else
      44      {
      45        struct header *result = xmmap (NULL, total_size, PROT_READ | PROT_WRITE,
      46                                       MAP_ANONYMOUS | MAP_SHARED, -1);
      47        result->total_size = total_size;
      48        return &result->data;
      49      }
      50  }
      51  
      52  void
      53  support_shared_free (void *data)
      54  {
      55    struct header *header = data - offsetof (struct header, data);
      56    xmunmap (header, header->total_size);
      57  }