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