12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #ifndef _LINUX_SEM_H
- #define _LINUX_SEM_H
- #include <linux/atomic.h>
- #include <linux/rcupdate.h>
- #include <linux/cache.h>
- #include <linux/time64.h>
- #include <uapi/linux/sem.h>
- struct task_struct;
- /* One semaphore structure for each semaphore in the system. */
- struct sem {
- int semval; /* current value */
- /*
- * PID of the process that last modified the semaphore. For
- * Linux, specifically these are:
- * - semop
- * - semctl, via SETVAL and SETALL.
- * - at task exit when performing undo adjustments (see exit_sem).
- */
- int sempid;
- spinlock_t lock; /* spinlock for fine-grained semtimedop */
- struct list_head pending_alter; /* pending single-sop operations */
- /* that alter the semaphore */
- struct list_head pending_const; /* pending single-sop operations */
- /* that do not alter the semaphore*/
- time_t sem_otime; /* candidate for sem_otime */
- } ____cacheline_aligned_in_smp;
- /* One sem_array data structure for each set of semaphores in the system. */
- struct sem_array {
- struct kern_ipc_perm sem_perm; /* permissions .. see ipc.h */
- time64_t sem_ctime; /* create/last semctl() time */
- struct list_head pending_alter; /* pending operations */
- /* that alter the array */
- struct list_head pending_const; /* pending complex operations */
- /* that do not alter semvals */
- struct list_head list_id; /* undo requests on this array */
- int sem_nsems; /* no. of semaphores in array */
- int complex_count; /* pending complex operations */
- unsigned int use_global_lock;/* >0: global lock required */
- struct sem sems[];
- } __randomize_layout;
- #ifdef CONFIG_SYSVIPC
- struct sysv_sem {
- struct sem_undo_list *undo_list;
- };
- extern int copy_semundo(unsigned long clone_flags, struct task_struct *tsk);
- extern void exit_sem(struct task_struct *tsk);
- #else
- struct sysv_sem {
- /* empty */
- };
- static inline int copy_semundo(unsigned long clone_flags, struct task_struct *tsk)
- {
- return 0;
- }
- static inline void exit_sem(struct task_struct *tsk)
- {
- return;
- }
- #endif
- #endif /* _LINUX_SEM_H */
|