Neuen SV zuweisen, wenn alter unbekannt.
assert_supervisor() war noch nicht ganz vollstaendig
und hat nur versucht, den alten SV neuzuladen, wenn
dessen Pfad bekannt war.
Im anderen Falle wird nun ein neuer SV bestimmt.
Change-Id: Id84cd88c34fdc5960f80c6aed3257279993b4a2a
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index fd8776d..85ff52e 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -667,6 +667,8 @@
private int assert_supervisor(string ch)
{
// Es ist keine Closure vorhanden, d.h. der Ebenenbesitzer wurde zerstoert.
+ //TODO: es ist nicht so selten, dass die Closure 0 ist, d.h. der Code laeuft
+ //haeufig unnoetig!
if (!closurep(ACC_CLOSURE(ch)))
{
// Wenn der Ebenenbesitzer als String eingetragen ist, versuchen wir,
@@ -695,19 +697,26 @@
}
else
{
- log_file("CHANNEL", sprintf("[%s] Channel deleted. %O -> %O\n",
- dtime(time()), SVISOR_OB(ch), err));
+ log_file("CHANNEL",
+ sprintf("[%s] Channel %s deleted. SV-Fehler: %O -> %O\n",
+ dtime(time()), ch, SVISOR_OB(ch), err));
m_delete(channels, ch);
return 0;
}
}
- else
+ else if (!objectp(SVISOR_OB(ch)))
{
// In diesem Fall muss ein neues SV-Objekt gesucht und ggf. eingetragen
- // werden. Wir nehmen das aelteste Mitglied der Ebene.
- // TODO: kaputte Objekte raussortieren, neuen Master bestimmen, wenn
- // dieser nicht mehr existiert.
-
+ // werden. change_sv_object nimmt das aelteste Mitglied der Ebene.
+ if (!change_sv_object(ch, pl, 0))
+ {
+ // wenn das nicht klappt, Ebene aufloesen
+ log_file("CHANNEL",
+ sprintf("[%s] Deleting channel %s without SV.\n",
+ dtime(time()), ch));
+ m_delete(channels, ch);
+ return 0;
+ }
}
}
return 1;
@@ -840,7 +849,7 @@
// Erstellen neuer Ebenen loggen, wenn wir nicht selbst der Ersteller sind.
if (owner != this_object())
- log_file("CHANNEL.new", sprintf("[%s] %O: %O %O\n",
+ log_file("CHANNEL.new", sprintf("[%s] Neue Ebene %s: %O %O\n",
dtime(time()), ch_name, owner, info));
// Erfolgsmeldung ausgeben, ausser bei unsichtbarem Ebenenbesitzer.