libmthread: add possibility to randomize scheduler
This commit is contained in:
		
							parent
							
								
									3de8d1cf6e
								
							
						
					
					
						commit
						93103f497f
					
				| @ -8,7 +8,7 @@ | |||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <sys/signal.h> | #include <sys/signal.h> | ||||||
| 
 | 
 | ||||||
| 
 | #define MTHREAD_RND_SCHED	0	/* Enable/disable random scheduling */ | ||||||
| #define NO_THREADS 4  | #define NO_THREADS 4  | ||||||
| #define MAX_THREAD_POOL 1024 | #define MAX_THREAD_POOL 1024 | ||||||
| #define STACKSZ 4096 | #define STACKSZ 4096 | ||||||
|  | |||||||
| @ -95,14 +95,55 @@ mthread_queue_t *queue;		/* Queue we want a thread from */ | |||||||
| { | { | ||||||
| /* Get the first thread in this queue, if there is one. */ | /* Get the first thread in this queue, if there is one. */ | ||||||
|   mthread_thread_t thread; |   mthread_thread_t thread; | ||||||
|   mthread_tcb_t *tcb; |   mthread_tcb_t *tcb, *random_tcb, *prev; | ||||||
|  |   int count = 0, offset_id = 0, picked_random = 0; | ||||||
| 
 | 
 | ||||||
|   /* Calculate thread id from queue head */ |   tcb = queue->mq_head; | ||||||
|   if (queue->mq_head == NULL) thread = NO_THREAD; |  | ||||||
|   else if (queue->mq_head == &mainthread) thread = MAIN_THREAD; |  | ||||||
|   else thread = (queue->mq_head->m_tid); |  | ||||||
| 
 | 
 | ||||||
|   if (thread != NO_THREAD) { /* i.e., this queue is not empty */ |   if (MTHREAD_RND_SCHED) { | ||||||
|  | 	/* Count items on queue */ | ||||||
|  | 	random_tcb = queue->mq_head; | ||||||
|  | 	if (random_tcb != NULL) { | ||||||
|  | 		do { | ||||||
|  | 			count++; | ||||||
|  | 			random_tcb = random_tcb->m_next; | ||||||
|  | 		} while (random_tcb != NULL); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (count > 1) { | ||||||
|  | 		picked_random = 1; | ||||||
|  | 
 | ||||||
|  | 		/* Get random offset */ | ||||||
|  | 		offset_id = random() % count; | ||||||
|  | 
 | ||||||
|  | 		/* Find offset in queue */ | ||||||
|  | 		random_tcb = queue->mq_head; | ||||||
|  | 		prev = random_tcb; | ||||||
|  | 		while (--offset_id > 0) { | ||||||
|  | 			prev = random_tcb; | ||||||
|  | 			random_tcb = random_tcb->m_next; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		/* Stitch head and tail together */ | ||||||
|  | 		prev->m_next = random_tcb->m_next; | ||||||
|  | 
 | ||||||
|  | 		/* Fix head and tail */ | ||||||
|  | 		if (queue->mq_head == random_tcb) | ||||||
|  | 			queue->mq_head = random_tcb->m_next; | ||||||
|  | 		if (queue->mq_tail == random_tcb) | ||||||
|  | 			queue->mq_tail = prev; | ||||||
|  | 
 | ||||||
|  | 		tcb = random_tcb; | ||||||
|  | 	} | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /* Retrieve thread id from tcb */ | ||||||
|  |   if (tcb == NULL) thread = NO_THREAD; | ||||||
|  |   else if (tcb == &mainthread) thread = MAIN_THREAD; | ||||||
|  |   else thread = (tcb->m_tid); | ||||||
|  | 
 | ||||||
|  |   /* If we didn't pick a random thread and queue is not empty... */ | ||||||
|  |   if (!picked_random && thread != NO_THREAD) { | ||||||
|   	tcb = queue->mq_head; |   	tcb = queue->mq_head; | ||||||
| 	if (queue->mq_head == queue->mq_tail) { | 	if (queue->mq_head == queue->mq_tail) { | ||||||
| 		/* Queue holds only one thread */ | 		/* Queue holds only one thread */ | ||||||
| @ -111,10 +152,11 @@ mthread_queue_t *queue;		/* Queue we want a thread from */ | |||||||
| 		/* Second thread in line is the new first */ | 		/* Second thread in line is the new first */ | ||||||
| 		queue->mq_head = queue->mq_head->m_next; | 		queue->mq_head = queue->mq_head->m_next; | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	tcb->m_next = NULL; /* This thread is no longer part of a queue */ |  | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   if (tcb != NULL) | ||||||
|  | 	tcb->m_next = NULL; /* This thread is no longer part of a queue */ | ||||||
|  | 
 | ||||||
|   return(thread); |   return(thread); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Thomas Veerman
						Thomas Veerman