updates.
authorPekka Riikonen <priikone@silcnet.org>
Tue, 22 May 2001 19:52:54 +0000 (19:52 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Tue, 22 May 2001 19:52:54 +0000 (19:52 +0000)
CHANGES
apps/silcd/idlist.c
apps/silcd/server.c
lib/silcutil/silchashtable.c

diff --git a/CHANGES b/CHANGES
index 9289df4135006994e6ecea43aee2d73833d635c5..0b94233ac4b7cafdbec2e19db9f0c4471a3dbb8c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,13 @@
+Tue May 22 22:23:49 EEST 2001  Pekka Riikonen <priikone@poseidon.pspt.fi>
+
+       * 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 <priikone@poseidon.pspt.fi>
 
        * Added silc_hash_table_list, silc_hash_table_get and the
index 9cdbc223487148a4f8ab7a050fe8ec7aa453faba..3de0c40e854f5cb86b6c0e5f76be07924d6433af 100644 (file)
@@ -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);
 }
 
index 427bbdf3c74f613f36991320dc2cde049c7d8343..b56817765c41e3e86e58410189dbf60c0e75f38d 100644 (file)
@@ -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--;
index a5994cf4cb51cce0b4ec7f8d6e4cfdf93bc889f1..d5c690942d86fd389b7ae28dfbed3e1ed94b3fe5 100644 (file)
@@ -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;