1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-01 11:32:48 -05:00

Add a general way to request an immediate top-level callback.

This is a little like schedule_timer, in that the callback you provide
will be run from the top-level message loop of whatever application
you're in; but unlike the timer mechanism, it will happen
_immediately_.

The aim is to provide a general way to avoid re-entrance of code, in
cases where just _doing_ the thing you want done is liable to trigger
a confusing recursive call to the function in which you came to the
decision to do it; instead, you just request a top-level callback at
the message loop's earliest convenience, and do it then.

[originally from svn r10019]
This commit is contained in:
Simon Tatham
2013-08-17 16:06:08 +00:00
parent 883641845f
commit 75c79e318f
9 changed files with 130 additions and 6 deletions

25
putty.h
View File

@ -1390,6 +1390,31 @@ void expire_timer_context(void *ctx);
int run_timers(unsigned long now, unsigned long *next);
void timer_change_notify(unsigned long next);
/*
* Exports from callback.c.
*
* This provides a method of queuing function calls to be run at the
* earliest convenience from the top-level event loop. Use it if
* you're deep in a nested chain of calls and want to trigger an
* action which will probably lead to your function being re-entered
* recursively if you just call the initiating function the normal
* way.
*
* Most front ends run the queued callbacks by simply calling
* run_toplevel_callbacks() after handling each event in their
* top-level event loop. However, if a front end doesn't have control
* over its own event loop (e.g. because it's using GTK) then it can
* instead request notifications when a callback is available, so that
* it knows to ask its delegate event loop to do the same thing.
*/
typedef void (*toplevel_callback_fn_t)(void *ctx);
void queue_toplevel_callback(toplevel_callback_fn_t fn, void *ctx);
void run_toplevel_callbacks(void);
typedef void (*toplevel_callback_notify_fn_t)(void *frontend);
void request_callback_notifications(toplevel_callback_notify_fn_t notify,
void *frontend);
/*
* Define no-op macros for the jump list functions, on platforms that
* don't support them. (This is a bit of a hack, and it'd be nicer to