/* Frees the symbol table, and optionally frees the data pointed to */ void INT_ARRAY_delete_symbol_table (INT_ARRAY_Symbol_Table * table, void (*free_routine) (void *)) { INT_ARRAY_Symbol *symbol, *next_symbol; /* For all the symbols in the table, free each one */ for (symbol = table->head_symbol; symbol != NULL; symbol = next_symbol) { /* Get the next symbol before deleting this one */ next_symbol = symbol->next_symbol; /* If free routine specified, free data */ if (free_routine != NULL) free_routine (symbol->data); /* Free symbol structure and int_array */ free (symbol->int_array); L_free (INT_ARRAY_Symbol_pool, symbol); } /* Free the hash array and table name */ free (table->hash); free (table->name); /* Free the table structure */ L_free (INT_ARRAY_Symbol_Table_pool, table); }
/* Deletes symbol and optionally deletes the data using the free routine */ void INT_ARRAY_delete_symbol (INT_ARRAY_Symbol * symbol, void (*free_routine) (void *)) { INT_ARRAY_Symbol_Table *table; INT_ARRAY_Symbol *next_hash, *prev_hash, *next_symbol, *prev_symbol; unsigned int hash_index; /* Get the table the symbol is from */ table = symbol->table; /* Get the hash index from the symbol's hash_val */ hash_index = symbol->hash_val & table->hash_mask; /* Remove symbol from hash table */ prev_hash = symbol->prev_hash; next_hash = symbol->next_hash; if (prev_hash == NULL) table->hash[hash_index] = next_hash; else prev_hash->next_hash = next_hash; if (next_hash != NULL) next_hash->prev_hash = prev_hash; /* Remove symbol from symbol list */ prev_symbol = symbol->prev_symbol; next_symbol = symbol->next_symbol; if (prev_symbol == NULL) table->head_symbol = next_symbol; else prev_symbol->next_symbol = next_symbol; if (next_symbol == NULL) table->tail_symbol = prev_symbol; else next_symbol->prev_symbol = prev_symbol; /* If free routine specified, free symbol data */ if (free_routine != NULL) free_routine (symbol->data); /* Free symbol structure and int_array */ free (symbol->int_array); L_free (INT_ARRAY_Symbol_pool, symbol); /* Decrement table symbol count */ table->symbol_count--; }
/* Deletes symbol and optionally deletes the data using the free routine */ void OPERAND_delete_symbol (OPERAND_Symbol * symbol, void (*free_routine) (void *)) { OPERAND_Symbol_Table *table; OPERAND_Symbol *next_hash, *prev_hash, *next_symbol, *prev_symbol; unsigned int hash_index; int hash_value; /* Get the table the symbol is from */ table = symbol->table; /* Get the hash index from the symbol's value */ hash_value = OPERAND_Hash_Value ((L_Operand *) symbol->data); hash_index = hash_value & table->hash_mask; /* Remove symbol from hash table */ prev_hash = symbol->prev_hash; next_hash = symbol->next_hash; if (prev_hash == NULL) table->hash[hash_index] = next_hash; else prev_hash->next_hash = next_hash; if (next_hash != NULL) next_hash->prev_hash = prev_hash; /* Remove symbol from symbol list */ prev_symbol = symbol->prev_symbol; next_symbol = symbol->next_symbol; if (prev_symbol == NULL) table->head_symbol = next_symbol; else prev_symbol->next_symbol = next_symbol; if (next_symbol == NULL) table->tail_symbol = prev_symbol; else next_symbol->prev_symbol = prev_symbol; /* If free routine specified, free symbol data */ if (free_routine != NULL) free_routine (symbol->data); /* Free symbol structure */ L_free (OPERAND_Symbol_pool, symbol); /* Decrement table symbol count */ table->symbol_count--; }
void drakvuf_remove_trap(drakvuf_t drakvuf, drakvuf_trap_t *trap, void(*free_routine)(drakvuf_trap_t *trap)) { if ( drakvuf->in_callback) { struct free_trap_wrapper *free_wrapper = g_hash_table_lookup(drakvuf->remove_traps, &trap); if (!free_wrapper) { free_wrapper = g_malloc0(sizeof(struct free_trap_wrapper)); free_wrapper->free_routine = free_routine; free_wrapper->trap = trap; g_hash_table_insert(drakvuf->remove_traps, g_memdup(&trap, sizeof(void*)), free_wrapper); } free_wrapper->counter++; } else { remove_trap(drakvuf, trap); if(free_routine) free_routine(trap); } }