Beispiel #1
0
void
del_expr(expr_t *expr)
{
    if (expr == NULL)
	return;
    switch (expr->token) {
	case tok_inc:			case tok_dec:
	case tok_postinc:		case tok_postdec:
	case tok_plus:			case tok_neg:
	case tok_not:			case tok_com:
	case tok_pointer:		case tok_address:
	case tok_sizeof:		case tok_list:
	case tok_goto:			case tok_return:
	case tok_code:			case tok_data:
	case tok_stat:			case tok_elemref:
	case tok_fieldref:
	    del_stat(expr->data._unary.expr);
	    break;
	case tok_set ... tok_rem:
	case tok_vector:		case tok_call:
	case tok_dot:			case tok_arrow:
	case tok_declexpr:		case tok_decl:
	    del_stat(expr->data._binary.lvalue);
	    del_stat(expr->data._binary.rvalue);
	    break;
	case tok_if:			case tok_question:
	    del_stat(expr->data._if.test);
	    del_stat(expr->data._if.tcode);
	    del_stat(expr->data._if.fcode);
	    break;
	case tok_while:
	    del_stat(expr->data._while.test);
	    del_stat(expr->data._while.code);
	    break;
	case tok_for:
	    del_stat(expr->data._for.init);
	    del_stat(expr->data._for.test);
	    del_stat(expr->data._for.incr);
	    del_stat(expr->data._for.code);
	    break;
	case tok_do:
	    del_stat(expr->data._do.code);
	    del_stat(expr->data._do.test);
	    break;
	case tok_switch:
	    del_stat(expr->data._switch.test);
	    del_stat(expr->data._switch.code);
	    del_hash(expr->data._switch.hash);
	    break;
	default:
	    break;
    }
    free(expr);
}
Beispiel #2
0
void
FileRecordNumber :: add_lru( frn_record * x )
{
    if ( x->locked == 0 )
    {
        printf( "FileRecordNumber: unlocking a record "
                "already unlocked %s:%d\n",
                __FILE__, __LINE__ );
        return;
    }

    if ( cache_size == max_cache_size )
    {
        bool needsflush = false;
        frn_record * y = get_lru();
        if ( y->dirty )
        {
            needsflush = true;
            flushes++;
            __put_record( y );
        }
        del_hash( y );
        delete y;
        if ( needsflush )
            flushes = flush();
    }

    cache_size++;
    x->locked = 0;

    if ( lru_tail == NULL )
    {
        lru_head = lru_tail = x;
        x->lru_next = x->lru_prev = NULL;
    }
    else
    {
        x->lru_prev = lru_tail;
        x->lru_prev->lru_next = x;
        x->lru_next = NULL;
        lru_tail = x;
    }
}
Beispiel #3
0
int
FileRecordNumber :: flush( void )
{
    int now = time( NULL );
    int r = 0;
    frn_record * x, * xn;
    for ( int i = 0; i < hashsize; i++ )
        for ( x = datahash[i]; x; x = xn )
        {
            xn = x->next;
            if ( x->dirty )
            {
                r++;
                __put_record( x );
                if ( !x->locked )
                {
                    x->dirty = 0;
                    x->clean = time( NULL );
                }
            }
            else
            {
                if ( x->locked == 0  &&  x->clean != -1  && 
                     ( now - x->clean ) > 30 )
                {
                    delete_lru( x );
                    del_hash( x );
                    delete x;
                }
            }
        }
    fflush( fd );
    r += flushes;
    flushes = 0;
    return r;
}