Functions | Variables
semaphore.c File Reference
#include <kernel/mod2.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "simpleipc.h"
#include <Singular/cntrlc.h>
#include <reporter/si_signals.h>

Go to the source code of this file.

Functions

int sipc_semaphore_init (int id, int count)
 
int sipc_semaphore_exists (int id)
 
int sipc_semaphore_acquire (int id)
 
int sipc_semaphore_try_acquire (int id)
 
int sipc_semaphore_release (int id)
 
int sipc_semaphore_get_value (int id)
 
int simpleipc_cmd (char *cmd, int id, int v)
 

Variables

sipc_sem_tsemaphore [SIPC_MAX_SEMAPHORES]
 
int sem_acquired [SIPC_MAX_SEMAPHORES]
 

Function Documentation

◆ simpleipc_cmd()

int simpleipc_cmd ( char *  cmd,
int  id,
int  v 
)

Definition at line 167 of file semaphore.c.

168 {
169  if (strcmp(cmd,"init")==0)
170  return sipc_semaphore_init(id,v);
171  else if (strcmp(cmd,"exists")==0)
172  return sipc_semaphore_exists(id);
173  else if (strcmp(cmd,"acquire")==0)
174  return sipc_semaphore_acquire(id);
175  else if (strcmp(cmd,"try_acquire")==0)
176  return sipc_semaphore_try_acquire(id);
177  else if (strcmp(cmd,"release")==0)
178  return sipc_semaphore_release(id);
179  else if (strcmp(cmd,"get_value")==0)
180  return sipc_semaphore_get_value(id);
181  else printf("unknown\n");
182  return -2;
183 }
int sipc_semaphore_get_value(int id)
Definition: semaphore.c:153
int sipc_semaphore_try_acquire(int id)
Definition: semaphore.c:112
int sipc_semaphore_exists(int id)
Definition: semaphore.c:88
int sipc_semaphore_init(int id, int count)
Definition: semaphore.c:31
int sipc_semaphore_release(int id)
Definition: semaphore.c:135
const Variable & v
< [in] a sqrfree bivariate poly
Definition: facBivar.h:37
int sipc_semaphore_acquire(int id)
Definition: semaphore.c:94

◆ sipc_semaphore_acquire()

int sipc_semaphore_acquire ( int  id)

Definition at line 94 of file semaphore.c.

95 {
96  if ((id<0) || (id >= SIPC_MAX_SEMAPHORES) || (semaphore[id]==NULL)) return -1;
98 #if PORTABLE_SEMAPHORES
99  si_sem_wait(semaphore[id]->sig);
100  si_sem_wait(semaphore[id]->guard);
101  semaphore[id]->count--;
102  sem_post(semaphore[id]->guard);
103 #else
104  si_sem_wait(semaphore[id]);
105 #endif
106  sem_acquired[id]++;
107  defer_shutdown--;
108  if (!defer_shutdown && do_shutdown) m2_end(1);
109  return 1;
110 }
sipc_sem_t * semaphore[SIPC_MAX_SEMAPHORES]
Definition: semaphore.c:24
void m2_end(int i)
Definition: misc_ip.cc:1074
volatile BOOLEAN do_shutdown
Definition: cntrlc.cc:83
#define NULL
Definition: omList.c:10
#define SIPC_MAX_SEMAPHORES
Definition: simpleipc.h:10
volatile int defer_shutdown
Definition: cntrlc.cc:84
int sem_acquired[SIPC_MAX_SEMAPHORES]
Definition: semaphore.c:25

◆ sipc_semaphore_exists()

int sipc_semaphore_exists ( int  id)

Definition at line 88 of file semaphore.c.

89 {
90  if ((id<0) || (id >= SIPC_MAX_SEMAPHORES)) return -1;
91  return semaphore[id] != NULL;
92 }
sipc_sem_t * semaphore[SIPC_MAX_SEMAPHORES]
Definition: semaphore.c:24
#define NULL
Definition: omList.c:10
#define SIPC_MAX_SEMAPHORES
Definition: simpleipc.h:10

◆ sipc_semaphore_get_value()

int sipc_semaphore_get_value ( int  id)

Definition at line 153 of file semaphore.c.

154 {
155  int val;
156  if ((id<0) || (id >= SIPC_MAX_SEMAPHORES) || (semaphore[id]==NULL)) return -1;
157 #if PORTABLE_SEMAPHORES
158  sem_wait(semaphore[id]->guard);
159  val = semaphore[id]->count;
160  sem_post(semaphore[id]->guard);
161 #else
162  sem_getvalue(semaphore[id], &val);
163 #endif
164  return val;
165 }
sipc_sem_t * semaphore[SIPC_MAX_SEMAPHORES]
Definition: semaphore.c:24
#define NULL
Definition: omList.c:10
#define SIPC_MAX_SEMAPHORES
Definition: simpleipc.h:10

◆ sipc_semaphore_init()

int sipc_semaphore_init ( int  id,
int  count 
)

Definition at line 31 of file semaphore.c.

32 {
33  char buf[100];
34  sipc_sem_t *sem;
35  if ((id<0) || (id >= SIPC_MAX_SEMAPHORES))
36  return -1;
37  // Already initialized?
38  if (semaphore[id])
39  return 0;
40  // to make it completely safe, we should generate a name
41  // from /dev/urandom.
42 #if USE_SEM_INIT
43  // TODO: This should really use mapped memory so that processes
44  // can keep using the semaphore after fork + exec.
45  sem = malloc(sizeof(sem_t));
46  if (!sem)
47  return -1;
48  if (sem_init(sem, 1, count) < 0)
49  {
50  free(sem);
51  return -1;
52  }
53 #else
54 #if PORTABLE_SEMAPHORES
55 #ifndef MAP_ANONYMOUS
56 #define MAP_ANONYMOUS MAP_ANON
57 #endif
58  sem = mmap(NULL, getpagesize(),
59  PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED, -1, 0);
60  if (sem == MAP_FAILED)
61  return -1;
62  sem->count = count;
63  sprintf(buf, "/%d:sem%d:g", getpid(), id);
64  sem_unlink(buf);
65  sem->guard = sem_open(buf, O_CREAT, 0600, count);
66  sem_unlink(buf);
67  sprintf(buf, "/%d:sem%d:s", getpid(), id);
68  sem_unlink(buf);
69  sem->sig = sem_open(buf, O_CREAT, 0600, count);
70  sem_unlink(buf);
71 #else
72  sprintf(buf, "/%d:sem%d", getpid(), id);
73  sem_unlink(buf);
74  sem = sem_open(buf, O_CREAT, 0600, count);
75 #endif
76 #endif
77 #if !PORTABLE_SEMAPHORES
78  if (sem == SEM_FAILED || !sem)
79  return -1;
80 #endif
81  semaphore[id] = sem;
82 #if !USE_SEM_INIT
83  sem_unlink(buf);
84 #endif
85  return 1;
86 }
int status int void size_t count
Definition: si_signals.h:59
sipc_sem_t * semaphore[SIPC_MAX_SEMAPHORES]
Definition: semaphore.c:24
int status int void * buf
Definition: si_signals.h:59
void * malloc(size_t size)
Definition: omalloc.c:92
#define free
Definition: omAllocFunc.c:12
sem_t sipc_sem_t
Definition: simpleipc.h:27
#define NULL
Definition: omList.c:10
#define SIPC_MAX_SEMAPHORES
Definition: simpleipc.h:10

◆ sipc_semaphore_release()

int sipc_semaphore_release ( int  id)

Definition at line 135 of file semaphore.c.

136 {
137  if ((id<0) || (id >= SIPC_MAX_SEMAPHORES) || (semaphore[id]==NULL)) return -1;
138  defer_shutdown++;
139 #if PORTABLE_SEMAPHORES
140  sem_wait(semaphore[id]->guard);
141  semaphore[id]->count++;
142  sem_post(semaphore[id]->sig);
143  sem_post(semaphore[id]->guard);
144 #else
145  sem_post(semaphore[id]);
146 #endif
147  sem_acquired[id]--;
148  defer_shutdown--;
149  if (!defer_shutdown && do_shutdown) m2_end(1);
150  return 1;
151 }
sipc_sem_t * semaphore[SIPC_MAX_SEMAPHORES]
Definition: semaphore.c:24
void m2_end(int i)
Definition: misc_ip.cc:1074
volatile BOOLEAN do_shutdown
Definition: cntrlc.cc:83
#define NULL
Definition: omList.c:10
#define SIPC_MAX_SEMAPHORES
Definition: simpleipc.h:10
volatile int defer_shutdown
Definition: cntrlc.cc:84
int sem_acquired[SIPC_MAX_SEMAPHORES]
Definition: semaphore.c:25

◆ sipc_semaphore_try_acquire()

int sipc_semaphore_try_acquire ( int  id)

Definition at line 112 of file semaphore.c.

113 {
114  if ((id<0) || (id >= SIPC_MAX_SEMAPHORES) || (semaphore[id]==NULL)) return -1;
115  defer_shutdown++;
116 #if PORTABLE_SEMAPHORES
117  int trywait = si_sem_trywait(semaphore[id]->sig);
118 #else
119  int trywait = si_sem_trywait(semaphore[id]);
120 #endif
121  if (!trywait)
122  {
123 #if PORTABLE_SEMAPHORES
124  si_sem_wait(semaphore[id]->guard);
125  semaphore[id]->count--;
126  sem_post(semaphore[id]->guard);
127 #endif
128  sem_acquired[id]++;
129  }
130  defer_shutdown--;
131  if (!defer_shutdown && do_shutdown) m2_end(1);
132  return !trywait;
133 }
sipc_sem_t * semaphore[SIPC_MAX_SEMAPHORES]
Definition: semaphore.c:24
void m2_end(int i)
Definition: misc_ip.cc:1074
volatile BOOLEAN do_shutdown
Definition: cntrlc.cc:83
#define NULL
Definition: omList.c:10
#define SIPC_MAX_SEMAPHORES
Definition: simpleipc.h:10
volatile int defer_shutdown
Definition: cntrlc.cc:84
int sem_acquired[SIPC_MAX_SEMAPHORES]
Definition: semaphore.c:25

Variable Documentation

◆ sem_acquired

int sem_acquired[SIPC_MAX_SEMAPHORES]

Definition at line 25 of file semaphore.c.

◆ semaphore

Definition at line 24 of file semaphore.c.