diff options
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r-- | firmware/kernel.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c index 9d72a7eeda..aaa675241b 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -827,9 +827,8 @@ int queue_broadcast(long id, intptr_t data) | |||
827 | * Simple mutex functions ;) | 827 | * Simple mutex functions ;) |
828 | ****************************************************************************/ | 828 | ****************************************************************************/ |
829 | 829 | ||
830 | static inline void mutex_set_thread(struct mutex *mtx, struct thread_entry *td) | 830 | static inline void __attribute__((always_inline)) |
831 | __attribute__((always_inline)); | 831 | mutex_set_thread(struct mutex *mtx, struct thread_entry *td) |
832 | static inline void mutex_set_thread(struct mutex *mtx, struct thread_entry *td) | ||
833 | { | 832 | { |
834 | #ifdef HAVE_PRIORITY_SCHEDULING | 833 | #ifdef HAVE_PRIORITY_SCHEDULING |
835 | mtx->blocker.thread = td; | 834 | mtx->blocker.thread = td; |
@@ -838,9 +837,8 @@ static inline void mutex_set_thread(struct mutex *mtx, struct thread_entry *td) | |||
838 | #endif | 837 | #endif |
839 | } | 838 | } |
840 | 839 | ||
841 | static inline struct thread_entry* mutex_get_thread(struct mutex *mtx) | 840 | static inline struct thread_entry * __attribute__((always_inline)) |
842 | __attribute__((always_inline)); | 841 | mutex_get_thread(volatile struct mutex *mtx) |
843 | static inline struct thread_entry* mutex_get_thread(struct mutex *mtx) | ||
844 | { | 842 | { |
845 | #ifdef HAVE_PRIORITY_SCHEDULING | 843 | #ifdef HAVE_PRIORITY_SCHEDULING |
846 | return mtx->blocker.thread; | 844 | return mtx->blocker.thread; |
@@ -855,8 +853,7 @@ void mutex_init(struct mutex *m) | |||
855 | { | 853 | { |
856 | corelock_init(&m->cl); | 854 | corelock_init(&m->cl); |
857 | m->queue = NULL; | 855 | m->queue = NULL; |
858 | m->count = 0; | 856 | m->recursion = 0; |
859 | m->locked = false; | ||
860 | mutex_set_thread(m, NULL); | 857 | mutex_set_thread(m, NULL); |
861 | #ifdef HAVE_PRIORITY_SCHEDULING | 858 | #ifdef HAVE_PRIORITY_SCHEDULING |
862 | m->blocker.priority = PRIORITY_IDLE; | 859 | m->blocker.priority = PRIORITY_IDLE; |
@@ -873,18 +870,18 @@ void mutex_lock(struct mutex *m) | |||
873 | if(current == mutex_get_thread(m)) | 870 | if(current == mutex_get_thread(m)) |
874 | { | 871 | { |
875 | /* current thread already owns this mutex */ | 872 | /* current thread already owns this mutex */ |
876 | m->count++; | 873 | m->recursion++; |
877 | return; | 874 | return; |
878 | } | 875 | } |
879 | 876 | ||
880 | /* lock out other cores */ | 877 | /* lock out other cores */ |
881 | corelock_lock(&m->cl); | 878 | corelock_lock(&m->cl); |
882 | 879 | ||
883 | if(LIKELY(!m->locked)) | 880 | /* must read thread again inside cs (a multiprocessor concern really) */ |
881 | if(LIKELY(mutex_get_thread(m) == NULL)) | ||
884 | { | 882 | { |
885 | /* lock is open */ | 883 | /* lock is open */ |
886 | mutex_set_thread(m, current); | 884 | mutex_set_thread(m, current); |
887 | m->locked = true; | ||
888 | corelock_unlock(&m->cl); | 885 | corelock_unlock(&m->cl); |
889 | return; | 886 | return; |
890 | } | 887 | } |
@@ -912,10 +909,10 @@ void mutex_unlock(struct mutex *m) | |||
912 | mutex_get_thread(m)->name, | 909 | mutex_get_thread(m)->name, |
913 | thread_id_entry(THREAD_ID_CURRENT)->name); | 910 | thread_id_entry(THREAD_ID_CURRENT)->name); |
914 | 911 | ||
915 | if(m->count > 0) | 912 | if(m->recursion > 0) |
916 | { | 913 | { |
917 | /* this thread still owns lock */ | 914 | /* this thread still owns lock */ |
918 | m->count--; | 915 | m->recursion--; |
919 | return; | 916 | return; |
920 | } | 917 | } |
921 | 918 | ||
@@ -927,7 +924,6 @@ void mutex_unlock(struct mutex *m) | |||
927 | { | 924 | { |
928 | /* no threads waiting - open the lock */ | 925 | /* no threads waiting - open the lock */ |
929 | mutex_set_thread(m, NULL); | 926 | mutex_set_thread(m, NULL); |
930 | m->locked = false; | ||
931 | corelock_unlock(&m->cl); | 927 | corelock_unlock(&m->cl); |
932 | return; | 928 | return; |
933 | } | 929 | } |