huangcm
2025-02-26 a813214788f6e7b512df54f1c659cd0bdc9ac175
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef _LINUX_SEM_H
#define _LINUX_SEM_H
 
#include <linux/atomic.h>
#include <linux/rcupdate.h>
#include <linux/cache.h>
#include <uapi/linux/sem.h>
 
struct task_struct;
 
/* One sem_array data structure for each set of semaphores in the system. */
struct sem_array {
   struct kern_ipc_perm    ____cacheline_aligned_in_smp
               sem_perm;    /* permissions .. see ipc.h */
   time_t            sem_ctime;    /* last change time */
   struct sem        *sem_base;    /* ptr to first semaphore in array */
   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 */
   bool            complex_mode;    /* no parallel simple ops */
};
 
#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 */