summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: c56e6eb)
raw | patch | inline | side by side (parent: c56e6eb)
author | Wendy Liang <jliang@xilinx.com> | |
Wed, 27 Jul 2016 03:28:40 +0000 (20:28 -0700) | ||
committer | Wendy Liang <jliang@xilinx.com> | |
Wed, 27 Jul 2016 23:37:23 +0000 (16:37 -0700) |
Use poll function in generic condition variable wait.
so that it is not just busy looping.
Signed-off-by: Wendy Liang <jliang@xilinx.com>
so that it is not just busy looping.
Signed-off-by: Wendy Liang <jliang@xilinx.com>
lib/system/generic/condition.c | patch | blob | history |
index c76c26b369ae5b678ecd553e0da69c0331eb733d..fa7898e624b3f9357126c9d5ecc2666656f87fde 100644 (file)
*/
#include <metal/condition.h>
+#include <metal/irq.h>
+
+extern void metal_generic_default_poll(void);
int metal_condition_wait(struct metal_condition *cv,
struct metal_mutex *m)
{
struct metal_mutex *tmpm = 0;
int v;
+ unsigned int flags;
/* Check if the mutex has been acquired */
if (!cv || !m || !metal_mutex_is_acquired(m))
/* Release the mutex first. */
metal_mutex_release(m);
- while (atomic_load(&cv->v) == v);
+ do {
+ flags = metal_irq_save_disable();
+ if (atomic_load(&cv->v) != v) {
+ metal_irq_restore_enable(flags);
+ break;
+ }
+ metal_generic_default_poll();
+ metal_irq_restore_enable(flags);
+ } while(1);
/* Acquire the mutex again. */
metal_mutex_acquire(m);
return 0;