#include <thing/properties.h>
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 |
| #define DBG | ( | x | ) |
Definiert in Zeile 19 der Datei tmp_prop_master.c.
| #define INDEX | ( | a, | |||
| b | ) | (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.
| 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 }


| 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 }

| 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 }

| public int IsTmpProp | ( | object | ob, | |
| string | prop | |||
| ) |
Definiert in Zeile 145 der Datei tmp_prop_master.c.
Benutzt in_progress und INDEX.
| 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 }

| 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 }

| 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 }

| 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 }

| 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 |
Definiert in Zeile 23 der Datei tmp_prop_master.c.
Wird benutzt von call_next_update(), create(), do_update(), print_debug_info(), RemoveTmpProp() und SetTmpProp().
1.6.3