63 lines
2.0 KiB
Plaintext
63 lines
2.0 KiB
Plaintext
diff a/code/datums/callback.dm b/code/datums/callback.dm (rejected hunks)
|
|
@@ -100,60 +100,3 @@
|
|
if (object == GLOBAL_PROC)
|
|
return call(delegate)(arglist(calling_arguments))
|
|
return call(object, delegate)(arglist(calling_arguments))
|
|
-
|
|
-
|
|
-/datum/callback_select
|
|
- var/list/finished
|
|
- var/pendingcount
|
|
- var/total
|
|
-
|
|
-/datum/callback_select/New(count, savereturns)
|
|
- total = count
|
|
- if (savereturns)
|
|
- finished = new(count)
|
|
-
|
|
-
|
|
-/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE)
|
|
- set waitfor = FALSE
|
|
- if (!callback || !istype(callback))
|
|
- //This check only exists because the alternative is callback_select would block forever if given invalid data
|
|
- CRASH("invalid callback passed to invoke_callback")
|
|
- if (!length(callback_args))
|
|
- callback_args = list()
|
|
- pendingcount++
|
|
- debug_usr("calling callback")
|
|
- var/rtn = callback.Invoke(arglist(callback_args))
|
|
- debug_usr("callback returned")
|
|
- pendingcount--
|
|
- if (savereturn)
|
|
- finished[index] = rtn
|
|
-
|
|
-
|
|
-
|
|
-
|
|
-//runs a list of callbacks asynchronously, returning once all of them return.
|
|
-//callbacks can be repeated.
|
|
-//callbacks-args is a optional list of argument lists, in the same order as the callbacks,
|
|
-// the inner lists will be sent to the callbacks when invoked() as additional args.
|
|
-//can optionly save and return a list of return values, in the same order as the original list of callbacks
|
|
-//resolution is the number of byond ticks between checks.
|
|
-/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1)
|
|
- if (!callbacks)
|
|
- return
|
|
- var/count = length(callbacks)
|
|
- if (!count)
|
|
- return
|
|
- if (!callback_args)
|
|
- callback_args = list()
|
|
-
|
|
- callback_args.len = count
|
|
-
|
|
- var/datum/callback_select/CS = new(count, savereturns)
|
|
- for (var/i in 1 to count)
|
|
- CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns)
|
|
- debug_usr("starting callbacks: [CS.pendingcount]")
|
|
- while(CS.pendingcount)
|
|
- debug_usr("callbacks: [CS.pendingcount]")
|
|
- sleep(resolution*world.tick_lag)
|
|
- return CS.finished
|
|
-
|