home *** CD-ROM | disk | FTP | other *** search
/ Shareware Supreme Volume 6 #1 / swsii.zip / swsii / 215 / DDJ9208.ZIP / WIN_SCH.ASC < prev   
Text File  |  1992-07-06  |  3KB  |  73 lines

  1. _INSIDE THE WINDOWS SCHEDULER_
  2. by Matt Pietrek
  3.  
  4. Figure 1: 
  5.  
  6.         //------------------STARTUP SECTION-------------------
  7.         Save registers on stack of outgoing task
  8.         Update task profiles
  9.         If ( TDB signature not OK)
  10.             goto Walk_through_task_list
  11.         Get DirectedYield field in TDB into AX; zero it out in TDB
  12.         If ( DirectedYield hTask == 0 )
  13.             goto Walk_through_task_list
  14.         If ( event count in DirectedYield TDB != 0 )
  15.             goto startup_this_task
  16.         //---------------TOP HALF OF TASK WALK-------------
  17. Walk_through_task_list:
  18.         Point to the first task in the linked list of tasks
  19. Try_next_task:
  20.         if ( another task in list )
  21.             goto Does_this_task_have_an_event?
  22.         //---------------THE IDLE LOOP--------------------
  23.         ShrinkHeap()            // In KRNL386 only
  24.         DiscardFreeBlocks()    // In KRNL386 only
  25.         IsUserIdle()
  26.         if ( fPokeAtSegments != 0 )
  27.             if ( USER is idle )
  28.                 Call routine to load a boot time module segment
  29.                 goto Walk_through_task_list
  30.         INT 28h
  31.         INT 2Fh, AX = 1689h
  32.         goto Walk_through_task_list
  33.         //-------------BOTTOM HALF OF TASK WALK----------------------
  34. Does_this_task_have_an_event?:
  35.         if ( event count field == 0 )
  36.             point to next TDB
  37.             goto Try_next_task
  38.         //-------------TASK SWITCHING CODE------------------------
  39.         // Found a potential task to switch to
  40.         // Make sure it's OK to switch
  41.         if ( found task == current task )
  42.             goto Reschedule_done
  43. startup_this_task:
  44.         if ( there is a locked task, and it's not the current task )
  45.             goto Reschedule_done
  46.         If ( InDOS flag )
  47.             goto Try_next_task
  48.         // It's OK to switch tasks now
  49.         Increment InScheduler flag
  50.         Delete & re-insert task into TDB list to give it proper priority.
  51.         Lock the global heap
  52.         Save SS:SP in current TDB
  53.         Call function that checks the following
  54.              if ( 80x87 present )
  55.                  save control word in outgoing TDB
  56.              if ( Current disk not set in TDB )
  57.                  Save the current DOS disk/directory in the TDB
  58.         Call routine that sends task switch out notification
  59.         Set new Windows current TDB value
  60.         Set new Windows PDB value from the PDB value in the incoming TDB
  61.         if ( 80x87 present )
  62.             load control word from incoming TDB
  63.         Call routine that sends task switch in notification
  64.         Switch to SS:SP from incoming TDB
  65.         Update the "current TDB" global variable
  66.         Decrement InScheduler flag
  67.         Tell the display driver that we've switched // In KRNL386 only
  68.         Unlock the global heap
  69. Reschedule_done:
  70.         Restore registers from stack
  71.  
  72.  
  73.