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)
aos_mutex_new(aos_mutex_t * mutex)19 aos_status_t aos_mutex_new(aos_mutex_t *mutex)
20 {
21     kstat_t   ret;
22     kmutex_t *m;
23 
24     if (mutex == NULL) {
25         return -EINVAL;
26     }
27 
28     m = aos_malloc(sizeof(kmutex_t));
29     if (m == NULL) {
30         return -ENOMEM;
31     }
32 
33     ret = krhino_mutex_create(m, "AOS");
34 
35     if (ret != RHINO_SUCCESS) {
36         aos_free(m);
37         return rhino2stderrno(ret);
38     }
39     *mutex = m;
40 
41     return 0;
42 }
43 
aos_mutex_create(aos_mutex_t * mutex,uint32_t options)44 aos_status_t aos_mutex_create(aos_mutex_t *mutex, uint32_t options)
45 {
46     kstat_t   ret;
47     kmutex_t *m;
48 
49     (void)options;
50     if (mutex == NULL) {
51         return -EINVAL;
52     }
53 
54     m = aos_malloc(sizeof(kmutex_t));
55     if (m == NULL) {
56         return -ENOMEM;
57     }
58 
59     ret = krhino_mutex_create(m, "AOS");
60 
61     if (ret != RHINO_SUCCESS) {
62         aos_free(m);
63         return rhino2stderrno(ret);
64     }
65     *mutex = m;
66 
67     return 0;
68 }
69 
aos_mutex_free(aos_mutex_t * mutex)70 void aos_mutex_free(aos_mutex_t *mutex)
71 {
72     if (mutex == NULL || *mutex == NULL) {
73         return;
74     }
75     krhino_mutex_del((kmutex_t *)*mutex);
76 
77     aos_free(*mutex);
78 
79     *mutex = NULL;
80 }
81 
aos_mutex_lock(aos_mutex_t * mutex,uint32_t timeout)82 aos_status_t aos_mutex_lock(aos_mutex_t *mutex, uint32_t timeout)
83 {
84     kstat_t ret;
85 
86     CHECK_HANDLE(mutex);
87 
88     if (timeout == AOS_WAIT_FOREVER) {
89         ret = krhino_mutex_lock((kmutex_t *)*mutex, RHINO_WAIT_FOREVER);
90     } else {
91         ret = krhino_mutex_lock((kmutex_t *)*mutex, MS2TICK(timeout));
92     }
93 
94     /* rhino allow nested */
95     if (ret == RHINO_MUTEX_OWNER_NESTED) {
96         ret = RHINO_SUCCESS;
97     }
98 
99     return rhino2stderrno(ret);
100 }
101 
aos_mutex_unlock(aos_mutex_t * mutex)102 aos_status_t aos_mutex_unlock(aos_mutex_t *mutex)
103 {
104     kstat_t ret;
105 
106     CHECK_HANDLE(mutex);
107 
108     ret = krhino_mutex_unlock((kmutex_t *)*mutex);
109     /* rhino allow nested */
110     if (ret == RHINO_MUTEX_OWNER_NESTED) {
111         ret = RHINO_SUCCESS;
112     }
113 
114     return rhino2stderrno(ret);
115 }
116 
aos_mutex_is_valid(aos_mutex_t * mutex)117 bool aos_mutex_is_valid(aos_mutex_t *mutex)
118 {
119     kmutex_t *k_mutex;
120 
121     if (mutex == NULL) {
122         return false;
123     }
124 
125     k_mutex = (kmutex_t *)*mutex;
126 
127     if (k_mutex == NULL) {
128         return false;
129     }
130 
131     if (k_mutex->blk_obj.obj_type != RHINO_MUTEX_OBJ_TYPE) {
132         return false;
133     }
134 
135     return true;
136 }
137 #endif
138