Lines Matching refs:mutex

827 rt_inline rt_uint8_t _mutex_update_priority(struct rt_mutex *mutex)  in _mutex_update_priority()  argument
831 if (!rt_list_isempty(&mutex->parent.suspend_thread)) in _mutex_update_priority()
833 thread = RT_THREAD_LIST_NODE_ENTRY(mutex->parent.suspend_thread.next); in _mutex_update_priority()
834 mutex->priority = rt_sched_thread_get_curr_prio(thread); in _mutex_update_priority()
838 mutex->priority = 0xff; in _mutex_update_priority()
841 return mutex->priority; in _mutex_update_priority()
848 struct rt_mutex *mutex = RT_NULL; in _thread_get_mutex_priority() local
853 mutex = rt_list_entry(node, struct rt_mutex, taken_list); in _thread_get_mutex_priority()
854 rt_uint8_t mutex_prio = mutex->priority; in _thread_get_mutex_priority()
856 mutex_prio = mutex_prio < mutex->ceiling_priority ? mutex_prio : mutex->ceiling_priority; in _thread_get_mutex_priority()
922 static rt_bool_t _check_and_update_prio(rt_thread_t thread, rt_mutex_t mutex) in _check_and_update_prio() argument
927 …if ((mutex->ceiling_priority != 0xFF) || (rt_sched_thread_get_curr_prio(thread) == mutex->priority… in _check_and_update_prio()
945 static void _mutex_before_delete_detach(rt_mutex_t mutex) in _mutex_before_delete_detach() argument
950 rt_spin_lock(&(mutex->spinlock)); in _mutex_before_delete_detach()
952 rt_susp_list_resume_all(&(mutex->parent.suspend_thread), RT_ERROR); in _mutex_before_delete_detach()
957 rt_list_remove(&mutex->taken_list); in _mutex_before_delete_detach()
960 if (mutex->owner) in _mutex_before_delete_detach()
962 need_schedule = _check_and_update_prio(mutex->owner, mutex); in _mutex_before_delete_detach()
975 rt_spin_unlock(&(mutex->spinlock)); in _mutex_before_delete_detach()
1007 rt_err_t rt_mutex_init(rt_mutex_t mutex, const char *name, rt_uint8_t flag) in rt_mutex_init() argument
1013 RT_ASSERT(mutex != RT_NULL); in rt_mutex_init()
1016 rt_object_init(&(mutex->parent.parent), RT_Object_Class_Mutex, name); in rt_mutex_init()
1019 _ipc_object_init(&(mutex->parent)); in rt_mutex_init()
1021 mutex->owner = RT_NULL; in rt_mutex_init()
1022 mutex->priority = 0xFF; in rt_mutex_init()
1023 mutex->hold = 0; in rt_mutex_init()
1024 mutex->ceiling_priority = 0xFF; in rt_mutex_init()
1025 rt_list_init(&(mutex->taken_list)); in rt_mutex_init()
1028 mutex->parent.parent.flag = RT_IPC_FLAG_PRIO; in rt_mutex_init()
1029 rt_spin_lock_init(&(mutex->spinlock)); in rt_mutex_init()
1054 rt_err_t rt_mutex_detach(rt_mutex_t mutex) in rt_mutex_detach() argument
1057 RT_ASSERT(mutex != RT_NULL); in rt_mutex_detach()
1058 RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex); in rt_mutex_detach()
1059 RT_ASSERT(rt_object_is_systemobject(&mutex->parent.parent)); in rt_mutex_detach()
1061 _mutex_before_delete_detach(mutex); in rt_mutex_detach()
1064 rt_object_detach(&(mutex->parent.parent)); in rt_mutex_detach()
1078 void rt_mutex_drop_thread(rt_mutex_t mutex, rt_thread_t thread) in rt_mutex_drop_thread() argument
1086 RT_ASSERT(mutex != RT_NULL); in rt_mutex_drop_thread()
1089 rt_spin_lock(&(mutex->spinlock)); in rt_mutex_drop_thread()
1091 RT_ASSERT(thread->pending_object == &mutex->parent.parent); in rt_mutex_drop_thread()
1105 if (mutex->owner && rt_sched_thread_get_curr_prio(mutex->owner) == in rt_mutex_drop_thread()
1112 if (!rt_list_isempty(&mutex->parent.suspend_thread)) in rt_mutex_drop_thread()
1117 th = RT_THREAD_LIST_NODE_ENTRY(mutex->parent.suspend_thread.next); in rt_mutex_drop_thread()
1119 mutex->priority = rt_sched_thread_get_curr_prio(th); in rt_mutex_drop_thread()
1124 mutex->priority = 0xff; in rt_mutex_drop_thread()
1131 priority = _thread_get_mutex_priority(mutex->owner); in rt_mutex_drop_thread()
1132 if (priority != rt_sched_thread_get_curr_prio(mutex->owner)) in rt_mutex_drop_thread()
1134 _thread_update_priority(mutex->owner, priority, RT_UNINTERRUPTIBLE); in rt_mutex_drop_thread()
1139 rt_spin_unlock(&(mutex->spinlock)); in rt_mutex_drop_thread()
1151 rt_uint8_t rt_mutex_setprioceiling(rt_mutex_t mutex, rt_uint8_t priority) in rt_mutex_setprioceiling() argument
1159 if ((mutex) && (priority < RT_THREAD_PRIORITY_MAX)) in rt_mutex_setprioceiling()
1162 rt_spin_lock(&(mutex->spinlock)); in rt_mutex_setprioceiling()
1163 ret_priority = mutex->ceiling_priority; in rt_mutex_setprioceiling()
1164 mutex->ceiling_priority = priority; in rt_mutex_setprioceiling()
1165 if (mutex->owner) in rt_mutex_setprioceiling()
1168 highest_prio = _thread_get_mutex_priority(mutex->owner); in rt_mutex_setprioceiling()
1169 if (highest_prio != rt_sched_thread_get_curr_prio(mutex->owner)) in rt_mutex_setprioceiling()
1171 _thread_update_priority(mutex->owner, highest_prio, RT_UNINTERRUPTIBLE); in rt_mutex_setprioceiling()
1175 rt_spin_unlock(&(mutex->spinlock)); in rt_mutex_setprioceiling()
1194 rt_uint8_t rt_mutex_getprioceiling(rt_mutex_t mutex) in rt_mutex_getprioceiling() argument
1200 RT_ASSERT(mutex != RT_NULL); in rt_mutex_getprioceiling()
1202 if (mutex) in rt_mutex_getprioceiling()
1204 rt_spin_lock(&(mutex->spinlock)); in rt_mutex_getprioceiling()
1205 prio = mutex->ceiling_priority; in rt_mutex_getprioceiling()
1206 rt_spin_unlock(&(mutex->spinlock)); in rt_mutex_getprioceiling()
1235 struct rt_mutex *mutex; in rt_mutex_create() local
1243 mutex = (rt_mutex_t)rt_object_allocate(RT_Object_Class_Mutex, name); in rt_mutex_create()
1244 if (mutex == RT_NULL) in rt_mutex_create()
1245 return mutex; in rt_mutex_create()
1248 _ipc_object_init(&(mutex->parent)); in rt_mutex_create()
1250 mutex->owner = RT_NULL; in rt_mutex_create()
1251 mutex->priority = 0xFF; in rt_mutex_create()
1252 mutex->hold = 0; in rt_mutex_create()
1253 mutex->ceiling_priority = 0xFF; in rt_mutex_create()
1254 rt_list_init(&(mutex->taken_list)); in rt_mutex_create()
1257 mutex->parent.parent.flag = RT_IPC_FLAG_PRIO; in rt_mutex_create()
1258 rt_spin_lock_init(&(mutex->spinlock)); in rt_mutex_create()
1260 return mutex; in rt_mutex_create()
1283 rt_err_t rt_mutex_delete(rt_mutex_t mutex) in rt_mutex_delete() argument
1286 RT_ASSERT(mutex != RT_NULL); in rt_mutex_delete()
1287 RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex); in rt_mutex_delete()
1288 RT_ASSERT(rt_object_is_systemobject(&mutex->parent.parent) == RT_FALSE); in rt_mutex_delete()
1292 _mutex_before_delete_detach(mutex); in rt_mutex_delete()
1295 rt_object_delete(&(mutex->parent.parent)); in rt_mutex_delete()
1326 static rt_err_t _rt_mutex_take(rt_mutex_t mutex, rt_int32_t timeout, int suspend_flag) in _rt_mutex_take() argument
1336 RT_ASSERT(mutex != RT_NULL); in _rt_mutex_take()
1337 RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex); in _rt_mutex_take()
1342 rt_spin_lock(&(mutex->spinlock)); in _rt_mutex_take()
1344 RT_OBJECT_HOOK_CALL(rt_object_trytake_hook, (&(mutex->parent.parent))); in _rt_mutex_take()
1347 thread->parent.name, mutex->hold); in _rt_mutex_take()
1352 if (mutex->owner == thread) in _rt_mutex_take()
1354 if (mutex->hold < RT_MUTEX_HOLD_MAX) in _rt_mutex_take()
1357 mutex->hold ++; in _rt_mutex_take()
1361 rt_spin_unlock(&(mutex->spinlock)); in _rt_mutex_take()
1368 if (mutex->owner == RT_NULL) in _rt_mutex_take()
1371 mutex->owner = thread; in _rt_mutex_take()
1372 mutex->priority = 0xff; in _rt_mutex_take()
1373 mutex->hold = 1; in _rt_mutex_take()
1375 if (mutex->ceiling_priority != 0xFF) in _rt_mutex_take()
1378 if (mutex->ceiling_priority < rt_sched_thread_get_curr_prio(mutex->owner)) in _rt_mutex_take()
1379 _thread_update_priority(mutex->owner, mutex->ceiling_priority, suspend_flag); in _rt_mutex_take()
1383 rt_list_insert_after(&thread->taken_object_list, &mutex->taken_list); in _rt_mutex_take()
1393 rt_spin_unlock(&(mutex->spinlock)); in _rt_mutex_take()
1406 ret = rt_thread_suspend_to_list(thread, &(mutex->parent.suspend_thread), in _rt_mutex_take()
1407 mutex->parent.parent.flag, suspend_flag); in _rt_mutex_take()
1410 rt_spin_unlock(&(mutex->spinlock)); in _rt_mutex_take()
1415 thread->pending_object = &(mutex->parent.parent); in _rt_mutex_take()
1422 if (priority < mutex->priority) in _rt_mutex_take()
1424 mutex->priority = priority; in _rt_mutex_take()
1425 if (mutex->priority < rt_sched_thread_get_curr_prio(mutex->owner)) in _rt_mutex_take()
1427 … _thread_update_priority(mutex->owner, priority, RT_UNINTERRUPTIBLE); /* TODO */ in _rt_mutex_take()
1446 rt_spin_unlock(&(mutex->spinlock)); in _rt_mutex_take()
1451 rt_spin_lock(&(mutex->spinlock)); in _rt_mutex_take()
1453 if (mutex->owner == thread) in _rt_mutex_take()
1466 RT_ASSERT(mutex->owner != thread); in _rt_mutex_take()
1486 …if (mutex->owner && rt_sched_thread_get_curr_prio(mutex->owner) == rt_sched_thread_get_curr_prio(t… in _rt_mutex_take()
1490 if (!rt_list_isempty(&mutex->parent.suspend_thread)) in _rt_mutex_take()
1495 th = RT_THREAD_LIST_NODE_ENTRY(mutex->parent.suspend_thread.next); in _rt_mutex_take()
1497 mutex->priority = rt_sched_thread_get_curr_prio(th); in _rt_mutex_take()
1502 mutex->priority = 0xff; in _rt_mutex_take()
1509 priority = _thread_get_mutex_priority(mutex->owner); in _rt_mutex_take()
1510 if (priority != rt_sched_thread_get_curr_prio(mutex->owner)) in _rt_mutex_take()
1512 _thread_update_priority(mutex->owner, priority, RT_UNINTERRUPTIBLE); in _rt_mutex_take()
1518 rt_spin_unlock(&(mutex->spinlock)); in _rt_mutex_take()
1530 rt_spin_unlock(&(mutex->spinlock)); in _rt_mutex_take()
1532 RT_OBJECT_HOOK_CALL(rt_object_take_hook, (&(mutex->parent.parent))); in _rt_mutex_take()
1537 rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time) in rt_mutex_take() argument
1539 return _rt_mutex_take(mutex, time, RT_UNINTERRUPTIBLE); in rt_mutex_take()
1543 rt_err_t rt_mutex_take_interruptible(rt_mutex_t mutex, rt_int32_t time) in rt_mutex_take_interruptible() argument
1545 return _rt_mutex_take(mutex, time, RT_INTERRUPTIBLE); in rt_mutex_take_interruptible()
1549 rt_err_t rt_mutex_take_killable(rt_mutex_t mutex, rt_int32_t time) in rt_mutex_take_killable() argument
1551 return _rt_mutex_take(mutex, time, RT_KILLABLE); in rt_mutex_take_killable()
1570 rt_err_t rt_mutex_trytake(rt_mutex_t mutex) in rt_mutex_trytake() argument
1572 return rt_mutex_take(mutex, RT_WAITING_NO); in rt_mutex_trytake()
1589 rt_err_t rt_mutex_release(rt_mutex_t mutex) in rt_mutex_release() argument
1596 RT_ASSERT(mutex != RT_NULL); in rt_mutex_release()
1597 RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex); in rt_mutex_release()
1607 rt_spin_lock(&(mutex->spinlock)); in rt_mutex_release()
1610 thread->parent.name, mutex->hold); in rt_mutex_release()
1612 RT_OBJECT_HOOK_CALL(rt_object_put_hook, (&(mutex->parent.parent))); in rt_mutex_release()
1615 if (thread != mutex->owner) in rt_mutex_release()
1618 rt_spin_unlock(&(mutex->spinlock)); in rt_mutex_release()
1624 mutex->hold --; in rt_mutex_release()
1626 if (mutex->hold == 0) in rt_mutex_release()
1631 rt_list_remove(&mutex->taken_list); in rt_mutex_release()
1634 need_schedule = _check_and_update_prio(thread, mutex); in rt_mutex_release()
1637 if (!rt_list_isempty(&mutex->parent.suspend_thread)) in rt_mutex_release()
1643 next_thread = RT_THREAD_LIST_NODE_ENTRY(mutex->parent.suspend_thread.next); in rt_mutex_release()
1659 } while (!next_thread && !rt_list_isempty(&mutex->parent.suspend_thread)); in rt_mutex_release()
1667 mutex->owner = next_thread; in rt_mutex_release()
1668 mutex->hold = 1; in rt_mutex_release()
1669 rt_list_insert_after(&next_thread->taken_object_list, &mutex->taken_list); in rt_mutex_release()
1675 if (!rt_list_isempty(&(mutex->parent.suspend_thread))) in rt_mutex_release()
1679 th = RT_THREAD_LIST_NODE_ENTRY(mutex->parent.suspend_thread.next); in rt_mutex_release()
1680 mutex->priority = rt_sched_thread_get_curr_prio(th); in rt_mutex_release()
1684 mutex->priority = 0xff; in rt_mutex_release()
1692 mutex->owner = RT_NULL; in rt_mutex_release()
1693 mutex->priority = 0xff; in rt_mutex_release()
1703 mutex->owner = RT_NULL; in rt_mutex_release()
1704 mutex->priority = 0xff; in rt_mutex_release()
1708 rt_spin_unlock(&(mutex->spinlock)); in rt_mutex_release()
1733 rt_err_t rt_mutex_control(rt_mutex_t mutex, int cmd, void *arg) in rt_mutex_control() argument
1735 RT_UNUSED(mutex); in rt_mutex_control()