• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
3  *
4  * UniProton is licensed under Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *          http://license.coscl.org.cn/MulanPSL2
8  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11  * See the Mulan PSL v2 for more details.
12  * Create: 2009-12-22
13  * Description: 信号量模块内部头文件
14  */
15 #ifndef PRT_SEM_EXTERNAL_H
16 #define PRT_SEM_EXTERNAL_H
17 
18 #include "prt_sem.h"
19 #include "prt_task_external.h"
20 #if defined(OS_OPTION_POSIX)
21 #include "semaphore.h"
22 #include "prt_posix_internal.h"
23 #endif
24 
25 #define OS_SEM_UNUSED 0
26 #define OS_SEM_USED   1
27 
28 #define SEM_PROTOCOL_PRIO_INHERIT 1
29 #define SEM_TYPE_BIT_WIDTH        0x4U
30 #define SEM_PROTOCOL_BIT_WIDTH    0x8U
31 
32 #define OS_SEM_WITH_LOCK_FLAG    1
33 #define OS_SEM_WITHOUT_LOCK_FLAG 0
34 
35 #define GET_SEM_LIST(ptr) LIST_COMPONENT(ptr, struct TagSemCb, semList)
36 #define GET_SEM(semid) (((struct TagSemCb *)g_allSem) + (semid))
37 #define GET_SEM_TSK(semid) (((SEM_TSK_S *)g_semTsk) + (semid))
38 #define GET_TSK_SEM(tskid) (((TSK_SEM_S *)g_tskSem) + (tskid))
39 #define GET_SEM_TYPE(semType) (U32)((semType) & ((1U << SEM_TYPE_BIT_WIDTH) - 1))
40 #define GET_MUTEX_TYPE(semType) (U32)(((semType) >> SEM_TYPE_BIT_WIDTH) & ((1U << SEM_TYPE_BIT_WIDTH) - 1))
41 #define GET_SEM_PROTOCOL(semType) (U32)((semType) >> SEM_PROTOCOL_BIT_WIDTH)
42 
43 struct TagSemCb {
44     /* 是否使用 OS_SEM_UNUSED/OS_SEM_USED */
45     U16 semStat;
46     /* 核内信号量索引号 */
47     U16 semId;
48 #if defined(OS_OPTION_SEM_RECUR_PV)
49     /* 二进制互斥信号量递归P计数,计数型信号量和二进制同步模式信号量无效 */
50     U32 recurCount;
51 #endif
52     /* 当该信号量已用时,其信号量计数 */
53     U32 semCount;
54     /* 挂接阻塞于该信号量的任务 */
55     struct TagListObject semList;
56     /* 挂接任务持有的互斥信号量,计数型信号量信号量无效 */
57     struct TagListObject semBList;
58 
59     /* Pend到该信号量的线程ID */
60     U32 semOwner;
61     /* 信号量唤醒阻塞任务的方式 */
62     enum SemMode semMode;
63     /* 信号量,计数型或二进制 */
64     U32 semType;
65 #if defined(OS_OPTION_POSIX)
66     /* 信号量名称 */
67     char name[MAX_POSIX_SEMAPHORE_NAME_LEN + 1]; // + \0
68     /* sem_open 句柄 */
69     sem_t handle;
70 #endif
71 };
72 
73 /* 模块间全局变量声明 */
74 extern U16 g_maxSem;
75 
76 /* 指向核内信号量控制块 */
77 extern struct TagSemCb *g_allSem;
78 
79 extern U32 OsSemCreate(U32 count, U32 semType, enum SemMode semMode, SemHandle *semHandle, U32 cookie);
80 
81 #endif /* PRT_SEM_EXTERNAL_H */
82