Пример #1
0
/* 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);
}
Пример #2
0
/* 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--;
}
Пример #3
0
/* 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--;
}
Пример #4
0
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);
    }
}