Beispiel #1
0
static void ReadThreadState( struct TDebugThread *obj )
{
    struct ThreadState state;
    int i;
    int ok;
    char str[21];

    ok = FALSE;
    
    for( i = 0; i < 256 && !ok; i++ ) {
        RdosGetThreadState( i, &state );
        if( state.ID == obj->ThreadID )
            ok = TRUE;
    }

    if (ok) {
        strncpy(str, state.Name, 20);
        str[20] = 0;
        
        for( i = 19; i >= 0; i-- )
            if( str[i] == ' ' )
                str[i] = 0;
            else
                break;

        if( obj->ThreadName )
            free( obj->ThreadName );

        obj->ThreadName = malloc( strlen( str ) + 1 );
        strcpy( obj->ThreadName, str );

        strncpy(str, state.List, 20);
        str[20] = 0;
        
        for( i = 19; i >= 0; i-- )
            if( str[i] == ' ' )
                str[i] = 0;
            else
                break;

        if( obj->ThreadList )
            free( obj->ThreadList );

        obj->ThreadList = malloc( strlen( str ) + 1 );
        strcpy( obj->ThreadList, str );
        
        obj->ListOffset = state.Offset;
        obj->ListSel = state.Sel;
    }
}
Beispiel #2
0
trap_retval ReqRunThread_get_runtime( void )
{
    run_thread_get_runtime_req *acc;
    run_thread_get_runtime_ret *ret;
    int                        ok;
    int                        i;
    struct ThreadState         state;
    char                       *time_txt;
    char                       tempstr[10];
    int                        day;
    int                        hour;
    int                        min;
    int                        sec;
    int                        milli;
    int                        micro;
    int                        started;

    acc = GetInPtr( 0 );
    ret = GetOutPtr( 0 );

    time_txt = GetOutPtr( sizeof( *ret ) );

    ok = false;

    for( i = 0; i < 256 && !ok; i++ ) {
        RdosGetThreadState( i, &state );
        if (state.ID == acc->thread) {
            ok = true;
        }
    }

    ret->state = THD_BLOCKED;
    ret->cs = 0;
    ret->eip = 0;
    *time_txt = 0;

    if (ok) {
        if( strstr( state.List, "Ready" ) )
            ret->state = THD_RUN;

        if( strstr( state.List, "Run" ) )
            ret->state = THD_RUN;
                
        if( strstr( state.List, "Debug" ) )
            ret->state = THD_DEBUG;
                
        if( strstr( state.List, "Wait" ) )
            ret->state = THD_WAIT;

        if( strstr( state.List, "Signal" ) )
            ret->state = THD_SIGNAL;

        if( strstr( state.List, "Keyboard" ) )
            ret->state = THD_KEYBOARD;

        ret->cs = state.Sel;
        ret->eip = state.Offset;

        day = state.MsbTime / 24;
        hour = state.MsbTime % 24;
        RdosDecodeLsbTics(state.LsbTime, &min, &sec, &milli, &micro);

        started = false;
        if( day ) {
            sprintf( time_txt, "%3d ", day );
            started = true;
        } else {
            strcpy( time_txt, "    ");
        }

        if( hour || started ) {
            if( started )
                sprintf( tempstr, "%02d.", hour );
            else
                sprintf( tempstr, "%2d.", hour );
            strcat( time_txt, tempstr );
            started = true;
        } else {
            strcat( time_txt, "   " );
        }

        if( min || started ) {
            if( started )
                sprintf( tempstr, "%02d.", min );
            else
                sprintf( tempstr, "%2d.", min );
            strcat( time_txt, tempstr );
            started = true;
        } else {
            strcat( time_txt, "   " );
        }

        if( sec || started ) {
            if( started )
               sprintf( tempstr, "%02d,", sec );
            else
               sprintf( tempstr, "%2d,", sec );
            strcat( time_txt, tempstr );
            started = true;
        } else {
            strcat( time_txt, "   " );
        }

        if( milli || started ) {
            if( started )
                sprintf( tempstr, "%03d ", milli );
            else
                sprintf( tempstr, "%3d ", milli );
            strcat( time_txt, tempstr );
            started = true;
        } else {
            strcat( time_txt, "    " );
        }

        if( started )
            sprintf( tempstr, "%03d", micro );
        else 
            sprintf( tempstr, "%3d", micro );
        strcat( time_txt, tempstr );
    }
    return( sizeof( *ret ) + strlen( time_txt ) + 1 );
}