mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-09 00:13:55 +00:00
* Adds SIGNAL_HANDLER and SIGNAL_HANDLER_DOES_SLEEP to prevent signal callbacks from blocking (#52761) Adds SIGNAL_HANDLER, a macro that sets SHOULD_NOT_SLEEP(TRUE). This should ideally be required on all new signal callbacks. Adds BLOCKING_SIGNAL_HANDLER, a macro that does nothing except symbolize "this is an older signal that didn't necessitate a code rewrite". It should not be allowed for new work. This comes from discussion around #52735, which yields by calling input, and (though it sets the return type beforehand) will not properly return the flag to prevent attack from slapping. To fix 60% of the yielding cases, WrapAdminProcCall no longer waits for another admin's proc call to finish. I'm not an admin, so I don't know how many behinds this has saved, but if this is problematic for admins I can just make it so that it lets you do it anyway. I'm not sure what the point of this babysitting was anyway. Requested by @optimumtact. Changelog cl admin: Calling a proc while another admin is calling one will no longer wait for the first to finish. You will simply just have to call it again. /cl * Adds SIGNAL_HANDLER and SIGNAL_HANDLER_DOES_SLEEP to prevent signal callbacks from blocking Co-authored-by: Jared-Fogle <35135081+Jared-Fogle@users.noreply.github.com>
24 lines
1.3 KiB
Plaintext
24 lines
1.3 KiB
Plaintext
/// Used to trigger signals and call procs registered for that signal
|
|
/// The datum hosting the signal is automaticaly added as the first argument
|
|
/// Returns a bitfield gathered from all registered procs
|
|
/// Arguments given here are packaged in a list and given to _SendSignal
|
|
#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) )
|
|
|
|
#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) )
|
|
|
|
/// Signifies that this proc is used to handle signals.
|
|
/// Every proc you pass to RegisterSignal must have this.
|
|
#define SIGNAL_HANDLER SHOULD_NOT_SLEEP(TRUE)
|
|
|
|
/// Signifies that this proc is used to handle signals, but also sleeps.
|
|
/// Do not use this for new work.
|
|
#define SIGNAL_HANDLER_DOES_SLEEP
|
|
|
|
/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments
|
|
#define AddElement(arguments...) _AddElement(list(##arguments))
|
|
/// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments
|
|
#define RemoveElement(arguments...) _RemoveElement(list(##arguments))
|
|
|
|
/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments
|
|
#define AddComponent(arguments...) _AddComponent(list(##arguments))
|