From ee2d310105a20fe8b07ce042395187364e1bd58e Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Tue, 22 May 2001 19:52:54 +0000 Subject: [PATCH] updates. --- CHANGES | 10 ++++++++++ apps/silcd/idlist.c | 2 +- apps/silcd/server.c | 30 ++++++++++++++---------------- lib/silcutil/silchashtable.c | 31 +++++++++++++++++++++---------- 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/CHANGES b/CHANGES index 9289df41..0b94233a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,13 @@ +Tue May 22 22:23:49 EEST 2001 Pekka Riikonen + + * Do not rehash if the new size is same as the old size of the + hash table, in the silc_hash_table_rehash*. The affected file + lib/silcutil/silchashtable.c. + + * Replaced hash_table_del_by_context calls from the server + (when channel->user_list and client->channels) to the + hash_table_del as it is sufficient and faster. + Tue May 22 17:27:16 EEST 2001 Pekka Riikonen * Added silc_hash_table_list, silc_hash_table_get and the diff --git a/apps/silcd/idlist.c b/apps/silcd/idlist.c index 9cdbc223..3de0c40e 100644 --- a/apps/silcd/idlist.c +++ b/apps/silcd/idlist.c @@ -587,7 +587,7 @@ static void silc_idlist_del_channel_foreach(void *key, void *context, /* Remove the context from the client's channel hash table as that table and channel's user_list hash table share this same context. */ - silc_hash_table_del_by_context(chl->client->channels, chl->channel, chl); + silc_hash_table_del(chl->client->channels, chl->channel); silc_free(chl); } diff --git a/apps/silcd/server.c b/apps/silcd/server.c index 427bbdf3..b5681776 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -2503,12 +2503,11 @@ void silc_server_remove_from_channels(SilcServer server, channel = chl->channel; /* Remove channel from client's channel list */ - silc_hash_table_del_by_context(client->channels, channel, chl); + silc_hash_table_del(client->channels, channel); /* Remove channel if there is no users anymore */ if (server->server_type == SILC_ROUTER && silc_hash_table_count(channel->user_list) < 2) { - server->stat.my_channels--; if (channel->rekey) silc_task_unregister_by_context(server->timeout_queue, channel->rekey); @@ -2522,21 +2521,22 @@ void silc_server_remove_from_channels(SilcServer server, silc_hash_table_list(channel->user_list, &htl2); while (silc_hash_table_get(&htl2, NULL, (void *)&chl2)) { - silc_hash_table_del_by_context(chl2->client->channels, channel, chl); - silc_hash_table_del_by_context(channel->user_list, - chl2->client, chl); + silc_hash_table_del(chl2->client->channels, channel); + silc_hash_table_del(channel->user_list, chl2->client); silc_free(chl2); } continue; } + /* Remove the channel entry */ if (!silc_idlist_del_channel(server->local_list, channel)) silc_idlist_del_channel(server->global_list, channel); + server->stat.my_channels--; continue; } /* Remove client from channel's client list */ - silc_hash_table_del_by_context(channel->user_list, chl->client, chl); + silc_hash_table_del(channel->user_list, chl->client); silc_free(chl); server->stat.my_chanclients--; @@ -2571,14 +2571,14 @@ void silc_server_remove_from_channels(SilcServer server, silc_hash_table_list(channel->user_list, &htl2); while (silc_hash_table_get(&htl2, NULL, (void *)&chl2)) { - silc_hash_table_del_by_context(chl2->client->channels, channel, chl); - silc_hash_table_del_by_context(channel->user_list, - chl2->client, chl); + silc_hash_table_del(chl2->client->channels, channel); + silc_hash_table_del(channel->user_list, chl2->client); silc_free(chl2); } continue; } + /* Remove the channel entry */ if (!silc_idlist_del_channel(server->local_list, channel)) silc_idlist_del_channel(server->global_list, channel); server->stat.my_channels--; @@ -2622,7 +2622,6 @@ int silc_server_remove_from_one_channel(SilcServer server, SilcClientEntry client, int notify) { - SilcChannelEntry ch; SilcChannelClientEntry chl; SilcBuffer clidp; @@ -2637,10 +2636,9 @@ int silc_server_remove_from_one_channel(SilcServer server, the channel's user list. */ clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT); - ch = chl->channel; /* Remove channel from client's channel list */ - silc_hash_table_del_by_context(client->channels, chl->channel, chl); + silc_hash_table_del(client->channels, chl->channel); /* Remove channel if there is no users anymore */ if (server->server_type == SILC_ROUTER && @@ -2655,7 +2653,7 @@ int silc_server_remove_from_one_channel(SilcServer server, } /* Remove client from channel's client list */ - silc_hash_table_del_by_context(channel->user_list, chl->client, chl); + silc_hash_table_del(channel->user_list, chl->client); silc_free(chl); server->stat.my_chanclients--; @@ -2689,14 +2687,14 @@ int silc_server_remove_from_one_channel(SilcServer server, silc_hash_table_list(channel->user_list, &htl2); while (silc_hash_table_get(&htl2, NULL, (void *)&chl2)) { - silc_hash_table_del_by_context(chl2->client->channels, channel, chl); - silc_hash_table_del_by_context(channel->user_list, - chl2->client, chl); + silc_hash_table_del(chl2->client->channels, channel); + silc_hash_table_del(channel->user_list, chl2->client); silc_free(chl2); } return FALSE; } + /* Remove the channel entry */ if (!silc_idlist_del_channel(server->local_list, channel)) silc_idlist_del_channel(server->global_list, channel); server->stat.my_channels--; diff --git a/lib/silcutil/silchashtable.c b/lib/silcutil/silchashtable.c index a5994cf4..d5c69094 100644 --- a/lib/silcutil/silchashtable.c +++ b/lib/silcutil/silchashtable.c @@ -723,17 +723,24 @@ void silc_hash_table_rehash(SilcHashTable ht, uint32 new_size) SilcHashTableEntry *table, e, tmp; uint32 table_size, size_index; + if (new_size) + silc_hash_table_primesize(new_size, &size_index); + else + silc_hash_table_primesize(ht->entry_count, &size_index); + + if (size_index == ht->table_size) + return; + + SILC_HT_DEBUG(("Rehashing")); + /* Take old hash table */ table = ht->table; table_size = ht->table_size; /* Allocate new table */ - ht->table = silc_calloc(new_size ? silc_hash_table_primesize(new_size, - &size_index) : - silc_hash_table_primesize(ht->entry_count, - &size_index), - sizeof(*ht->table)); + ht->table = silc_calloc(primesize[size_index], sizeof(*ht->table)); ht->table_size = size_index; + ht->entry_count = 0; /* Rehash */ for (i = 0; i < primesize[table_size]; i++) { @@ -762,6 +769,14 @@ void silc_hash_table_rehash_ext(SilcHashTable ht, uint32 new_size, SilcHashTableEntry *table, e, tmp; uint32 table_size, size_index; + if (new_size) + silc_hash_table_primesize(new_size, &size_index); + else + silc_hash_table_primesize(ht->entry_count, &size_index); + + if (size_index == ht->table_size) + return; + SILC_HT_DEBUG(("Rehashing")); /* Take old hash table */ @@ -769,11 +784,7 @@ void silc_hash_table_rehash_ext(SilcHashTable ht, uint32 new_size, table_size = ht->table_size; /* Allocate new table */ - ht->table = silc_calloc(new_size ? silc_hash_table_primesize(new_size, - &size_index) : - silc_hash_table_primesize(ht->entry_count, - &size_index), - sizeof(*ht->table)); + ht->table = silc_calloc(primesize[size_index], sizeof(*ht->table)); ht->table_size = size_index; ht->entry_count = 0; -- 2.24.0