1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: semaphore
15 *
16 * Create: 2021-12-16
17 */
18
19 #include <los_sem.h>
20 #include <los_memory.h>
21 #include <los_sem_pri.h>
22 #include "soc_osal.h"
23 #include "osal_errno.h"
24 #include "osal_inner.h"
25
osal_sem_init(osal_semaphore * sem,int val)26 int osal_sem_init(osal_semaphore *sem, int val)
27 {
28 if (sem == NULL || val < 0) {
29 osal_log("val=%d parameter invalid!\n", val);
30 return OSAL_FAILURE;
31 }
32 unsigned int ret = LOS_SemCreate(val, (unsigned int *)&(sem->sem)); /* semid may be zero */
33 if (ret != LOS_OK) {
34 osal_log("LOS_SemCreate failed! ret = %#x.\n", ret);
35 return OSAL_FAILURE;
36 }
37 return OSAL_SUCCESS;
38 }
39
osal_sem_binary_sem_init(osal_semaphore * sem,int val)40 int osal_sem_binary_sem_init(osal_semaphore *sem, int val)
41 {
42 if (sem == NULL || val < 0 || val > OS_SEM_BINARY_COUNT_MAX) {
43 osal_log("val=%d parameter invalid!\n", val);
44 return OSAL_FAILURE;
45 }
46 unsigned int ret = LOS_BinarySemCreate(val, (unsigned int *)&(sem->sem));
47 if (ret != OSAL_SUCCESS) {
48 osal_log("LOS_BinarySemCreate failed! ret = %#x.\n", ret);
49 return OSAL_FAILURE;
50 }
51 return OSAL_SUCCESS;
52 }
53
osal_sem_destroy(osal_semaphore * sem)54 void osal_sem_destroy(osal_semaphore *sem)
55 {
56 if (sem == NULL) {
57 osal_log("parameter invalid!\n");
58 return;
59 }
60 unsigned int ret = LOS_SemDelete((unsigned int)(UINTPTR)sem->sem);
61 if (ret != LOS_OK) {
62 osal_log("LOS_SemDelete failed! ret = %#x.\n", ret);
63 }
64 }
65
osal_sem_down(osal_semaphore * sem)66 int osal_sem_down(osal_semaphore *sem)
67 {
68 if (sem == NULL) {
69 osal_log("parameter invalid!\n");
70 return OSAL_FAILURE;
71 }
72 unsigned int ret = LOS_SemPend((unsigned int)(UINTPTR)sem->sem, LOS_WAIT_FOREVER);
73 if (ret == LOS_ERRNO_SEM_TIMEOUT) {
74 osal_log("OSAL_SEM_WAIT_TIME_OUT!\n");
75 return OSAL_FAILURE;
76 } else if (ret != OSAL_SUCCESS) {
77 osal_log("LOS_SemPend failed! ret = %#x.\n", ret);
78 return OSAL_FAILURE;
79 } else {
80 return OSAL_SUCCESS;
81 }
82 }
83
osal_sem_down_timeout(osal_semaphore * sem,unsigned int timeout)84 int osal_sem_down_timeout(osal_semaphore *sem, unsigned int timeout)
85 {
86 if (sem == NULL) {
87 osal_log("parameter invalid!\n");
88 return OSAL_FAILURE;
89 }
90 unsigned int ticks = (timeout == LOS_WAIT_FOREVER) ? timeout : LOS_MS2Tick(timeout);
91
92 unsigned int ret = LOS_SemPend((unsigned int)(UINTPTR)sem->sem, ticks);
93 if (ret == LOS_ERRNO_SEM_TIMEOUT) {
94 osal_log("LOS_ERRNO_SEM_TIMEOUT!\n");
95 return OSAL_ETIME;
96 } else if (ret != OSAL_SUCCESS) {
97 osal_log("LOS_SemPend failed! ret = %#x.\n", ret);
98 return OSAL_FAILURE;
99 } else {
100 return OSAL_SUCCESS;
101 }
102 }
103
osal_sem_down_interruptible(osal_semaphore * sem)104 int osal_sem_down_interruptible(osal_semaphore *sem)
105 {
106 if (sem == NULL) {
107 osal_log("parameter invalid!\n");
108 return OSAL_FAILURE;
109 }
110
111 unsigned int ret = LOS_SemPend((unsigned int)(UINTPTR)sem->sem, LOS_WAIT_FOREVER);
112 if (ret != OSAL_SUCCESS) {
113 osal_log("LOS_SemPend failed! ret = %#x.\n", ret);
114 return OSAL_FAILURE;
115 } else {
116 return OSAL_SUCCESS;
117 }
118 }
119
osal_sem_trydown(osal_semaphore * sem)120 int osal_sem_trydown(osal_semaphore *sem)
121 {
122 if (sem == NULL) {
123 osal_log("parameter invalid!\n");
124 return 1;
125 }
126
127 unsigned int ret = LOS_SemPend((unsigned int)(UINTPTR)sem->sem, 0);
128 if (ret == LOS_ERRNO_SEM_PEND_IN_LOCK) {
129 osal_log("LOS_ERRNO_SEM_PEND_IN_LOCK!\n");
130 return 1;
131 } else if (ret != LOS_OK) {
132 osal_log("LOS_SemPend failed! ret = %#x.\n", ret);
133 return 1;
134 } else {
135 return OSAL_SUCCESS;
136 }
137 }
138
osal_sem_up(osal_semaphore * sem)139 void osal_sem_up(osal_semaphore *sem)
140 {
141 if (sem == NULL) {
142 osal_log("parameter invalid!\n");
143 return;
144 }
145
146 unsigned int ret = LOS_SemPost((unsigned int)(UINTPTR)sem->sem);
147 if (ret != LOS_OK) {
148 osal_log("LOS_SemPost failed! ret = %#x.\n", ret);
149 }
150 }
151