Bump liberty, fix map iterators

This commit is contained in:
Přemysl Eric Janouch 2015-07-14 22:25:30 +02:00
parent 955552f4fa
commit d6a4ca1434
4 changed files with 18 additions and 32 deletions

View File

@ -70,17 +70,6 @@ str_vector_find (const struct str_vector *v, const char *s)
return -1; return -1;
} }
static void *
str_map_steal (struct str_map *self, const char *key)
{
void *value = str_map_find (self, key);
void (*free_backup) (void *) = self->free;
self->free = NULL;
str_map_set (self, key, NULL);
self->free = free_backup;
return value;
}
// --- Logging ----------------------------------------------------------------- // --- Logging -----------------------------------------------------------------
static void static void

View File

@ -6567,14 +6567,12 @@ server_remove (struct app_context *ctx, struct server *s)
if (s->buffer) if (s->buffer)
buffer_remove_safe (ctx, s->buffer); buffer_remove_safe (ctx, s->buffer);
struct str_map_iter iter; struct str_map_unset_iter iter;
str_map_iter_init (&iter, &s->irc_buffer_map); str_map_unset_iter_init (&iter, &s->irc_buffer_map);
struct buffer *buffer, *next = str_map_iter_next (&iter); struct buffer *buffer;
for (buffer = next; buffer; buffer = next) while ((buffer = str_map_unset_iter_next (&iter)))
{
next = str_map_iter_next (&iter);
buffer_remove_safe (ctx, buffer); buffer_remove_safe (ctx, buffer);
} str_map_unset_iter_free (&iter);
hard_assert (!s->buffer); hard_assert (!s->buffer);
hard_assert (!s->irc_buffer_map.len); hard_assert (!s->irc_buffer_map.len);

25
kike.c
View File

@ -870,18 +870,18 @@ client_unregister (struct client *c, const char *reason)
irc_send_to_roommates (c, message); irc_send_to_roommates (c, message);
free (message); free (message);
struct str_map_iter iter; struct str_map_unset_iter iter;
str_map_iter_init (&iter, &c->ctx->channels); str_map_unset_iter_init (&iter, &c->ctx->channels);
struct channel *chan, *next = str_map_iter_next (&iter); struct channel *chan;
for (chan = next; chan; chan = next) while ((chan = str_map_unset_iter_next (&iter)))
{ {
next = str_map_iter_next (&iter);
struct channel_user *user; struct channel_user *user;
if (!(user = channel_get_user (chan, c))) if (!(user = channel_get_user (chan, c)))
continue; continue;
channel_remove_user (chan, user); channel_remove_user (chan, user);
irc_channel_destroy_if_empty (c->ctx, chan); irc_channel_destroy_if_empty (c->ctx, chan);
} }
str_map_unset_iter_free (&iter);
client_add_to_whowas (c); client_add_to_whowas (c);
@ -2590,16 +2590,15 @@ irc_try_part (struct client *c, const char *channel_name, const char *reason)
static void static void
irc_part_all_channels (struct client *c) irc_part_all_channels (struct client *c)
{ {
struct str_map_iter iter; // We have to be careful here, the channel might get destroyed
str_map_iter_init (&iter, &c->ctx->channels); struct str_map_unset_iter iter;
struct channel *chan, *next = str_map_iter_next (&iter); str_map_unset_iter_init (&iter, &c->ctx->channels);
for (chan = next; chan; chan = next)
{ struct channel *chan;
// We have to be careful here, the channel might get destroyed while ((chan = str_map_unset_iter_next (&iter)))
next = str_map_iter_next (&iter);
if (channel_get_user (chan, c)) if (channel_get_user (chan, c))
irc_try_part (c, chan->name, NULL); irc_try_part (c, chan->name, NULL);
} str_map_unset_iter_free (&iter);
} }
static void static void

@ -1 +1 @@
Subproject commit 7fa873fb964156e71a00174f50e3f4bc343bcc04 Subproject commit 0058c1f457a954fbdfc63f458fa00c3c5a700f69