
As mentioned in previous patches, services may not subscribe to process events from specific processes only, since this results in race conditions. However, the IPC server can safely turn on and off its entire subscription based on whether any System V IPC semaphores (and, in the future, message queues) are allocated at all. Since the System V IPC facilities are not so commonly used, this removes the extra round trip from PM to the IPC server and back for caught signals and process exits in the common case. Change-Id: I937259034872be32f4e26ab99270f4d475ff6134
63 lines
1.5 KiB
C
63 lines
1.5 KiB
C
#define _SYSTEM 1 /* get OK and negative error codes */
|
|
|
|
#include <minix/callnr.h>
|
|
#include <minix/com.h>
|
|
#include <minix/config.h>
|
|
#include <minix/ipc.h>
|
|
#include <minix/endpoint.h>
|
|
#include <minix/sysutil.h>
|
|
#include <minix/const.h>
|
|
#include <minix/type.h>
|
|
#include <minix/syslib.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/param.h>
|
|
#include <sys/ipc.h>
|
|
#include <sys/shm.h>
|
|
#include <sys/sem.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/queue.h>
|
|
#include <sys/mman.h>
|
|
#include <machine/param.h>
|
|
#include <machine/vm.h>
|
|
#include <machine/vmparam.h>
|
|
|
|
#include <lib.h>
|
|
#include <time.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
#include <signal.h>
|
|
#include <assert.h>
|
|
|
|
/*
|
|
* On NetBSD, these macros are only defined when _KERNEL is set. However,
|
|
* since ipcs(1) uses IXSEQ_TO_IPCID, NetBSD cannot change these macros without
|
|
* breaking the userland API. Thus, having a copy of them here is not risky.
|
|
*/
|
|
#define IPCID_TO_IX(id) ((id) & 0xffff)
|
|
#define IPCID_TO_SEQ(id) (((id) >> 16) & 0xffff)
|
|
|
|
/* main.c */
|
|
void update_sem_sub(int);
|
|
|
|
/* shm.c */
|
|
int do_shmget(message *);
|
|
int do_shmat(message *);
|
|
int do_shmdt(message *);
|
|
int do_shmctl(message *);
|
|
int is_shm_nil(void);
|
|
void update_refcount_and_destroy(void);
|
|
|
|
/* sem.c */
|
|
int do_semget(message *);
|
|
int do_semctl(message *);
|
|
int do_semop(message *);
|
|
int is_sem_nil(void);
|
|
void sem_process_event(endpoint_t, int);
|
|
|
|
/* utility.c */
|
|
int check_perm(struct ipc_perm *, endpoint_t, int);
|