eventd.c-Dateireferenz

#include <wizlevels.h>
#include <defines.h>
#include <events.h>
Include-Abhängigkeitsdiagramm für eventd.c:

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 = ([])

Makro-Dokumentation

#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_TIME   5

Definiert in Zeile 64 der Datei eventd.c.

#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_FUN   0

Definiert in Zeile 48 der Datei eventd.c.

#define CB_OBJECT   2

Definiert in Zeile 50 der Datei eventd.c.

Wird benutzt von heart_beat().

#define DEBUG ( x   ) 
Wert:
if (find_player("zesstra"))\
          tell_object(find_player("zesstra"),\
                      "EDBG: "+x+"\n")

Definiert in Zeile 39 der Datei eventd.c.

#define HOME ( x   )     (__PATH__(0)+x)

Definiert in Zeile 19 der Datei eventd.c.

#define LOG ( x   ) 
Wert:
log_file("EVENTS", sprintf(\
      "[%s] %s\n",dtime(time()),x))

Definiert in Zeile 23 der Datei eventd.c.

Wird benutzt von cleanup_data(), create() und reset().

#define LOGEVENT ( x,
y,
 ) 

Definiert in Zeile 27 der Datei eventd.c.

Wird benutzt von TriggerEvent().

#define LOGEVENTFINISH ( x,
 ) 

Definiert in Zeile 36 der Datei eventd.c.

#define LOGREGISTER ( w,
x,
y,
 ) 

Definiert in Zeile 30 der Datei eventd.c.

Wird benutzt von RegisterEvent().

#define LOGUNREGISTER ( x,
y,
 ) 

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 STATISTICS

Definiert in Zeile 17 der Datei eventd.c.

#define STORE   HOME("save/eventd")

Definiert in Zeile 20 der Datei eventd.c.

#define TICK_RESERVE   300000

Definiert in Zeile 44 der Datei eventd.c.

Wird benutzt von heart_beat().

#define TICKSPERCALLBACK   30000

Definiert in Zeile 45 der Datei eventd.c.


Dokumentation der Funktionen

protected int allowed ( string  eid,
object  ob,
object  po 
)

Definiert in Zeile 110 der Datei eventd.c.

00110                                                         {
00111     return(1);
00112 }

protected int allowedtrigger ( string  eid,
object  trigger 
)

Definiert in Zeile 119 der Datei eventd.c.

Wird benutzt von TriggerEvent().

00119                                                          {
00120     return(1);
00121 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int CheckEventID ( string  eid  ) 

Definiert in Zeile 99 der Datei eventd.c.

Benutzt events.

00099                              {
00100     if (!stringp(eid) || !member(events,eid))
00101         return 0;
00102     return(sizeof(events[eid]));
00103 }

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

mixed QueryActive (  ) 

Definiert in Zeile 314 der Datei eventd.c.

00314                     {
00315     return(deep_copy(active));
00316 }

mapping QueryEvents (  ) 

Definiert in Zeile 306 der Datei eventd.c.

00306                       {
00307     return(deep_copy(events));
00308 }

mixed QueryPending (  ) 

Definiert in Zeile 310 der Datei eventd.c.

00310                      {
00311     return(deep_copy(pending));
00312 }

mapping QueryStats (  ) 

Definiert in Zeile 318 der Datei eventd.c.

00318                      {
00319     return(copy(stats));
00320 }

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs int remove ( int  silent  ) 

Definiert in Zeile 288 der Datei eventd.c.

00288                                {
00289     save_me();
00290     DEBUG(sprintf("remove() called by %O - destructing\n", previous_object())); 
00291     LOG(sprintf("remove called by %O - destructing",previous_object()));
00292     destruct(ME);
00293     return 1;
00294 }

public void reset ( void   ) 

Definiert in Zeile 296 der Datei eventd.c.

00296                     {
00297   if (updateme && !sizeof(active) && !sizeof(pending)) {
00298     DEBUG(sprintf("Update requested\n"));
00299     remove(1);
00300   }
00301 }

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

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 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int UpdateMe ( int  flag  ) 

Definiert in Zeile 322 der Datei eventd.c.

00322                        {
00323     return (updateme=flag);
00324 }


Variablen-Dokumentation

nosave mixed active = ({})
mapping events = ([])

Definiert in Zeile 71 der Datei eventd.c.

Wird benutzt von CheckEventID(), heart_beat(), RegisterEvent(), TriggerEvent() und UnregisterEvent().

int lastboot

Definiert in Zeile 82 der Datei eventd.c.

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().

nosave int updateme

Definiert in Zeile 85 der Datei eventd.c.

Erzeugt am Thu Jun 3 14:40:33 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3