blob: e4e7ea54d9e53faa6068adf92e76c3735973b540 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001#include <sys/sem.h>
2#include <sys/ipc.h>
3#include <errno.h>
4#include "softap_log.h"
5
6//´Ë´¦È¡ÖµÓëFLUXSTATÎļþÖеÄȡֵÊÇÒ»ÖµÄ
7//ÓÃÓÚ²»Í¬µÄ½ø³Ì¼äͬ²½
8#define TIME_SEM_KEY 0x0666
9
10extern int init_sem(int sem_id, int init_value);
11extern int del_sem(int sem_id);
12extern int sem_p(int sem_id);
13extern int sem_v(int sem_id);
14extern int get_sem(key_t sem_key);
15
16
17union semun {
18 int val;
19 struct semid_ds *buf;
20 unsigned short *array;
21};
22
23int get_sem(key_t sem_key)
24{
25 int sem_id = -1;
26
27 sem_id = semget(sem_key, 1, 0666 | IPC_CREAT | IPC_EXCL);
28 if (sem_id < 0) {
29 //printf("[goahead]semget errno=%d\n", errno);
30 if (errno == EEXIST) {
31 //printf("[goahead]semget already exist==\n");
32 return semget(sem_key, 1, 0666 | IPC_CREAT);
33 }
34 slog(MISC_PRINT, SLOG_ERR,"[goahead]semget == -1, return fail\n");
35 return -1;
36 }
37
38 union semun sem_union;
39 sem_union.val = 1;
40 if (semctl(sem_id, 0, SETVAL, sem_union) == -1) {
41 return -1;
42 }
43 //printf("[goahead]semget sem_id= %d, get sem success\n",sem_id);;
44 return sem_id;
45}
46
47
48// ½«ÐźÅÁ¿sem_idÉèÖÃΪinit_value
49int init_sem(int sem_id, int init_value)
50{
51 union semun sem_union;
52 sem_union.val = init_value;
53 if (semctl(sem_id, 0, SETVAL, sem_union) == -1) {
54 return -1;
55 }
56 return 0;
57}
58
59// ɾ³ýsem_idÐźÅÁ¿
60int del_sem(int sem_id)
61{
62 union semun sem_union = {0}; //cov h
63 if (semctl(sem_id, 0, IPC_RMID, sem_union) == -1) {
64 return -1;
65 }
66 return 0;
67}
68
69// ¶Ôsem_idÖ´ÐÐp²Ù×÷
70int sem_p(int sem_id)
71{
72 struct sembuf sem_buf;
73 sem_buf.sem_num = 0; //ÐźÅÁ¿±àºÅ
74 sem_buf.sem_op = -1; //P²Ù×÷
75 sem_buf.sem_flg = SEM_UNDO; //ϵͳÍ˳öǰδÊÍ·ÅÐźÅÁ¿£¬ÏµÍ³×Ô¶¯ÊÍ·Å
76 if (semop(sem_id, &sem_buf, 1) == -1) {
77 return -1;
78 }
79 return 0;
80}
81
82// ¶Ôsem_idÖ´ÐÐV²Ù×÷
83int sem_v(int sem_id)
84{
85 struct sembuf sem_buf;
86 sem_buf.sem_num = 0;
87 sem_buf.sem_op = 1; //V²Ù×÷
88 sem_buf.sem_flg = SEM_UNDO;
89 if (semop(sem_id, &sem_buf, 1) == -1) {
90 return -1;
91 }
92 return 0;
93}
94