#include <wizlevels.h>#include <defines.h>#include <events.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | STATISTICS |
| #define | HOME(x) (__PATH__(0)+x) |
| #define | STORE HOME("save/eventd") |
| #define | LOG(x) |
| #define | LOGEVENT(x, y, z) |
| #define | LOGREGISTER(w, x, y, z) |
| #define | LOGUNREGISTER(x, y, z) |
| #define | LOGEVENTFINISH(x, y) |
| #define | DEBUG(x) |
| #define | TICK_RESERVE 300000 |
| #define | TICKSPERCALLBACK 30000 |
| #define | CB_FUN 0 |
| #define | CB_CLOSURE 1 |
| #define | CB_OBJECT 2 |
| #define | P_EID 0 |
| #define | P_TRIGOB 1 |
| #define | P_TRIGOBNAME 2 |
| #define | P_ARGS 3 |
| #define | P_TIME 4 |
| #define | A_EID 0 |
| #define | A_TRIGOB 1 |
| #define | A_TRIGOBNAME 2 |
| #define | A_ARGS 3 |
| #define | A_LISTENERS 4 |
| #define | A_TIME 5 |
Funktionen | |
| protected void | save_me () |
| varargs int | remove (int silent) |
| int | CheckEventID (string eid) |
| protected int | allowed (string eid, object ob, object po) |
| protected int | allowedtrigger (string eid, object trigger) |
| int | RegisterEvent (string eid, string fun, object ob) |
| int | UnregisterEvent (string eid, object ob) |
| varargs int | TriggerEvent (string eid, mixed args) |
| protected void | heart_beat () |
| protected void | create () |
| public void | reset () |
| mapping | QueryEvents () |
| mixed | QueryPending () |
| mixed | QueryActive () |
| mapping | QueryStats () |
| int | UpdateMe (int flag) |
Variablen | |
| mapping | events = ([]) |
| nosave mixed | pending = ({}) |
| nosave mixed | active = ({}) |
| int | lastboot |
| nosave int | updateme |
| nosave mapping | stats = ([]) |
| #define A_ARGS 3 |
Definiert in Zeile 62 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define A_EID 0 |
Definiert in Zeile 59 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define A_LISTENERS 4 |
Definiert in Zeile 63 der Datei eventd.c.
Wird benutzt von heart_beat() und UnregisterEvent().
| #define A_TRIGOB 1 |
Definiert in Zeile 60 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define A_TRIGOBNAME 2 |
Definiert in Zeile 61 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define CB_CLOSURE 1 |
Definiert in Zeile 49 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define CB_OBJECT 2 |
Definiert in Zeile 50 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define DEBUG | ( | x | ) |
if (find_player("zesstra"))\ tell_object(find_player("zesstra"),\ "EDBG: "+x+"\n")
| #define LOG | ( | x | ) |
| #define LOGEVENT | ( | x, | |||
| y, | |||||
| z | ) |
Definiert in Zeile 27 der Datei eventd.c.
Wird benutzt von TriggerEvent().
| #define LOGREGISTER | ( | w, | |||
| x, | |||||
| y, | |||||
| z | ) |
Definiert in Zeile 30 der Datei eventd.c.
Wird benutzt von RegisterEvent().
| #define LOGUNREGISTER | ( | x, | |||
| y, | |||||
| z | ) |
Definiert in Zeile 33 der Datei eventd.c.
Wird benutzt von UnregisterEvent().
| #define P_ARGS 3 |
Definiert in Zeile 55 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define P_EID 0 |
Definiert in Zeile 52 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define P_TIME 4 |
Definiert in Zeile 56 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define P_TRIGOB 1 |
Definiert in Zeile 53 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define P_TRIGOBNAME 2 |
Definiert in Zeile 54 der Datei eventd.c.
Wird benutzt von heart_beat().
| #define TICK_RESERVE 300000 |
Definiert in Zeile 44 der Datei eventd.c.
Wird benutzt von heart_beat().
| protected int allowed | ( | string | eid, | |
| object | ob, | |||
| object | po | |||
| ) |
| protected int allowedtrigger | ( | string | eid, | |
| object | trigger | |||
| ) |
Definiert in Zeile 119 der Datei eventd.c.
Wird benutzt von TriggerEvent().

| int CheckEventID | ( | string | eid | ) |
| protected void create | ( | ) |
Definiert in Zeile 269 der Datei eventd.c.
00269 { 00270 seteuid(getuid(ME)); 00271 restore_object(STORE); 00272 if (lastboot != __BOOT_TIME__) { 00273 // Oh. Reboot war... Alle Events wegschmeissen (es koennten zwar die 00274 // Eventanmeldungen von BPs ueberleben, aber auch die sollen sich lieber 00275 // im create() anmelden.) 00276 events=([]); 00277 lastboot=__BOOT_TIME__;; 00278 } 00279 set_heart_beat(0); 00280 LOG("Event-Dispatcher loaded"); 00281 }
| protected void heart_beat | ( | ) |
Definiert in Zeile 188 der Datei eventd.c.
Benutzt A_ARGS, A_EID, A_LISTENERS, A_TRIGOB, A_TRIGOBNAME, active, CB_CLOSURE, CB_OBJECT, cl, events, m_delete(), P_ARGS, P_EID, P_TIME, P_TRIGOB, P_TRIGOBNAME, pending, query_closure_object() und TICK_RESERVE.
00188 { 00189 // solange ueber active und pending laufen, bis keine Ticks mehr da sind, 00190 // bzw. in der Schleife abgebrochen wird, weil keine Events mehr da sind. 00191 while(get_eval_cost() > TICK_RESERVE) { 00192 // HB abschalten, wenn nix zu tun ist. 00193 if (!sizeof(active)) { 00194 if (!sizeof(pending)) { 00195 set_heart_beat(0); 00196 return; 00197 } 00198 // scheint noch min. ein Eintrag in pending zu sein, nach active kopieren, 00199 // plus die Callback-Infos aus events 00200 active=({pending[0][P_EID], 00201 pending[0][P_TRIGOB],pending[0][P_TRIGOBNAME], 00202 pending[0][P_ARGS], 00203 deep_copy(events[pending[0][P_EID]]), 00204 pending[0][P_TIME] }); 00205 00206 if (sizeof(pending)>1) 00207 pending=pending[1..]; // und aus pending erstmal loeschen. ;-) 00208 else 00209 pending=({}); 00210 //DEBUG(sprintf("Pending: %O",pending)); 00211 //DEBUG(sprintf("Active: %O",active)); 00212 } 00213 // jetzte den aktiven Event abarbeiten. 00214 // Infos aus active holen... 00215 string eid=active[A_EID]; 00216 object trigob=active[A_TRIGOB]; 00217 string trigobname=active[A_TRIGOBNAME]; 00218 mixed args=active[A_ARGS]; 00219 mapping listeners=active[A_LISTENERS]; 00220 // und ueber alle Listener iterieren 00221 foreach(string obname, string fun, closure cl, object listener: 00222 listeners) { 00223 // erst pruefen, ob noch genug Ticks da sind. wenn nicht, gehts im 00224 // naechsten HB weiter. 00225 if (get_eval_cost() < TICK_RESERVE) { 00226 return; 00227 } 00228 // wenn Closure und/oder zugehoeriges Objekt nicht existieren, versuchen 00229 // wir erstmal, es wiederzufinden. ;-) 00230 if (!objectp(query_closure_object(cl))) { 00231 if (objectp(listener=find_object(obname)) && 00232 closurep(cl=symbol_function(fun,listener))) { 00233 //geklappt, auch in events wieder ergaenzen 00234 events[eid][obname,CB_CLOSURE]=cl; 00235 events[eid][obname,CB_OBJECT]=listener; 00236 } 00237 else { 00238 // Objekt nicht gefunden oder Closure nicht erzeugbar, austragen 00239 efun::m_delete(listeners,obname); 00240 // und aus events austragen. 00241 efun::m_delete(events[eid],obname); 00242 // und naechster Durchgang 00243 continue; 00244 } 00245 } 00246 // Objekt noch da, Closure wird als ausfuehrbar betrachtet. 00247 catch(limited(#'funcall,({TICKSPERCALLBACK}),cl,eid,trigob,args);publish); 00248 // fertig mit diesem Objekt. 00249 efun::m_delete(listeners,obname); 00250 } 00251 // Statistik? Differenzen zwische Erledigungszeit und Eintragszeit bilden 00252 // die Keys, die Values werden einfach hochgezaehlt. 00253 #ifdef STATISTICS 00254 stats[time()-active[A_TIME]]++; 00255 #endif // STATISTICS 00256 // ok, fertig mit active. 00257 active=({}); 00258 //DEBUG(sprintf("Fertig: %O %O",eid, trigobname)); 00259 LOGEVENTFINISH(eid,trigobname); 00260 } // while(get_eval_cost() > TICK_RESERVE) 00261 // Soll dies Ding neugeladen werden? Wenn ja, Selbstzerstoerung, wenn keine 00262 // Events mehr da sind. 00263 if (updateme && !sizeof(active) && !sizeof(pending)) { 00264 DEBUG(sprintf("Update requested\n")); 00265 remove(1); 00266 } 00267 }

| mixed QueryActive | ( | ) |
| mapping QueryEvents | ( | ) |
| mixed QueryPending | ( | ) |
| mapping QueryStats | ( | ) |
| int RegisterEvent | ( | string | eid, | |
| string | fun, | |||
| object | ob | |||
| ) |
Definiert in Zeile 127 der Datei eventd.c.
Benutzt allowed, cl, events, LOGREGISTER und save_me().
00127 { 00128 object po; 00129 if (!stringp(eid) || !stringp(fun) || 00130 !objectp(ob) || !objectp(po=previous_object())) 00131 return -1; 00132 if (!allowed(eid, ob, po)) return -2; 00133 closure cl=symbol_function(fun,ob); 00134 if (!closurep(cl)) 00135 return -3; 00136 if (!mappingp(events[eid])) 00137 events[eid]=m_allocate(1,3); // 3 Werte pro Key 00138 events[eid]+=([object_name(ob):fun;cl;ob]); 00139 if (find_call_out(#'save_me)==-1) 00140 call_out(#'save_me,15); 00141 LOGREGISTER(ob,fun,eid,po); 00142 return 1; 00143 }

| varargs int remove | ( | int | silent | ) |
| public void reset | ( | void | ) |
| protected void save_me | ( | ) |
Definiert in Zeile 284 der Datei eventd.c.
00284 { 00285 save_object(STORE); 00286 }
| varargs int TriggerEvent | ( | string | eid, | |
| mixed | args | |||
| ) |
Definiert in Zeile 174 der Datei eventd.c.
Benutzt allowedtrigger(), events, LOGEVENT und pending.
00174 { 00175 object trigger; 00176 if (!stringp(eid) || 00177 !objectp(trigger=previous_object())) 00178 return -1; 00179 if (!allowedtrigger(eid, trigger)) return -2; 00180 if (!member(events,eid)) return -3; 00181 pending+=({ ({eid,trigger,object_name(trigger), args, time()}) }); 00182 set_heart_beat(1); 00183 LOGEVENT(eid,trigger,args); 00184 //DEBUG(sprintf("%O",pending)); 00185 return 1; 00186 }

| int UnregisterEvent | ( | string | eid, | |
| object | ob | |||
| ) |
Definiert in Zeile 150 der Datei eventd.c.
Benutzt A_LISTENERS, active, events, LOGUNREGISTER, m_delete() und save_me().
00150 { 00151 object po; 00152 if (!stringp(eid) || !objectp(ob) || 00153 !objectp(po=previous_object()) || !mappingp(events[eid])) 00154 return -1; 00155 string oname=object_name(ob); 00156 if (!member(events[eid],oname)) 00157 return -2; 00158 efun::m_delete(events[eid],oname); 00159 if (!sizeof(events[eid])) 00160 efun::m_delete(events,eid); 00161 // aus aktivem Event austragen, falls es drin sein sollte. 00162 if (sizeof(active) && member(active,eid) 00163 && member(active[eid,A_LISTENERS], oname)) { 00164 efun::m_delete(active[eid,A_LISTENERS],oname); 00165 } 00166 if (find_call_out(#'save_me)==-1) 00167 call_out(#'save_me,15); 00168 LOGUNREGISTER(ob, eid, po); 00169 return 1; 00170 }

| int UpdateMe | ( | int | flag | ) |
| nosave mixed active = ({}) |
Definiert in Zeile 80 der Datei eventd.c.
Wird benutzt von activate(), add(), heart_beat(), Query_Keys(), ReadNewQuest(), renew_player_object(), setlist(), swho() und UnregisterEvent().
| mapping events = ([]) |
Definiert in Zeile 71 der Datei eventd.c.
Wird benutzt von CheckEventID(), heart_beat(), RegisterEvent(), TriggerEvent() und UnregisterEvent().
| nosave mixed pending = ({}) |
Definiert in Zeile 75 der Datei eventd.c.
Wird benutzt von heart_beat(), Send(), TriggerEvent() und udp_www().
| nosave mapping stats = ([]) |
Definiert in Zeile 90 der Datei eventd.c.
Wird benutzt von is_bank(), scan_obj() und stat().
1.6.3