File: sysvshm.c

package info (click to toggle)
glibc 2.23-4
  • links: PTS, VCS
  • area: main
  • in suites: jessie-backports
  • size: 233,552 kB
  • sloc: ansic: 987,702; asm: 260,118; sh: 10,380; makefile: 9,474; python: 3,957; cpp: 3,956; perl: 2,207; awk: 1,907; pascal: 1,527; yacc: 291; sed: 80
file content (96 lines) | stat: -rw-r--r-- 2,342 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/* Copyright (C) 2005 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/shm.h>


/* Description of an shm attachment.  */
struct sysvshm_attach
{
  /* Linked list.  */
  struct sysvshm_attach *next;

  /* Map address.  */
  void *addr;

  /* Map size.  */
  size_t size;
};

/* List of attachments.  */
static struct sysvshm_attach *attach_list;

/* A lock to protect the linked list of shared memory attachments.  */
static struct mutex sysvshm_lock = MUTEX_INITIALIZER;


/* Adds a segment attachment.  */
error_t
__sysvshm_add (void *addr, size_t size)
{
  struct sysvshm_attach *shm;

  shm = malloc (sizeof (*shm));
  if (!shm)
    return errno;

  __mutex_lock (&sysvshm_lock);
  shm->addr = addr;
  shm->size = size;
  shm->next = attach_list;
  attach_list = shm;
  __mutex_unlock (&sysvshm_lock);

  return 0;
}

/* Removes a segment attachment.  Returns its size if found, or EINVAL
   otherwise.  */
error_t
__sysvshm_remove (void *addr, size_t *size)
{
  struct sysvshm_attach *shm;
  struct sysvshm_attach **pshm = &attach_list;

  __mutex_lock (&sysvshm_lock);
  shm = attach_list;
  while (shm)
    {
      shm = *pshm;
      if (shm->addr == addr)
	{
	  *pshm = shm->next;
	  *size = shm->size;
	  __mutex_unlock (&sysvshm_lock);
	  return 0;
	}
      pshm = &shm->next;
      shm = shm->next;
    }
  __mutex_unlock (&sysvshm_lock);
  return EINVAL;
}