Esempio n. 1
0
static void
handler(int signo)
{
	SigTable *sig_tbl;
	AWKNUM ret;
	static INSTRUCTION *code;
	extern int exiting;

	sig_tbl = sig2ptr(signo);

	/* make function call instructions */
	code = bcalloc(Op_func_call, 2, 0);
	code->func_name = NULL;		/* not needed, func_body will assign */
	code->nexti = bcalloc(Op_stop, 1, 0);

	code->func_body = sig_tbl->user_handler;
	(code + 1)->expr_count = 1;	/* function takes one argument */

	PUSH(make_number((AWKNUM) signo));

	interpret(code);
	if (exiting)	/* do not assume anything about the user-defined function! */
		gawk_exit(exit_val);

	POP_NUMBER(ret);

	bcfree(code->nexti);            /* Op_stop */
	bcfree(code);                   /* Op_func_call */

	return;
}
Esempio n. 2
0
ssize_t bccollect( cexception_t *ex )
{
    alloccell_t *curr, *prev, *next;
    ssize_t reclaimed = 0;

    prev = NULL;
    curr = allocated;
    while( curr != NULL ) {
        next = curr->next;
	/* printf( "%p %ld\n", curr, curr->rcount ); */
	if( thrcode_heapdebug_is_on()) {
	    if( (curr->flags & AF_USED) == 0 ) {
		printf( "collecting " );
	    } else {
		printf( "leaving    " );
	    }
	    printf( "%p (%p) (size = %ld bytes)\n",
		    curr, curr+1, (long)curr->size );
	}
        if( (curr->flags & AF_USED) == 0 ) {
	    if( curr != allocated ) {
	        prev->next = next;
		if( prev->next )
		    prev->next->prev = prev;
	    } else {
	        prev = allocated = next;
	    }
	    reclaimed += curr->size;
            thrcode_run_destructor_if_needed( &istate, curr, ex );
	    bcfree( curr );
	} else {
	    curr->prev = prev;
	    prev = curr;
	}
        curr = next;
    }
    total_allocated_bytes -= reclaimed;
    if( total_allocated_bytes < 0 ) {
	assert( total_allocated_bytes >= 0 );
	total_allocated_bytes = 0;
    }
    return reclaimed;
}