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); }
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; } }
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; }