File: semop.c

package info (click to toggle)
systemtap 4.8-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 39,000 kB
  • sloc: cpp: 78,785; ansic: 62,419; xml: 49,443; exp: 42,735; sh: 11,254; python: 3,062; perl: 2,252; tcl: 1,305; makefile: 1,072; lisp: 105; awk: 101; asm: 91; java: 56; sed: 16
file content (109 lines) | stat: -rw-r--r-- 3,252 bytes parent folder | download | duplicates (5)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* COVERAGE: semop semtimedop */

#define _GNU_SOURCE
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>

int main()
{
    char *curdir;
    struct timeval tv;
    key_t ipc_key;
    int semid;
    struct sembuf sops[10];
    struct timespec ts;

    // Generate a System V IPC key (based on the current directory and time)
    curdir = getcwd(NULL, 0);
    gettimeofday(&tv, NULL);
    ipc_key = ftok(curdir, tv.tv_usec);

    // Create a set of 10 semaphores.
    semid = semget(ipc_key, 10, 0666 | IPC_CREAT);
    //staptest// semget (NNNN, 10, IPC_CREAT|0666) = NNNN

    // Since:
    //   semop(X, Y, Z)
    // can be implemented by
    //   semtimedop(X, Y, Z, NULL)
    // We have to accept both in the output.

    // Modify the first 2 semaphores with semop().
    sops[0].sem_num = 0;
    sops[0].sem_op = 1;
    sops[0].sem_flg = IPC_NOWAIT;
    sops[1].sem_num = 1;
    sops[1].sem_op = 1;
    sops[1].sem_flg = 0;
    semop(semid, sops, 2);
    //staptest// [[[[semop (NNNN, XXXX, 2)!!!!semtimedop (NNNN, XXXX, 2, NULL)]]]] = 0

    sops[0].sem_num = 2;
    sops[0].sem_op = 1;
    sops[0].sem_flg = IPC_NOWAIT;
    sops[1].sem_num = 3;
    sops[1].sem_op = 1;
    sops[1].sem_flg = 0;
    semtimedop(semid, sops, 2, NULL);
    //staptest// semtimedop (NNNN, XXXX, 2, NULL) = 0

    // Modify the fifth semaphore with semtimedop().
    sops[0].sem_num = 5;
    sops[0].sem_op = 1;
    sops[0].sem_flg = IPC_NOWAIT;
    ts.tv_sec = 5;
    ts.tv_nsec = 0;
    semtimedop(semid, sops, 1, &ts);
    //staptest// semtimedop (NNNN, XXXX, 1, \[5.000000000\]) = 0

    // Delete the set of semaphores (the 2nd argument is ignored).
    semctl(semid, 0, IPC_RMID);
    //staptest// semctl (NNNN, 0, [[[[IPC_64|]]]]?IPC_RMID, XXXX) = 0

    // Create a set of 10 semaphores.
    semid = semget(IPC_PRIVATE, 10, 0666 | IPC_CREAT);
    //staptest// semget (IPC_PRIVATE, 10, IPC_CREAT|0666) = NNNN

    // Range checking.
    semop(-1, sops, 1);
    //staptest// sem[[[[timed]]]]?op (-1, XXXX, 1[[[[, NULL]]]]?) = NNNN

    semop(semid, (struct sembuf *)-1, 1);
#ifdef __s390__
    //staptest// sem[[[[timed]]]]?op (NNNN, 0x[7]?[f]+, 1[[[[, NULL]]]]?) = -NNNN
#else
    //staptest// sem[[[[timed]]]]?op (NNNN, 0x[f]+, 1[[[[, NULL]]]]?) = -NNNN
#endif

    semop(semid, NULL, -1);
    //staptest// sem[[[[timed]]]]?op (NNNN, 0x0, 4294967295[[[[, NULL]]]]?) = -NNNN

    semtimedop(-1, sops, 1, &ts);
    //staptest// semtimedop (-1, XXXX, 1, \[5.000000000\]) = NNNN

    semtimedop(semid, (struct sembuf *)-1, 1, &ts);
#ifdef __s390__
    //staptest// semtimedop (NNNN, 0x[7]?[f]+, 1, \[5.000000000\]) = NNNN
#else
    //staptest// semtimedop (NNNN, 0x[f]+, 1, \[5.000000000\]) = NNNN
#endif

    semtimedop(semid, NULL, -1, &ts);
    //staptest// semtimedop (NNNN, 0x0, 4294967295, \[5.000000000\]) = NNNN

    semtimedop(semid, sops, 1, (struct timespec *)-1);
#ifdef __s390__
    //staptest// semtimedop (NNNN, XXXX, 1, 0x[7]?[f]+) = NNNN
#else
    //staptest// semtimedop (NNNN, XXXX, 1, 0x[f]+) = NNNN
#endif

    // Delete the set of semaphores (the 2nd argument is ignored).
    semctl(semid, 0, IPC_RMID);
    //staptest// semctl (NNNN, 0, [[[[IPC_64|]]]]?IPC_RMID, XXXX) = 0

    return 0;
}