Changeset 435 for trunk/user/init/init.c


Ignore:
Timestamp:
Feb 20, 2018, 5:32:17 PM (4 years ago)
Author:
alain
Message:

Fix a bad bug in scheduler...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/user/init/init.c

    r434 r435  
    3838    for( i = 1 ; i <  NB_TXT_CHANNELS ; i++ )
    3939    {
    40 
    41 snprintf( string , 64 , "@@@ before fork / iter = %d\n" , i );
    42 display_string( string );
    43 
    4440        // INIT process fork process CHILD[i]
    4541        ret_fork = fork();
    46 
    47 snprintf( string , 64 , "@@@ after fork / iter = %d / ret_fork = %d\n" , i , ret_fork );
    48 display_string( string );
    4942
    5043        if( ret_fork< 0 )   // error in fork
    5144        {
    5245            // INIT display error message on TXT0 terminal
    53             snprintf( string , 64 , "init cannot fork child[%d]\n" , i );
     46            snprintf( string , 64 ,
     47            "INIT cannot fork child[%d]\n" , i );
    5448            display_string( string );
    5549
     
    6559            {
    6660                // display error message on TXT0 terminal
    67                 snprintf( string , 64 , "child[%d] cannot exec ksh[%d]\n" , i , i );
     61                snprintf( string , 64 ,
     62                "CHILD[%d] cannot exec KSH[%d] / ret_exec = %d\n" , i , i , ret_exec );
    6863                display_string( string );
    69 
    70                 // CHILD[i] exit
    71                 // exit( 0 );
    7264            }
    7365        }
     
    7567        {
    7668             // INIT display CHILD[i] process PID
    77              snprintf( string , 64 , "INIT forked CHILD[%d] / pid = %x\n", i , ret_fork );
     69             snprintf( string , 64 ,
     70             "INIT forked CHILD[%d] / pid = %x\n", i , ret_fork );
    7871             display_string( string );
    79 
    80              // INIT delay
    81              int     x;
    82              for( x=0 ; x<DELAY_BETWEEN_FORK ; x++) asm volatile ("nop");
    83 
    84 /*
    85              // INIT wait exec completion by CHILD[i]
    86              while( 1 )
    87              {
    88                  // get terminating process PID
    89                  received_pid = wait( &status );
    90 
    91                  if( received_pid == ret_fork ) break;
    92                  else
    93                  {
    94                      snprintf( string , 64 ,
    95                      "expected_pid %d / received_pid %d" , ret_fork , received_pid  );
    96                      display_string( string );
    97                  }
    98              }
    99 
    100 */
    101              // INIT display string on kernel TXT0
    102              snprintf( string , 64 , "INIT created KSH[%d]\n", i );
    103              display_string( string );
    104 // @@@
    105 display_process( 0 );
    106 display_sched( 0 , 0 );
    107 // @@@
    10872        }
    10973
    11074    }
    11175
    112     // This blocking loop is only for debug, because KSH[i] processes
    113     // should never be killed, and INIT should never return from the wait() function.
     76    // This loop detects the termination of the KSH[i] processes,
     77    // to recreate these process when required.
    11478    while( 1 )
    11579    {
    116         // block on child process termination
    117         received_pid = wait( &status ); 
     80        // block on child processes termination
     81        received_pid = wait( &status );
    11882
    119         // display string to report unexpected KSH process termination
    120         snprintf( string , 64 , "KSH process %x unexpectedly terminated" , received_pid );
    121         display_string( string );
     83        if( WIFSTOPPED( status ) )                         // stopped => unblock it
     84        {
     85            // display string to report unexpected KSH process block
     86            snprintf( string , 64 , "KSH process %x unexpectedly stopped" , received_pid );
     87            display_string( string );
     88
     89        }
     90
     91        if( WIFSIGNALED( status ) || WIFEXITED( status ) )  // killed => recreate it
     92        {
     93            // display string to report unexpected KSH process termination
     94            snprintf( string , 64 , "KSH process %x unexpectedly terminated" , received_pid );
     95            display_string( string );
     96        }
    12297    }
    12398
Note: See TracChangeset for help on using the changeset viewer.