diff options
Diffstat (limited to 'degesch.c')
-rw-r--r-- | degesch.c | 66 |
1 files changed, 36 insertions, 30 deletions
@@ -758,6 +758,25 @@ struct weak_ref_link void *user_data; ///< User data }; +static struct weak_ref_link * +weak_ref (struct weak_ref_link **list, destroy_cb_fn cb, void *user_data) +{ + struct weak_ref_link *link = xcalloc (1, sizeof *link); + link->on_destroy = cb; + link->user_data = user_data; + LIST_PREPEND (*list, link); + return link; +} + +static void +weak_unref (struct weak_ref_link **list, struct weak_ref_link **link) +{ + if (*link) + LIST_UNLINK (*list, *link); + free (*link); + *link = NULL; +} + #define REF_COUNTABLE_HEADER \ size_t ref_count; /**< Reference count */ \ struct weak_ref_link *weak_refs; /**< To remove any weak references */ @@ -785,22 +804,11 @@ struct weak_ref_link \ static struct weak_ref_link * \ name ## _weak_ref (struct name *self, destroy_cb_fn cb, void *user_data) \ - { \ - struct weak_ref_link *link = xcalloc (1, sizeof *link); \ - link->on_destroy = cb; \ - link->user_data = user_data; \ - LIST_PREPEND (self->weak_refs, link); \ - return link; \ - } \ + { return weak_ref (&self->weak_refs, cb, user_data); } \ \ static void \ name ## _weak_unref (struct name *self, struct weak_ref_link **link) \ - { \ - if (*link) \ - LIST_UNLINK (self->weak_refs, *link); \ - free (*link); \ - *link = NULL; \ - } + { weak_unref (&self->weak_refs, link); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7266,8 +7274,8 @@ input_hook_insert (struct app_context *ctx, struct input_hook *hook) static bool irc_hook_less (const void *a, const void *b) { - return ((const struct input_hook *) a)->priority - < ((const struct input_hook *) b)->priority; + return ((const struct irc_hook *) a)->priority + < ((const struct irc_hook *) b)->priority; } static void @@ -7394,7 +7402,7 @@ lua_buffer_invalidate (void *object, void *user_data) static void lua_plugin_push_buffer (struct lua_plugin *plugin, struct buffer *buffer) { - struct lua_State *L = plugin->L; + lua_State *L = plugin->L; if (lua_cache_get (L, buffer)) return; @@ -7463,7 +7471,7 @@ lua_server_invalidate (void *object, void *user_data) static void lua_plugin_push_server (struct lua_plugin *plugin, struct server *server) { - struct lua_State *L = plugin->L; + lua_State *L = plugin->L; if (lua_cache_get (L, server)) return; @@ -7518,9 +7526,8 @@ lua_hook_unhook (lua_State *L) } // The hook no longer has to stay alive - lua_pushnil (L); - lua_rawsetp (L, LUA_REGISTRYINDEX, hook); hook->type = XLUA_HOOK_DEFUNCT; + lua_cache_invalidate (L, hook); return 0; } @@ -7598,8 +7605,8 @@ static char * lua_input_hook_filter (struct input_hook *self, struct buffer *buffer, char *input) { - struct lua_hook *hook = (struct lua_hook *) - ((char *) self - offsetof (struct lua_hook, data.input_hook)); + struct lua_hook *hook = + CONTAINER_OF (self, struct lua_hook, data.input_hook); struct lua_plugin *plugin = hook->plugin; lua_State *L = plugin->L; @@ -7607,7 +7614,7 @@ lua_input_hook_filter (struct input_hook *self, struct buffer *buffer, lua_rawgetp (L, LUA_REGISTRYINDEX, hook); // 1: hook lua_getuservalue (L, -1); // Retrieve function - lua_insert (L, -2); // Swap with thet hook + lua_insert (L, -2); // Swap with the hook lua_plugin_push_buffer (plugin, buffer); // 2: buffer lua_pushstring (L, input); // 3: input @@ -7636,8 +7643,8 @@ struct input_hook_vtable lua_input_hook_vtable = static char * lua_irc_hook_filter (struct irc_hook *self, struct server *s, char *message) { - struct lua_hook *hook = (struct lua_hook *) - ((char *) self - offsetof (struct lua_hook, data.irc_hook)); + struct lua_hook *hook = + CONTAINER_OF (self, struct lua_hook, data.irc_hook); struct lua_plugin *plugin = hook->plugin; lua_State *L = plugin->L; @@ -7645,7 +7652,7 @@ lua_irc_hook_filter (struct irc_hook *self, struct server *s, char *message) lua_rawgetp (L, LUA_REGISTRYINDEX, hook); // 1: hook lua_getuservalue (L, -1); // Retrieve function - lua_insert (L, -2); // Swap with thet hook + lua_insert (L, -2); // Swap with the hook lua_plugin_push_server (plugin, s); // 2: server lua_pushstring (L, message); // 3: message @@ -7675,7 +7682,7 @@ static struct lua_hook * lua_plugin_push_hook (struct lua_plugin *plugin, int callback_index, enum lua_hook_type type) { - struct lua_State *L = plugin->L; + lua_State *L = plugin->L; struct lua_hook *hook = lua_newuserdata (L, sizeof *hook); luaL_setmetatable (L, XLUA_HOOK_METATABLE); memset (hook, 0, sizeof *hook); @@ -7687,8 +7694,7 @@ lua_plugin_push_hook lua_setuservalue (L, -2); // Make sure the hook doesn't get garbage collected and return it - lua_pushvalue (L, -1); - lua_rawsetp (L, LUA_REGISTRYINDEX, hook); + lua_cache_store (L, hook, -1); return hook; } @@ -8750,7 +8756,7 @@ mass_channel_mode_mask_list str_vector_init (&v); cstr_split_ignore_empty (a->arguments, ' ', &v); - // XXX: this may be a bit too trivial; we could map also nicknames + // XXX: this may be a bit too trivial; we could also map nicknames // to information from WHO polling or userhost-in-names for (size_t i = 0; i < v.len; i++) { @@ -8987,7 +8993,7 @@ handle_command_whois (struct handler_args *a) irc_send (a->s, "WHOIS %s", a->s->irc_user->nickname); else log_server_error (a->s, a->buffer, "#s: #s", "Can't request info", - "no target given and this buffer is not a PM nor a server"); + "no target given and this buffer is neither a PM nor a server"); return true; } |