linux/include/linux/sem.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LINUX_SEM_H
   3#define _LINUX_SEM_H
   4
   5#include <linux/atomic.h>
   6#include <linux/rcupdate.h>
   7#include <linux/cache.h>
   8#include <linux/time64.h>
   9#include <uapi/linux/sem.h>
  10
  11struct task_struct;
  12
  13/* One semaphore structure for each semaphore in the system. */
  14struct sem {
  15        int     semval;         /* current value */
  16        /*
  17         * PID of the process that last modified the semaphore. For
  18         * Linux, specifically these are:
  19         *  - semop
  20         *  - semctl, via SETVAL and SETALL.
  21         *  - at task exit when performing undo adjustments (see exit_sem).
  22         */
  23        int     sempid;
  24        spinlock_t      lock;   /* spinlock for fine-grained semtimedop */
  25        struct list_head pending_alter; /* pending single-sop operations */
  26                                        /* that alter the semaphore */
  27        struct list_head pending_const; /* pending single-sop operations */
  28                                        /* that do not alter the semaphore*/
  29        time_t  sem_otime;      /* candidate for sem_otime */
  30} ____cacheline_aligned_in_smp;
  31
  32/* One sem_array data structure for each set of semaphores in the system. */
  33struct sem_array {
  34        struct kern_ipc_perm    sem_perm;       /* permissions .. see ipc.h */
  35        time64_t                sem_ctime;      /* create/last semctl() time */
  36        struct list_head        pending_alter;  /* pending operations */
  37                                                /* that alter the array */
  38        struct list_head        pending_const;  /* pending complex operations */
  39                                                /* that do not alter semvals */
  40        struct list_head        list_id;        /* undo requests on this array */
  41        int                     sem_nsems;      /* no. of semaphores in array */
  42        int                     complex_count;  /* pending complex operations */
  43        unsigned int            use_global_lock;/* >0: global lock required */
  44
  45        struct sem              sems[];
  46} __randomize_layout;
  47
  48#ifdef CONFIG_SYSVIPC
  49
  50struct sysv_sem {
  51        struct sem_undo_list *undo_list;
  52};
  53
  54extern int copy_semundo(unsigned long clone_flags, struct task_struct *tsk);
  55extern void exit_sem(struct task_struct *tsk);
  56
  57#else
  58
  59struct sysv_sem {
  60        /* empty */
  61};
  62
  63static inline int copy_semundo(unsigned long clone_flags, struct task_struct *tsk)
  64{
  65        return 0;
  66}
  67
  68static inline void exit_sem(struct task_struct *tsk)
  69{
  70        return;
  71}
  72#endif
  73
  74#endif /* _LINUX_SEM_H */
  75