tmp_prop_master.c-Dateireferenz

#include <thing/properties.h>
Include-Abhängigkeitsdiagramm für tmp_prop_master.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define SAVEFILE   "/p/daemon/save/tmp_prop_master"
#define PROPMASTER   "/p/daemon/tmp_prop_master"
#define INDEX(a, b)   (object_name(a)+"##"+b)
#define DBG(x)

Funktionen

varargs public int remove (int silent)
public void reset ()
public void print_debug_info ()
static void call_next_update ()
static void do_update ()
public int IsTmpProp (object ob, string prop)
public void RemoveTmpProp (string prop)
varargs public void SetTmpProp (object ob, string prop, mixed newval, int tm, int sp)
public void create ()

Variablen

mixed * reset_times
mapping in_progress

Makro-Dokumentation

#define DBG ( x   ) 

Definiert in Zeile 19 der Datei tmp_prop_master.c.

#define INDEX ( a,
 )     (object_name(a)+"##"+b)

Definiert in Zeile 8 der Datei tmp_prop_master.c.

Wird benutzt von IsTmpProp(), RemoveTmpProp() und SetTmpProp().

#define PROPMASTER   "/p/daemon/tmp_prop_master"

Definiert in Zeile 7 der Datei tmp_prop_master.c.

#define SAVEFILE   "/p/daemon/save/tmp_prop_master"

Definiert in Zeile 6 der Datei tmp_prop_master.c.


Dokumentation der Funktionen

static void call_next_update (  )  [static]

Definiert in Zeile 73 der Datei tmp_prop_master.c.

Benutzt call_out() und reset_times.

Wird benutzt von create() und do_update().

00074 {
00075     int dt;
00076     
00077     while ( remove_call_out("do_update") != -1 )
00078         ;
00079     
00080     if ( sizeof(reset_times) ){
00081         dt = reset_times[0][0] - time();
00082 
00083         if ( dt <= 0 )
00084             dt = 5;
00085         
00086         call_out( "do_update", dt );
00087     }
00088 }

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

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

public void create (  ) 

Definiert in Zeile 38 der Datei tmp_prop_master.c.

Benutzt call_next_update(), in_progress, reset_times, restore_object() und SAVEFILE.

00039 {
00040 
00041     seteuid(getuid(this_object()));
00042     
00043     if ( !restore_object(SAVEFILE) ){
00044         in_progress = ([]);
00045         reset_times = ({});
00046     }
00047 
00048     call_next_update();
00049 }

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

static void do_update (  )  [static]

Definiert in Zeile 91 der Datei tmp_prop_master.c.

Benutzt call_next_update(), call_out(), DBG, F_QUERY_METHOD, F_SET_METHOD, F_VALUE, i, in_progress, m_delete(), Query() und reset_times.

00092 {
00093     int i, max;
00094     string index;
00095     mixed *val;
00096 
00097     DBG( "do_update() aufgerufen!\n" );
00098 
00099     while ( remove_call_out("do_update") != -1 )
00100         ;
00101     
00102     call_out( "do_update", 30 ); // Zur Sicherheit...
00103 
00104     if ( !(max = sizeof(reset_times)) )
00105         return;
00106     
00107     for ( i = 0; i < max && reset_times[i][0] <= time(); i++ ){
00108         index = reset_times[i][1];
00109 
00110         if ( !pointerp(val = in_progress[index]) || !objectp(val[0]) )
00111                 {
00112             efun::m_delete( in_progress ,index );
00113             continue;
00114         }
00115 
00116         DBG( sprintf("Entferne Eintrag %O!\n", index) );
00117 
00118         if ( val[4] ){
00119             if ( val[0]->Query(val[1], F_VALUE) == val[3] ){
00120                 DBG( "Alte Property per SetProp() restauriert!\n" );
00121                 val[0]->SetProp( val[1], val[2] );
00122             }
00123         }
00124         else {
00125             if ( val[0]->Query( val[1], F_QUERY_METHOD ) == val[2] ){
00126                 val[0]->Set( val[1], 0, F_QUERY_METHOD );
00127                 DBG( "F_QUERY_METHOD entfernt!\n" );
00128             }
00129             
00130             if ( val[0]->Query( val[1], F_SET_METHOD ) == val[3] ){
00131                 val[0]->Set( val[1], 0, F_SET_METHOD );
00132                 DBG( "F_SET_METHOD entfernt!\n" );
00133             }
00134         }
00135 
00136         efun::m_delete( in_progress ,index );
00137     }
00138     
00139     reset_times = reset_times[i..];
00140     call_next_update();
00141 }

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

public int IsTmpProp ( object  ob,
string  prop 
)

Definiert in Zeile 145 der Datei tmp_prop_master.c.

Benutzt in_progress und INDEX.

00146 {
00147     mixed oldval;
00148 
00149     if ( !objectp(ob) || !prop )
00150         return 0;
00151     
00152     if ( (oldval = in_progress[INDEX(ob, prop)])
00153          && ob == oldval[0] && prop == oldval[1] )
00154         return 1;
00155     
00156     return 0;
00157 }

public void print_debug_info (  ) 

Definiert in Zeile 67 der Datei tmp_prop_master.c.

Benutzt in_progress und reset_times.

00068 {
00069     printf( "in_progress: %O\nreset_times: %O\n", in_progress, reset_times );
00070 }

varargs public int remove ( int  silent  ) 

Definiert in Zeile 52 der Datei tmp_prop_master.c.

Benutzt destruct(), save_object() und SAVEFILE.

00053 {
00054     save_object(SAVEFILE);
00055     destruct(this_object());
00056     
00057     return 1;
00058 }

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

public void RemoveTmpProp ( string  prop  ) 

Definiert in Zeile 164 der Datei tmp_prop_master.c.

Benutzt DBG, F_QUERY_METHOD, F_SET_METHOD, F_VALUE, i, in_progress, INDEX, m_delete(), Query() und reset_times.

00165 {
00166     string index;
00167     mixed *val;
00168     int i;
00169     
00170     DBG( "RemoveTmpProp!\n");
00171     if ( !previous_object() || !stringp(prop) || !strlen(prop) )
00172         return;
00173 
00174     index = INDEX(previous_object(), prop);
00175     DBG( sprintf("RemoveTmpProp(%O)!\n", index) );
00176 
00177     if ( !(val = in_progress[index]) ){
00178         DBG( "Kein Eintrag vorhanden!\n" );
00179         return;
00180     }
00181 
00182     if ( objectp(val[0]) ){
00183         DBG( "Restauriere alten Zustand ...\n" );
00184 
00185         if ( val[4] ){
00186             if ( val[0]->Query(val[1], F_VALUE) == val[3] ){
00187                 DBG( "Alte Property per SetProp() restauriert!\n" );
00188                 val[0]->SetProp( val[1], val[2] );
00189             }
00190         }
00191         else {
00192             if ( val[0]->Query( val[1], F_QUERY_METHOD ) == val[2] ){
00193                 val[0]->Set( val[1], 0, F_QUERY_METHOD );
00194                 DBG( "F_QUERY_METHOD entfernt!\n" );
00195             }
00196             
00197             if ( val[0]->Query( val[1], F_SET_METHOD ) == val[3] ){
00198                 val[0]->Set( val[1], 0, F_SET_METHOD );
00199                 DBG( "F_SET_METHOD entfernt!\n" );
00200             }
00201         }
00202     }
00203 
00204     for ( i = sizeof(reset_times); i--; )
00205         if ( reset_times[i][1] == index ){
00206             reset_times[i..i] = ({});
00207             break;
00208         }
00209     
00210     DBG( "Eintrag entfernt!\n" );
00211     efun::m_delete( in_progress, index );
00212 }

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

public void reset ( void   ) 

Definiert in Zeile 61 der Datei tmp_prop_master.c.

Benutzt save_object() und SAVEFILE.

00062 {
00063     save_object(SAVEFILE);
00064 }

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

varargs public void SetTmpProp ( object  ob,
string  prop,
mixed  newval,
int  tm,
int  sp 
)

Definiert in Zeile 231 der Datei tmp_prop_master.c.

Benutzt DBG, F_QUERY_METHOD, F_SET_METHOD, F_VALUE, in_progress, INDEX, Query() und reset_times.

00233 {
00234     string index;
00235     mixed oldval, tmp;
00236     int max, pos, l, r;
00237     closure a, b;
00238 
00239     if ( !objectp(ob) || !stringp(prop) || !strlen(prop) || tm <= 0 )
00240         return;
00241 
00242     index = INDEX(ob, prop);
00243     DBG( sprintf("SetTmpProp( %O, %O, %O, %O, %O )!\n", ob, prop, newval,
00244                  tm, sp) );
00245 
00246     // wenn bereits ein temporaerer Prozess laeuft, diesen nun beenden!
00247     if ( (oldval = in_progress[index])
00248          && ob == oldval[0] && prop == oldval[1] ){
00249         DBG( "Es laeuft bereits ein Vorgang fuer diese Property!\n" );
00250         
00251         // Wurde die alte temporaere Property per SetProp() gesetzt, muss der
00252         // urspruengliche Wert erst restauriert werden. 
00253         if ( oldval[4] ){
00254             if ( oldval[0]->Query(oldval[1], F_VALUE) == oldval[3] ){
00255             DBG( "Alte Property per SetProp() restauriert!\n" );
00256             oldval[0]->SetProp( oldval[1], oldval[2] );
00257             }
00258         }
00259         // Ansonsten einfach die F_QUERY- und F_SET_METHOD loeschen.
00260         else {
00261             if ( oldval[0]->Query( oldval[1], F_QUERY_METHOD ) == oldval[2] ){
00262                 oldval[0]->Set( oldval[1], 0, F_QUERY_METHOD );
00263                 DBG( "F_QUERY_METHOD entfernt!\n" );
00264             }
00265 
00266             if ( oldval[0]->Query( oldval[1], F_SET_METHOD ) == oldval[3] ){
00267                 oldval[0]->Set( oldval[1], 0, F_SET_METHOD );
00268                 DBG( "F_SET_METHOD entfernt!\n" );
00269             }
00270         }
00271         
00272         for ( l = sizeof(reset_times); l--; )
00273             if ( reset_times[l][1] == index ){
00274                 reset_times[l..l] = ({});
00275                 DBG( "Timer-Eintrag entfernt!\n" );
00276                 break;
00277             }
00278     }
00279 
00280     if ( tm < 1000000 )
00281         tm += time();
00282 
00283     if ( tm < time() )
00284         return;
00285 
00286     if ( !sp ){
00287         // Default: F_QUERY_METHOD setzen
00288         oldval = ob->Set( prop, newval,  F_QUERY_METHOD );
00289 
00290         // F_SET_METHOD, damit die temporaere Property keinen zwischenzeitlich
00291         // gesetzten anderen Wert wieder "restauriert".
00292 
00293         a=symbol_function("RemoveTmpProp",this_object());
00294         b=symbol_function("SetProp",ob);
00295         tmp=ob->Set(prop,lambda(({'set_value,'prop_name}),({#',,({a,'prop_name}),({#'return,({b,'prop_name,'set_value})})})),F_SET_METHOD);
00296     }
00297     else{
00298         // Fuer Spezialfaelle (P_LIGHT z.B.) wird die Property direkt mit
00299         // SetProp() gesetzt und spaeter mit dem alten Wert restauriert.
00300         // Achtung - extrem fehleranfaellig und wirklich nur fuer Spezialfaelle!
00301 
00302         // Alten Wert mit Query() sichern anstatt mit QueryProp(), um nicht
00303         // irgendwelchen F_QUERY_METHODs auf den Leim zu gehen.
00304         oldval = ob->Query( prop, F_VALUE );
00305 
00306         // Rueckgabewert des SetProp() speichern, um spaeter erkennen zu
00307         // koennen, ob die Property zwischenzeitlich veraendert wurde.
00308         tmp = ob->SetProp( prop, newval );
00309     }
00310 
00311     in_progress[index] = ({ ob, prop, oldval, tmp, sp });
00312     
00313     if ( !(max = sizeof(reset_times)) )
00314         pos = 0;
00315     else{
00316         l = 0;
00317         r = max - 1;
00318         
00319         while ( l < r ){
00320             pos = (l + r) / 2;
00321             
00322             if ( tm < reset_times[pos][0] )
00323                 r = --pos;
00324             else
00325                 l = ++pos;
00326         }
00327         
00328         while ( pos >= 0 && pos < max && tm < reset_times[pos][0] )
00329             pos--;
00330     }
00331     
00332     reset_times = reset_times[0..pos] + ({ ({tm, index}) })
00333         + reset_times[pos+1..];
00334 
00335     DBG( sprintf("Property an Stelle %O eingefuegt!\n", pos+1) );
00336 
00337     call_next_update();
00338 }

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


Variablen-Dokumentation

mapping in_progress

Definiert in Zeile 24 der Datei tmp_prop_master.c.

Wird benutzt von create(), do_update(), IsTmpProp(), print_debug_info(), RemoveTmpProp() und SetTmpProp().

mixed* reset_times
Erzeugt am Thu Jun 3 14:40:48 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3