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)19aos_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)44aos_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)70void 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)82aos_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)102aos_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)117bool 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