#define SGEN_HASH_TABLE_ENTRY_SIZE(data_size) ((data_size) + sizeof (SgenHashTableEntry*) + sizeof (gpointer))
gpointer sgen_hash_table_lookup (SgenHashTable *table, gpointer key) MONO_INTERNAL;
-gboolean sgen_hash_table_replace (SgenHashTable *table, gpointer key, gpointer data) MONO_INTERNAL;
+gboolean sgen_hash_table_replace (SgenHashTable *table, gpointer key, gpointer new_value, gpointer old_value) MONO_INTERNAL;
gboolean sgen_hash_table_set_value (SgenHashTable *table, gpointer key, gpointer new_value, gpointer old_value) MONO_INTERNAL;
gboolean sgen_hash_table_set_key (SgenHashTable *hash_table, gpointer old_key, gpointer new_key) MONO_INTERNAL;
gboolean sgen_hash_table_remove (SgenHashTable *table, gpointer key, gpointer data_return) MONO_INTERNAL;
}
gboolean
-sgen_hash_table_replace (SgenHashTable *hash_table, gpointer key, gpointer data)
+sgen_hash_table_replace (SgenHashTable *hash_table, gpointer key, gpointer new_value, gpointer old_value)
{
guint hash;
SgenHashTableEntry *entry;
entry = lookup (hash_table, key, &hash);
if (entry) {
- memcpy (entry->data, data, hash_table->data_size);
+ if (old_value)
+ memcpy (old_value, entry->data, hash_table->data_size);
+ memcpy (entry->data, new_value, hash_table->data_size);
return FALSE;
}
entry = sgen_alloc_internal (hash_table->entry_mem_type);
entry->key = key;
- memcpy (entry->data, data, hash_table->data_size);
+ memcpy (entry->data, new_value, hash_table->data_size);
entry->next = hash_table->table [hash];
hash_table->table [hash] = entry;
if (entry) {
g_free (name);
} else {
- sgen_hash_table_replace (hash_table, name, empty_entry);
+ sgen_hash_table_replace (hash_table, name, empty_entry, NULL);
entry = sgen_hash_table_lookup (hash_table, name);
}