Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/p/daemon/lag-o-daemon.c b/p/daemon/lag-o-daemon.c
new file mode 100644
index 0000000..6d23860
--- /dev/null
+++ b/p/daemon/lag-o-daemon.c
@@ -0,0 +1,272 @@
+#pragma strong_types,save_types,rtt_checks
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma pedantic
+
+#include <driver_info.h>
+
+#ifndef DEBUG
+#define DEBUG(x) if (find_player("zesstra"))\
+ tell_object(find_player("zesstra"),"LAG: "+x+"\n")
+#endif
+
+#define SAVEFILE __DIR__+"save/lag-o-daemon"
+#define LOG(x) log_file("LAG",x,200000);
+#define LOGMAX(x) log_file("LAGMAX",x,300000);
+
+// Anzahl an zu merkenden Werten (1800==3600s)
+#define MESSWERTE 1800
+
+nosave float hbstat, obstat;
+nosave mapping lastwarning=([]);
+nosave int *lasttime = utime();
+nosave int lasthbcount = absolute_hb_count();
+float *lagdata = allocate(MESSWERTE,0.0);
+// Lags fuer die letzten 2s (1 HB), 20s (10 HB), 60s (30 HB),
+// 300s (150 HB), 900s (450 HB), 3600s (1800 HB)
+float *lag = allocate(6,0.0);
+int *hbdata = allocate(MESSWERTE);
+// Lags fuer die letzten 2s (1 HB), 20s (10 HB), 60s (30 HB),
+// 300s (150 HB), 900s (450 HB), 3600s (1800 HB)
+int *hbs = allocate(6);
+int *codata = allocate(MESSWERTE);
+// Lags fuer die letzten 2s (1 HB), 20s (10 HB), 60s (30 HB),
+// 300s (150 HB), 900s (450 HB), 3600s (1800 HB)
+int *callouts = allocate(6);
+
+void create() {
+ seteuid(getuid());
+ // Bei nicht einlesbaren Savefile und nach Reboot Werte neu initialisieren.
+ // Denn dann ist die Differenz der HBs bedeutungslos. Erkennung ploetzlich
+ // kleinere HB-Zahl.
+ if (!restore_object(SAVEFILE)
+ || efun::driver_info(DI_NUM_HEARTBEAT_TOTAL_CYCLES) < lasthbcount)
+ {
+ lagdata = allocate(MESSWERTE,0.0);
+ lag = allocate(6,0.0);
+ hbdata = allocate(MESSWERTE);
+ hbs = allocate(6);
+ codata = allocate(MESSWERTE);
+ callouts = allocate(6);
+ }
+ set_heart_beat(1);
+}
+
+int remove(int silent) {
+ save_object(SAVEFILE);
+ destruct(this_object());
+ return 1;
+}
+
+// liefert Mittelwertarray zurueck
+//TODO: <int|string>* results
+private mixed calc_averages(mixed data, mixed results, int index, float scale) {
+ float tmp;
+ int t;
+
+ if (!scale) scale=1.0;
+
+ // 2s
+ results[0] = to_float(data[index]) * scale;
+
+ // alle 10s / 5 HBs den 20s-Wert neu berechnen
+ if ( index%5 == 1) {
+ if (index<9) {
+ foreach(int i: index-4+MESSWERTE .. MESSWERTE-1) {
+ tmp+=data[i];
+ t++;
+ }
+ foreach(int i: 0 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ else {
+ foreach(int i: index-9 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ results[1]=tmp/to_float(t) * scale;
+ }
+
+ // alle 10s / 5 HBs den 60s-Wert neu berechnen, aber in anderem HB als den
+ // 10s-Wert
+ if ( index%5 == 3) {
+ tmp=0.0;
+ t=0;
+ if (index<29) {
+ foreach(int i: index-14+MESSWERTE .. MESSWERTE-1) {
+ tmp+=data[i];
+ t++;
+ }
+ foreach(int i: 0 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ else {
+ foreach(int i: index-29 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ results[2]=tmp/to_float(t) * scale;
+ }
+
+ // 300s
+ // alle 40s / 20 HBs den 300s-Wert neu berechnen.
+ if ( index%20 == 12) {
+ tmp=0.0;
+ t=0;
+ if (index<149) {
+ foreach(int i: index-74+MESSWERTE .. MESSWERTE-1) {
+ tmp+=data[i];
+ t++;
+ }
+ foreach(int i: 0 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ else {
+ foreach(int i: index-149 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ results[3]=tmp/to_float(t) * scale;
+ }
+
+
+ // 900s
+ // alle 80s / 40 HBs den 900s-Wert neu berechnen.
+ if ( index%40 == 31) {
+ tmp=0.0;
+ t=0;
+ if (index<449) {
+ foreach(int i: index-224+MESSWERTE .. MESSWERTE-1) {
+ tmp+=data[i];
+ t++;
+ }
+ foreach(int i: 0 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ else {
+ foreach(int i: index-449 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ results[4]=tmp/to_float(t) * scale;
+ }
+
+ // 3600s
+ // alle 300s / 150 HBs den 3600s-Wert neu berechnen.
+ if ( index%150 == 128) {
+ tmp=0.0;
+ t=0;
+ if (index<1799) {
+ foreach(int i: index-899+MESSWERTE .. MESSWERTE-1) {
+ tmp+=data[i];
+ t++;
+ }
+ foreach(int i: 0 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ else {
+ foreach(int i: index-1799 .. index) {
+ tmp+=data[i];
+ t++;
+ }
+ }
+ results[5]=tmp/to_float(t) * scale;
+ }
+ return results;
+}
+
+protected void heart_beat() {
+ int hbcount=efun::driver_info(DI_NUM_HEARTBEAT_TOTAL_CYCLES);
+ // per Modulo Index auf 0 - 449 begrenzen
+ int index=hbcount%MESSWERTE;
+
+ // mass fuer das lag ist das Verhaeltnis von vergangener Sollzeit (Differenz
+ // HB-Counts * 2) und vergangener Istzeit (Differenz von time()). Und das
+ // ganze wird dann als Abweichung von 1 gespeichert (0, wenn kein Lag)
+ int *nowtime = utime();
+ float timediff = to_float((nowtime[0]-lasttime[0]))
+ + to_float(nowtime[1]-lasttime[1])/1000000.0;
+
+// lagdata[index] = 1.0 -
+// (to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__)
+// / timediff);
+// lagdata[index] = (timediff -
+// to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__)) /
+// to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__);
+ lagdata[index] = abs(to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__)
+ - timediff) /
+ to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__);
+
+
+ hbdata[index] = efun::driver_info(DI_NUM_HEARTBEATS_LAST_PROCESSED);
+ codata[index] = efun::driver_info(DI_NUM_CALLOUTS);
+
+ /*
+ DEBUG(sprintf("Index: %d: %d/%.6f => %:6f /1\n",index,
+ (hbcount - lasthbcount)*2,
+ timediff, lagdata[index]));
+ */
+ lasthbcount=hbcount;
+ lasttime=nowtime;
+
+ lag = calc_averages(lagdata, lag, index, 100.0);
+ // Multiplizieren mit 100
+ //DEBUG(sprintf("%O\n",lag));
+ //lag = map(lag, function float (float f) {return f*100.0;} );
+ //DEBUG(sprintf("%O\n",lag));
+ hbs = map(calc_averages(hbdata, hbs, index,1.0),#'to_int);
+ callouts = map(calc_averages(codata, callouts, index,1.0),#'to_int);
+
+ // und ausserdem mal etwas loggen fuer den Moment
+ if (lag[0] > 1000 || callouts[0] > 1000)
+ {
+ LOGMAX(sprintf("%s, %d, %d, %:6f, %:6f, %:6f, %:6f, %:6f, %:6f, "
+ "%d, %d, %d, %d, %d, %d, "
+ "%d, %d, %d, %d, %d, %d, \n",
+ strftime("%y%m%d-%H%M%S"),time(),hbcount,
+ lag[0],lag[1],lag[2],lag[3],lag[4],lag[5],
+ hbs[0],hbs[1],hbs[2],hbs[3],hbs[4],hbs[5],
+ callouts[0],callouts[1],callouts[2],callouts[3],callouts[4],
+ callouts[5]));
+ }
+ else if (hbcount%80 == 0 || lag[0] > 10)
+ {
+ LOG(sprintf("%s, %d, %d, %:6f, %:6f, %:6f, %:6f, %:6f, %:6f, "
+ "%d, %d, %d, %d, %d, %d, "
+ "%d, %d, %d, %d, %d, %d, \n",
+ strftime("%y%m%d-%H%M%S"),time(),hbcount,
+ lag[0],lag[1],lag[2],lag[3],lag[4],lag[5],
+ hbs[0],hbs[1],hbs[2],hbs[3],hbs[4],hbs[5],
+ callouts[0],callouts[1],callouts[2],callouts[3],callouts[4],
+ callouts[5]));
+ }
+}
+
+float *read_lag_data() {
+ return ({lag[2],lag[4],lag[5]});
+}
+float *read_ext_lag_data() {
+ return copy(lag);
+}
+int *read_hb_data() {
+ return copy(hbs);
+}
+int *read_co_data() {
+ return copy(callouts);
+}
+