Separat gefuehrte Anzahl Clients entfernt.
Es wurde bisher ein Zaehler fuer die Anzahl an Clients
gefuehrt, weil es aufwendig war, dies zu berechnen.
Mit dem Mapping clients ist das nicht mehr von Noeten
und die eher komplexe Buchfuehrung kann weg.
Change-Id: I7ff228cb7671141ebd8cc88b071d7395f5161662
diff --git a/p/service/padreic/mnpc/walk_master.c b/p/service/padreic/mnpc/walk_master.c
index 370fcd0..0c55fbd 100644
--- a/p/service/padreic/mnpc/walk_master.c
+++ b/p/service/padreic/mnpc/walk_master.c
@@ -35,7 +35,6 @@
#define WALK_DELAY 0
#define WALK_CLOSURE 1
-static int num_walker; // anzahl der walker im array
nosave int counter; // Markiert aktuellen Zeitslot im Array walker
nosave < < <int|closure>* >* >* walker;
// Mapping mit allen registrierten MNPC (als Objekte) als Key und deren
@@ -47,7 +46,6 @@
protected void create()
{
walker=map(allocate(MAX_DELAYTIME+1), #'allocate);
- num_walker=0;
enable_commands(); // ohne das, kein heart_beat()
}
@@ -81,7 +79,7 @@
if (!func)
raise_error("RegisterWalker() call from Object without Walk() function.\n");
}
- if (!num_walker) {
+ if (!sizeof(clients)) {
set_heart_beat(1);
}
int next=counter;
@@ -89,7 +87,6 @@
if (next>MAX_DELAYTIME) next-=MAX_DELAYTIME;
walker[next]+=({ ({ wert, func }) });
clients += ([ get_type_info(func, 2): wert; func ]);
- num_walker++;
}
int dummy_walk() // liefert immer 0 fuer abbrechen...
@@ -112,7 +109,6 @@
walker[i][j]=({ 0, #'dummy_walk });
else
walker[i][j]=0;
- num_walker--;
}
}
if (i!=counter) // koennte gerade im heart_beat stecken...
@@ -128,18 +124,20 @@
void heart_beat()
{
- int i;
- if (num_walker && i=sizeof(walker[counter])) {
+ int i = sizeof(walker[counter]);
+ if (i)
+ {
int tmp;
- num_walker-=i;
- for (i--;i>=0;i--) {
- if (get_eval_cost() < MAX_JOB_COST) {
+ for (i--;i>=0;i--)
+ {
+ if (get_eval_cost() < MAX_JOB_COST)
+ {
// nicht abgefertigte NPCs im naechsten heart_beat ausfuehren
walker[counter]=walker[counter][0..i];
- num_walker+=i+1;
return;
}
- else {
+ else
+ {
if (walker[counter][i][1] &&
!catch(tmp=(int)funcall(walker[counter][i][WALK_CLOSURE]))
&& tmp)
@@ -148,7 +146,6 @@
+random(RANDOM(walker[counter][i][WALK_DELAY])))/2;
if (tmp>MAX_DELAYTIME) tmp-=MAX_DELAYTIME;
walker[tmp]+=({ walker[counter][i] });
- num_walker++;
}
}
}
@@ -157,7 +154,7 @@
if (counter == MAX_DELAYTIME)
counter=0;
else counter++;
- if (!num_walker) {
+ if (!sizeof(clients)) {
set_heart_beat(0);
}
}
@@ -166,23 +163,21 @@
// kostet maximal einen unnoetigen heart_beat() pro reset -> vertretbar
// dient zu einem wieder anwerfen im Falle eines Fehlers im heart_beat()
{
- if (set_heart_beat(0)<=0) {
- int i;
- num_walker=0; // neu berechnen...
- if (!sizeof(walker)) return;
- for (i=MAX_DELAYTIME; i>=0; i--)
- num_walker+=sizeof(walker[i]);
- if (num_walker>0) {
+ if (set_heart_beat(0)<=0)
+ {
+ if (sizeof(clients) > 0)
+ {
write_file(object_name()+".err", sprintf(
"%s: Fehler im heart_beat(). %d aktive Prozesse.\n",
- dtime(time()), num_walker));
+ dtime(time()), sizeof(clients)));
enable_commands();
set_heart_beat(1);
}
}
- else set_heart_beat(1);
+ else
+ set_heart_beat(1);
}
// Bemerkung: damit kann jeder die Closures ermitteln und dann selber rufen.
mixed *WalkerList() // nur fuer Debugzwecke
-{ return ({ num_walker, walker, counter }); }
+{ return ({ clients, walker, counter }); }