• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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