1 /*
2 * Copyright (C) 2015-2021 Alibaba Group Holding Limited
3 */
4
5 #include <stdio.h>
6 #include <time.h>
7
8 #include <k_api.h>
9 #include <aos/errno.h>
10 #include <aos/kernel.h>
11
12 #include "rhino_p.h"
13
14 #if (RHINO_CONFIG_KOBJ_DYN_ALLOC == 0)
15 #warning "RHINO_CONFIG_KOBJ_DYN_ALLOC is disabled!"
16 #endif
17
18 #if ((RHINO_CONFIG_KOBJ_DYN_ALLOC > 0) && (RHINO_CONFIG_SEM > 0))
aos_sem_new(aos_sem_t * sem,uint32_t count)19 aos_status_t aos_sem_new(aos_sem_t *sem, uint32_t count)
20 {
21 kstat_t ret;
22 ksem_t *s;
23
24 if (sem == NULL) {
25 return -EINVAL;
26 }
27
28 s = aos_malloc(sizeof(ksem_t));
29 if (s == NULL) {
30 return -ENOMEM;
31 }
32
33 ret = krhino_sem_create(s, "AOS", count);
34 if (ret != RHINO_SUCCESS) {
35 aos_free(s);
36 return rhino2stderrno(ret);
37 }
38
39 *sem = s;
40
41 return 0;
42 }
43
aos_sem_create(aos_sem_t * sem,uint32_t count,uint32_t options)44 aos_status_t aos_sem_create(aos_sem_t *sem, uint32_t count, uint32_t options)
45 {
46 kstat_t ret;
47 ksem_t *s;
48
49 (void)options;
50 if (sem == NULL) {
51 return -EINVAL;
52 }
53
54 s = aos_malloc(sizeof(ksem_t));
55 if (s == NULL) {
56 return -ENOMEM;
57 }
58
59 ret = krhino_sem_create(s, "AOS", count);
60 if (ret != RHINO_SUCCESS) {
61 aos_free(s);
62 return rhino2stderrno(ret);
63 }
64
65 *sem = s;
66
67 return 0;
68 }
69
aos_sem_free(aos_sem_t * sem)70 void aos_sem_free(aos_sem_t *sem)
71 {
72 if (sem == NULL || *sem == NULL) {
73 return;
74 }
75 krhino_sem_del((ksem_t *)*sem);
76
77 aos_free(*sem);
78
79 *sem = NULL;
80 }
81
aos_sem_wait(aos_sem_t * sem,uint32_t timeout)82 aos_status_t aos_sem_wait(aos_sem_t *sem, uint32_t timeout)
83 {
84 kstat_t ret;
85
86 CHECK_HANDLE(sem);
87
88 if (timeout == AOS_WAIT_FOREVER) {
89 ret = krhino_sem_take((ksem_t *)*sem, RHINO_WAIT_FOREVER);
90 } else {
91 ret = krhino_sem_take((ksem_t *)*sem, MS2TICK(timeout));
92 }
93
94 return rhino2stderrno(ret);
95 }
96
aos_sem_signal(aos_sem_t * sem)97 void aos_sem_signal(aos_sem_t *sem)
98 {
99 if (sem == NULL || *sem == NULL) {
100 return;
101 }
102
103 krhino_sem_give((ksem_t *)*sem);
104 }
105
aos_sem_signal_all(aos_sem_t * sem)106 void aos_sem_signal_all(aos_sem_t *sem)
107 {
108 if (sem == NULL || *sem == NULL) {
109 return;
110 }
111
112 krhino_sem_give_all((ksem_t *)*sem);
113 }
114
aos_sem_is_valid(aos_sem_t * sem)115 bool aos_sem_is_valid(aos_sem_t *sem)
116 {
117 ksem_t *k_sem;
118
119 if (sem == NULL) {
120 return false;
121 }
122
123 k_sem = *sem;
124
125 if (k_sem == NULL) {
126 return false;
127 }
128
129 if (k_sem->blk_obj.obj_type != RHINO_SEM_OBJ_TYPE) {
130 return false;
131 }
132
133 return true;
134 }
135
136 #endif
137