memory leak in perl

Begonnen von Damian, 28 Mai 2018, 19:11:25

Vorheriges Thema - Nächstes Thema

Damian

Hallo,

nach tagelanger Suche konnte ich eine Stelle im Modul finden, die für einen Speicherfresser sorgt:

sub GetCommandDoIf ($$)
{
  my ($separator,$tailBlock) = @_;

  while ($tailBlock =~ /^[^"^\[^\{^\(^$separator]*/g) {...


Wenn GetCommandDoIf  im Wechsel mit ":" und "," für $separator aufgerufen wird, führt es zum Speicherzuwachs.

Ich habe zum Testen von GetCommandDoIf  eine identische Kopie GetCommandDoIf2 gemacht und den ursprünglichen Aufruf

($cmd,$tailBlock,$err)=GetCommandDoIf($separator,$tailBlock);

abgeändert in:


      if ($separator eq ":") {
        ($cmd,$tailBlock,$err) = GetCommandDoIf($separator,$tailBlock);
      } else {
        ($cmd,$tailBlock,$err) = GetCommandDoIf2($separator,$tailBlock);
      }


und der memory leak ist weg.

Es reicht im geänderten Code den Aufruf von GetCommandDoIf2 durch GetCommandDoIf zu ersetzen, so ist das Problem wieder da:


      if ($separator eq ":") {
        ($cmd,$tailBlock,$err) = GetCommandDoIf($separator,$tailBlock);
      } else {
        ($cmd,$tailBlock,$err) = GetCommandDoIf($separator,$tailBlock);
      }


Leider kann ich das Problem nicht separieren, es scheint in Kombination mit dem restlichen Code des Moduls irgendwie zusammen zu hängen.

Ich vermute, dass es mit der globalen Suchfunktion (/.../g) zusammenhängt, da dann Perl sich die Position (pos(...)) global merken muss.

Hat jemand eine Idee, wie so etwas zustande kommt?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF