Running multiple thread instances of the same function. (See MultiThread Program for an example on how to use it)

Dependents:   MutliThread Server_Multi_Client HelloWorld C027_SupportTest ... more

Committer:
lemniskata
Date:
Sat Jun 29 22:59:46 2013 +0000
Revision:
3:d370bed31f45
Parent:
2:46b56c9086f2
Running multiple thread instances of the same function. New thread is started only if there are less than MAX non-inactive threads

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lemniskata 0:266b0dc4f8d0 1 /*
lemniskata 0:266b0dc4f8d0 2 ** File name: Thread.cpp
lemniskata 0:266b0dc4f8d0 3 ** Descriptions: Creates multiple thread instances of the same function
lemniskata 0:266b0dc4f8d0 4 **
lemniskata 0:266b0dc4f8d0 5 **------------------------------------------------------------------------------------------------------
lemniskata 0:266b0dc4f8d0 6 ** Created by: Ivan Shindev
lemniskata 0:266b0dc4f8d0 7 ** Created date: 06/29/2013
lemniskata 0:266b0dc4f8d0 8 ** Version: 1.0
lemniskata 0:266b0dc4f8d0 9 ** Descriptions: The original version
lemniskata 0:266b0dc4f8d0 10 **
lemniskata 0:266b0dc4f8d0 11 **------------------------------------------------------------------------------------------------------
lemniskata 0:266b0dc4f8d0 12 ** Modified by:
lemniskata 0:266b0dc4f8d0 13 ** Modified date:
lemniskata 0:266b0dc4f8d0 14 ** Version:
lemniskata 0:266b0dc4f8d0 15 ** Descriptions:
lemniskata 0:266b0dc4f8d0 16 ********************************************************************************************************/
lemniskata 0:266b0dc4f8d0 17 #include "Threads.h"
lemniskata 0:266b0dc4f8d0 18
lemniskata 2:46b56c9086f2 19 /*Initialize memory and set the pointer to the thread*/
lemniskata 3:d370bed31f45 20 int initThread(ThreadList **addresOfTL,os_pthread pthread,ThreadList** addresOfThread,int max)
lemniskata 0:266b0dc4f8d0 21 {
lemniskata 3:d370bed31f45 22
lemniskata 2:46b56c9086f2 23 if(*addresOfTL==NULL)
lemniskata 2:46b56c9086f2 24 {
lemniskata 3:d370bed31f45 25 if(max<=0)
lemniskata 3:d370bed31f45 26 return 0;
lemniskata 2:46b56c9086f2 27 *addresOfTL=(ThreadList*)malloc(sizeof(ThreadList));
lemniskata 2:46b56c9086f2 28 if(*addresOfTL==NULL)
lemniskata 2:46b56c9086f2 29 return 0;
lemniskata 0:266b0dc4f8d0 30
lemniskata 2:46b56c9086f2 31 (*addresOfTL)->thread=NULL;
lemniskata 2:46b56c9086f2 32 (*addresOfTL)->thread=(osThreadDef_t *)malloc(sizeof(osThreadDef_t ));
lemniskata 0:266b0dc4f8d0 33
lemniskata 2:46b56c9086f2 34 if((*addresOfTL)->thread==NULL)
lemniskata 2:46b56c9086f2 35 return 0;
lemniskata 0:266b0dc4f8d0 36
lemniskata 2:46b56c9086f2 37 (*addresOfTL)->thread->pthread=pthread;
lemniskata 2:46b56c9086f2 38 (*addresOfTL)->thread->tpriority=osPriorityNormal;
lemniskata 2:46b56c9086f2 39 (*addresOfTL)->thread->stacksize=DEFAULT_STACK_SIZE;
lemniskata 2:46b56c9086f2 40
lemniskata 2:46b56c9086f2 41 (*addresOfTL)->thread->stack_pointer=NULL;
lemniskata 2:46b56c9086f2 42 (*addresOfTL)->thread->stack_pointer=(unsigned char *)malloc(DEFAULT_STACK_SIZE);
lemniskata 0:266b0dc4f8d0 43
lemniskata 2:46b56c9086f2 44 if((*addresOfTL)->thread->stack_pointer==NULL)
lemniskata 2:46b56c9086f2 45 return 0;
lemniskata 2:46b56c9086f2 46 (*addresOfTL)->nextThread=NULL;
lemniskata 2:46b56c9086f2 47 (*addresOfThread)=(*addresOfTL);
lemniskata 2:46b56c9086f2 48 return 1;
lemniskata 2:46b56c9086f2 49 }
lemniskata 2:46b56c9086f2 50 else
lemniskata 3:d370bed31f45 51 {
lemniskata 3:d370bed31f45 52 if((*addresOfTL)->thread->tcb.state == 0)
lemniskata 3:d370bed31f45 53 {
lemniskata 3:d370bed31f45 54 free((*addresOfTL)->thread->stack_pointer);
lemniskata 3:d370bed31f45 55 (*addresOfTL)->thread->stack_pointer=NULL;
lemniskata 3:d370bed31f45 56 free((*addresOfTL)->thread);
lemniskata 3:d370bed31f45 57 (*addresOfTL)->thread=NULL;
lemniskata 3:d370bed31f45 58 (*addresOfTL)->thread=(osThreadDef_t *)malloc(sizeof(osThreadDef_t ));
lemniskata 3:d370bed31f45 59
lemniskata 3:d370bed31f45 60 if((*addresOfTL)->thread==NULL)
lemniskata 3:d370bed31f45 61 return 0;
lemniskata 3:d370bed31f45 62
lemniskata 3:d370bed31f45 63 (*addresOfTL)->thread->pthread=pthread;
lemniskata 3:d370bed31f45 64 (*addresOfTL)->thread->tpriority=osPriorityNormal;
lemniskata 3:d370bed31f45 65 (*addresOfTL)->thread->stacksize=DEFAULT_STACK_SIZE;
lemniskata 3:d370bed31f45 66
lemniskata 3:d370bed31f45 67 (*addresOfTL)->thread->stack_pointer=NULL;
lemniskata 3:d370bed31f45 68 (*addresOfTL)->thread->stack_pointer=(unsigned char *)malloc(DEFAULT_STACK_SIZE);
lemniskata 3:d370bed31f45 69
lemniskata 3:d370bed31f45 70 if((*addresOfTL)->thread->stack_pointer==NULL)
lemniskata 3:d370bed31f45 71 return 0;
lemniskata 3:d370bed31f45 72 (*addresOfThread)=(*addresOfTL);
lemniskata 3:d370bed31f45 73 return 1;
lemniskata 3:d370bed31f45 74 }
lemniskata 3:d370bed31f45 75 else
lemniskata 3:d370bed31f45 76 return initThread(&((*addresOfTL)->nextThread),pthread,addresOfThread,--max);
lemniskata 3:d370bed31f45 77 }
lemniskata 0:266b0dc4f8d0 78 }
lemniskata 0:266b0dc4f8d0 79