]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/libmetal.git/commitdiff
use poll in generic condition variable wait
authorWendy Liang <jliang@xilinx.com>
Wed, 27 Jul 2016 03:28:40 +0000 (20:28 -0700)
committerWendy 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>
lib/system/generic/condition.c

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))
@@ -54,7 +58,15 @@ int metal_condition_wait(struct metal_condition *cv,
 
        /* 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;