Abfrage gueltiger Consumers hinzugefuegt.
Mittels HHasConsumers() kann nun abgefragt werden, wie viele
gueltige Konsumenten ein (oder mehrere) Hooks haben.
Kann z.B. im clean_up() genutzt werden um zu entscheiden,
ob jemand auf den Hookprovider angewiesen ist.
Intern laeuft in HHasConsumers() ein CleanHookMapping(), d.h.
als Seiteneffekt wird die interne Datenstruktur aufgeraeumt
und von kaputten/abgelaufenen Eintraegen befreit.
Change-Id: I34cbb83fb42541f209c0ff271728e099cd60a699
diff --git a/std/hook_provider.c b/std/hook_provider.c
index 00b8ca3..321ea8a 100644
--- a/std/hook_provider.c
+++ b/std/hook_provider.c
@@ -43,7 +43,7 @@
*/
private nosave mapping hookMapping=([]);
-protected void CleanHookMapping(int *hookids);
+protected int CleanHookMapping(int *hookids);
// Debugging - ggf. ueberschreiben
protected int h_dbg() {return 0;}
@@ -86,12 +86,16 @@
}
// clean internal hook data structures of stale hook consumers.
-protected void CleanHookMapping(int *hookids){
+// returns the number of valid consumers left.
+protected int CleanHookMapping(int *hookids)
+{
// hooks enthaelt die aufzuraeumenden Hooks. Wenn kein Array -> alle Hooks
if (!pointerp(hookids))
hookids=m_indices(hookMapping);
- foreach(int hookid : hookids) { // alle Hooks
+ int count;
+ foreach(int hookid : hookids)
+ { // alle Hooks
struct hook_s hooks = hookMapping[hookid];
if (!structp(hooks))
continue;
@@ -101,16 +105,29 @@
// Yeah - compute struct lookup at runtime... ;-)
struct hook_entry_s *consumers = hooks->(consumertype);
// Hookeintraege / Consumer
- foreach(struct hook_entry_s h : &consumers) {
+ foreach(struct hook_entry_s h : &consumers)
+ {
// alle abgelaufenen Eintraege oder solche mit zerstoerten Objekten
- // nullen
+ // nullen und die anderen/gueltigen zaehlen.
if (!h->cl || h->endtime < time() )
h = 0;
+ else
+ ++count;
}
// 0 noch rauswerfen.
hooks->(consumertype) -= ({0});
}
}
+ return count;
+}
+
+// Returns the number of valid consumers for the given hooks (or all, if
+// hooks==0).
+// Side effect: Cleans the internal structures and removes any stale
+// consumers.
+public varargs int HHasConsumers(int *hookids)
+{
+ return CleanHookMapping(hookids);
}
protected void offerHook(int hookid, int offerstate)