habe mir gerade die 35er Quellen gezogen und den Ablauf überflogen.
Ganz provokativ gesagt kann es, so wie es derzeit ist, nicht funktionieren
Jeder Receiver hat die Macht, den Vdr-Core völlig lahm zu legen.
Falls ich die Quältexte richtig verstanden habe, ist nicht die Schleife in transfer.c das Problem, sondern die Schleife in device.c verbunden mit dem Umstand, dass alle Empfänger gleichberechtigt sind mit dem Vdr-Core
cDevice::Action(void)
{
while (Running()) {
if (GetTSPacket(b)) {
if (b) {
//
...
// Distribute the packet to all attached receivers:
Lock();
for (int i = 0; i < MAXRECEIVERS; i++) {
if (receiver[i] && receiver[i]->WantsPid(Pid)) {
if (DetachReceivers) {
// ...
}
else
receiver[i]->Receive(b, TS_SIZE);
}
}
Unlock();
}
}
else
break;
}
}
Alles anzeigen
Zeile 16 ist die Übergabe der Kontrolle an den Empfänger, ggf. eben an ein externes Plugin.
Dadurch dass die Schleife für jeden Empfänger gesperrt wird, werden alle Ausgabeprobleme zu neuralgischen Problemen, die den ganzen VDR lahm legen.
Der Umstand, dass Plugins sich als Empfänger anmelden können, vergrößert die Problematik noch - der VDR ist an dieser Stelle hochgradig verwundbar.
Mein Gegenvorschlag sieht so aus, dass der VDR die Pakete nicht aktiv an die Empfänger verteilt, sondern die Pakete in einen Ringpuffer einträgt und den Empfängern nur mitteilt, dass es ein neues Paket gibt. Jeder Empfänger sollte in einem eigenen Fred laufen, sodass der VDR unabhängig davon ist, wie lange ein Empfänger braucht, um ein Paket abzuholen.
Die Empfänger erhalten nur Lesezugriff auf den Ringpuffer und haben keine Möglichkeit, einen Lock zu erstellen.
Den Ringpuffer könnte man so anlegen, dass jeder Empfänger seine eigenen Indizes verwaltet - so können langsame und schnelle Empfänger unabhängig voneinander agieren.
Der VDR hält seine Indizes, die keiner einsehen oder verändern kann.
Über Puffergröße und ggf. einer kleinen Pause könnte die Hauptschleife des VDR austariert werden.
Bei einem "Überlauf" wird einfach ein altes Paket gegen ein neues ausgetauscht.
Jeder Empfänger, der bis zu diesem Zeitpunkt das alte Paket nicht abgeholt hat, hat dann einfach Pech gehabt.
Auf diese Weise wäre der VDR erstmal wieder autark und hätte die zeitliche Hoheit.
Wenn in einem solchen System ein Empfänger rumzickt und Amok läuft, würde zwar die Systemlast als solche steigen, die Funktionalität des VDR wäre aber nicht beeinträchtigt.
Auch in einem solchen System könnte der Quertreiber ohne Kollateralschäden abgeschossen werden.
Gruß Gero