Copyright (C) 1994, Digital Equipment Corp.
UNSAFE INTERFACE** <sys/sem.h> **Usem ; FROM Ctypes IMPORT short, int; FROM Utypes IMPORT ushort, time_t; FROM Uexec IMPORT wait_queue_star; FROM Uipc IMPORT struct_ipc_perm;
** IPC Semaphore Facility.
** Implementation Constants.
CONST PZERO = 25; (* I got this value from param.h; em *) PSEMN = (PZERO + 3); (* sleep priority waiting for greater value *) PSEMZ = (PZERO + 2); (* sleep priority waiting for zero *)
** Permission Definitions.
SEM_A = 8_0200; (* alter permission *) SEM_R = 8_0400; (* read permission *)
** Semaphore Operation Flags.
SEM_UNDO = 8_010000; (* set up adjust on exit entry *)
** Semctl Command Definitions. (from /usr/include/linux/sem.h)
GETPID = 11; (* get sempid *) GETVAL = 12; (* get semval *) GETALL = 13; (* get all semval's *) GETNCNT = 14; (* get semncnt *) GETZCNT = 15; (* get semzcnt *) SETVAL = 16; (* set semval *) SETALL = 17; (* set all semval's *)
** Structure Definitions.
** There is one semaphore id data structure for each set of semaphores ** in the system.
TYPE
struct_semid_ds = RECORD
sem_perm : struct_ipc_perm; (* operation permission struct *)
sem_otime : time_t; (* last semop time *)
sem_ctime : time_t; (* last change time *)
sem_base : UNTRACED REF struct_sem; (* ptr to first semaphore in set *)
eventn : wait_queue_star;
eventz : wait_queue_star;
undo : UNTRACED REF struct_sem_undo;
sem_nsems : ushort; (* # of semaphores in set *)
END;
** There is one semaphore structure for each semaphore in the system.
struct_sem = RECORD
sempid : short; (* pid of last operation *)
semval : ushort; (* semaphore text map address *)
semncnt : short; (* # awaiting semval > cval *)
semzcnt : ushort; (* # awaiting semval = 0 *)
END;
** There is one undo structure per process in the system.
struct_sem_undo = RECORD
proc_next : UNTRACED REF struct_sem_undo;
id_next : UNTRACED REF struct_sem_undo;
semid : int;
semadj : short;
sem_num : ushort;
END;
** semaphore information structure
struct_seminfo = RECORD
semmap: int; (* # of entries in semaphore map *)
semmni: int; (* # of = semaphore; identifiers *)
semmns: int; (* # of semaphores in system *)
semmnu: int; (* # of undo structures in system *)
semmsl: int; (* max # of semaphores per id *)
semopm: int; (* max # of operations per semop call *)
semume: int; (* max # of undo entries per process *)
semusz: int; (* size in bytes of undo structure *)
semvmx: int; (* semaphore maximum value *)
semaem: int; (* adjust on exit max value *)
END;
** User semaphore template for semop system calls.
struct_sembuf = RECORD
sem_num: ushort; (* semaphore # *)
sem_op: short; (* semaphore operation *)
sem_flg: short; (* operation flags *)
END;
* Sizing constants
CONST SEMMAP = 10; SEMMNI = 10; SEMMNS = 60; SEMMNU = 30; SEMMSL = 25; SEMOPM = 10; SEMUME = 10; SEMVMX = 32767; SEMAEM = 16384; TYPE union = union_val; union_val = int; union_buf = UNTRACED REF struct_semid_ds;
union_array = ARRAY OF ushort
END Usem.