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)22 int 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