From 938c10b60913d3328e459378e6feea27d364c10c Mon Sep 17 00:00:00 2001
From: Pedro Gonnet <pedro.gonnet@durham.ac.uk>
Date: Fri, 5 Jul 2013 12:30:55 +0000
Subject: [PATCH] try several steals after a failed get attempt on the
 preferred queue.

Former-commit-id: d0abb3e20eb09afe730495ce622866b8b8cf3fc2
---
 src/scheduler.c | 11 +++++++++--
 src/scheduler.h |  3 ++-
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/scheduler.c b/src/scheduler.c
index 84c6608cbd..93bcbc0f98 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -847,7 +847,7 @@ struct task *scheduler_gettask ( struct scheduler *s , int qid , struct cell *su
     while ( s->waiting > 0 && res == NULL ) {
         
         /* Try more than once before sleeping. */
-        for ( int tries = 0 ; res == NULL && tries < scheduler_flag_maxsteal ; tries++ ) {
+        for ( int tries = 0 ; res == NULL && tries < scheduler_maxtries ; tries++ ) {
         
             /* Try to get a task from the suggested queue. */
             if ( ( res = queue_gettask( &s->queues[qid] , qid , super , 0 ) ) != NULL )
@@ -859,7 +859,14 @@ struct task *scheduler_gettask ( struct scheduler *s , int qid , struct cell *su
                 for ( k = 0 ; k < nr_queues ; k++ )
                     if ( s->queues[k].count > 0 )
                         qids[ count++ ] = k;
-                if ( count > 0 && ( res = queue_gettask( &s->queues[ qids[ rand() % count ] ] , qid , super , 0 ) ) != NULL )
+                for ( k = 0 ; k < scheduler_maxsteal && count > 0 ; k++ ) {
+                    int ind = rand() % count;
+                    if ( ( res = queue_gettask( &s->queues[ qids[ ind ] ] , qid , super , 0 ) ) != NULL )
+                        break;
+                    else 
+                        qids[ ind ] = qids[ --count ];
+                    }
+                if ( res != NULL )
                     break;
                 }
                 
diff --git a/src/scheduler.h b/src/scheduler.h
index b8ae07ed35..46b196f4b6 100644
--- a/src/scheduler.h
+++ b/src/scheduler.h
@@ -22,11 +22,12 @@
 #define scheduler_maxwait                    3
 #define scheduler_maxunlock                  40
 #define scheduler_dosub                      1
+#define scheduler_maxsteal                   10
+#define scheduler_maxtries                   10
 
 /* Flags . */
 #define scheduler_flag_none                  0
 #define scheduler_flag_steal                 1
-#define scheduler_flag_maxsteal              10
 
 
 /* Data of a scheduler. */
-- 
GitLab