The branch, hooks has been updated
via 801f36c25dae91f64554f5e4f1bc22bfa731b5b6 (commit)
via 92cec78b4b2f72b6dbed075f89ebb7179fa00b63 (commit)
from b2bfe4a2d482ca7c6eb737493c9e0f3d02eb54b1 (commit)
- Log -----------------------------------------------------------------
commit 801f36c25dae91f64554f5e4f1bc22bfa731b5b6
Author: Thomas Adam <[email protected]>
Commit: Thomas Adam <[email protected]>
Don't run notifys unconditionally
Don't always run notifications; only do so on those clients accepting
CONTROL.
---
notify.c | 13 +++++++++++++
tmux.h | 3 +++
2 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/notify.c b/notify.c
index ed6c67d..759ff34 100644
--- a/notify.c
+++ b/notify.c
@@ -134,10 +134,23 @@ void
notify_drain(void)
{
struct notify_entry *ne, *ne1;
+ struct client *c = NULL, *cloop = NULL;
+ u_int i;
if (notify_disabled)
return;
+ /* If no clients want notifications, stop here! */
+ for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
+ cloop = ARRAY_ITEM(&clients, i);
+ if (!CONTROL_SHOULD_NOTIFY_CLIENT(cloop))
+ continue;
+ c = cloop;
+ }
+
+ if (c == NULL)
+ return;
+
TAILQ_FOREACH_SAFE(ne, ¬ify_queue, entry, ne1) {
switch (ne->type) {
case NOTIFY_WINDOW_LAYOUT_CHANGED:
diff --git a/tmux.h b/tmux.h
index 062df70..1707e1e 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1607,6 +1607,9 @@ void mode_key_init(struct mode_key_data *, struct
mode_key_tree *);
enum mode_key_cmd mode_key_lookup(struct mode_key_data *, int, const char **);
/* notify.c */
+#define CONTROL_SHOULD_NOTIFY_CLIENT(c) \
+ ((c) != NULL && ((c)->flags & CLIENT_CONTROL))
+
void notify_enable(void);
void notify_disable(void);
void notify_input(struct window_pane *, struct evbuffer *);
commit 92cec78b4b2f72b6dbed075f89ebb7179fa00b63
Author: Thomas Adam <[email protected]>
Commit: Thomas Adam <[email protected]>
notify: Avoid double-free
Before making notify support hooks, notify_drain() was responsible solely
for free()ing the notify_event. This was fine, since there was only ever a
single point of entry for it.
But in making notify support hooks, running the commands via
cmdq_hooks_run() now means the free() happens twice: once from
notify_drain() normally, and the other as a result of finish off running
cmdq_run().
To stop this happening, add a flag to the notify_event structure indicating
when it needs to be free()d and only do it then.
---
notify.c | 14 +++++++++-----
1 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/notify.c b/notify.c
index 6968a60..ed6c67d 100644
--- a/notify.c
+++ b/notify.c
@@ -55,6 +55,7 @@ struct notify_entry {
struct client *client;
struct session *session;
struct window *window;
+ int do_free;
TAILQ_ENTRY(notify_entry) entry;
};
@@ -64,16 +65,16 @@ int notify_disabled;
void notify_drain(void);
void notify_add(enum notify_type, struct client *, struct session *,
struct window *);
-void notify_run_hook(const struct notify_entry *);
+void notify_run_hook(struct notify_entry *);
void
-notify_run_hook(const struct notify_entry *ne)
+notify_run_hook(struct notify_entry *ne)
{
struct hooks *hooks;
const char *hook_name = NULL;
u_int i;
- for(i = 0; i < nitems(notify_hooks_info); i++) {
+ for (i = 0; i < nitems(notify_hooks_info); i++) {
if (notify_hooks_info[i].type == ne->type) {
hook_name = notify_hooks_info[i].hook_name;
break;
@@ -86,6 +87,7 @@ notify_run_hook(const struct notify_entry *ne)
hooks = ne->session != NULL ? &ne->session->hooks : &global_hooks;
/* Run the hooked commands */
+ ne->do_free = 1;
cmdq_hooks_run(hooks, NULL, hook_name, NULL);
}
@@ -117,6 +119,7 @@ notify_add(enum notify_type type, struct client *c, struct
session *s,
ne->client = c;
ne->session = s;
ne->window = w;
+ ne->do_free = 0;
TAILQ_INSERT_TAIL(¬ify_queue, ne, entry);
if (c != NULL)
@@ -171,9 +174,10 @@ notify_drain(void)
window_remove_ref(ne->window);
TAILQ_REMOVE(¬ify_queue, ne, entry);
- notify_run_hook(ne);
- free(ne);
+ if (ne->do_free)
+ free(ne);
+ notify_run_hook(ne);
}
}
-----------------------------------------------------------------------
Summary of changes:
notify.c | 27 ++++++++++++++++++++++-----
tmux.h | 3 +++
2 files changed, 25 insertions(+), 5 deletions(-)
hooks/post-receive
--
tmux
------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs