1 2 /* ###--------------------------------------------------------------### */ 3 /* file : sch_GetNTim.c */ 4 /* date : Aug 5 1997 */ 5 /* version : v101 */ 6 /* author : Nizar ABDALLAH, Pirouz BARAGAN SABET */ 7 /* description : scheduler */ 8 /* ###--------------------------------------------------------------### */ 9 10 #include <stdio.h> 11 #include "sch.h" 12 13 /* ###--------------------------------------------------------------### */ 14 /* function : sch_GetNextTime */ 15 /* description : return the date of the first transaction as an */ 16 /* argument. If the scheduler is empty the function */ 17 /* returns the value 0. The functions also releases */ 18 /*/ empty time-entries in the scheduler */ 19 /* called func. : none */ 20 /* ###--------------------------------------------------------------### */ 21 sch_GetNextTime(pt_shdul,pt_date)22int sch_GetNextTime (pt_shdul, pt_date) 23 24 struct shdul *pt_shdul; 25 unsigned int *pt_date ; 26 27 { 28 struct shent *pt_shent ; 29 struct shent *pt_nxtent ; 30 unsigned int min_window = 0; 31 unsigned int min_offset = 0; 32 unsigned int min_number = 0; 33 unsigned int time_window ; 34 unsigned int wind_number ; 35 unsigned int i ; 36 unsigned int j ; 37 unsigned int index ; 38 int glob_found = 0; 39 40 time_window = (pt_shdul->CURTIME >> 3) & 0x000000ff; 41 wind_number = (pt_shdul->CURTIME >> 11) & 0x001fffff; 42 43 for (i=0 ; i<256 ; i++) 44 { 45 index = (i + time_window) % 256; 46 pt_shent = pt_shdul->TTABLE [index]; 47 while (pt_shent != NULL) 48 { 49 for (j=0 ; j<8 ; j++) 50 { 51 if (pt_shent->TRANS [j] != NULL) 52 { 53 if ( (glob_found == 0 ) || 54 (pt_shent->DATE < min_number) || 55 ((pt_shent->DATE == min_number) && (index < min_window))) 56 { 57 min_window = index ; 58 min_offset = j ; 59 min_number = pt_shent->DATE; 60 glob_found = 1 ; 61 } 62 break; 63 } 64 } 65 if (j == 8) 66 { 67 pt_nxtent = pt_shent->NEXT; 68 pt_shdul->TTABLE [index] = pt_nxtent ; 69 pt_shent->NEXT = SCH_FREE_SHENT; 70 SCH_FREE_SHENT = pt_shent ; 71 pt_shent = pt_nxtent ; 72 } 73 else 74 break; 75 } 76 77 if ((glob_found == 1) && (min_number == wind_number)) 78 break; 79 } 80 81 if (glob_found == 1) 82 (*pt_date) = (min_number << 11) + (min_window << 3) + min_offset; 83 84 return (glob_found); 85 } 86