lunedì, Aprile 29, 2024
nerd

SimpleRSS e Memory Leak? Fixed!

Qualche giorno fa cercavo su internet un componente per delphi che mi facesse un bel parsing dei Feed RSS e mi creasse tutto quello di cui avevo bisogno senza sbattermi ad interpretare tutti i tag XML…
La risposta è stata SimpleRSS!! era proprio quello che cercavo, purtroppo non è perfetto, il codice è fermo al 2005 ed inoltre dopo un piccolo test nel programma “test.exe” (:P) e un bel passaggio alla FastMM4 ha rivelato una serie di leak non indifferenti, ecco l’output:

test.exe: Rilevato leak della memoria
—————————
L’applicazione ha dei leak di memoria. I leak di piccoli blocchi sono (sono esclusi i leak attesi registrati da puntatori):

1 – 12 byte: TiTunesCategory x 69, TSimpleParserRSS x 3, TIdThreadSafeInteger x 1, AnsiString x 69
13 – 20 byte: TiTunesDuration x 69, TRSSAuthor x 69, TRSSItemSource x 69, TRSSItemGUID x 69, TRSSItemEnclosure x 69, TRFC822DateTime x 69, TList x 138, AnsiString x 69, Sconosciuta x 69
21 – 28 byte: TRSSItemCategory x 69, TiTunesKeywords x 69, TRSSItemCategories x 69, TIdCriticalSection x 2
29 – 36 byte: TiTunesItemExtra x 69
37 – 44 byte: AnsiString x 69
45 – 52 byte: AnsiString x 69

Nota: Per ottenere un file di log contenente i dettagli sui leak della memoria, abilitate le direttive condizionali “FullDebugMode” e “LogMemoryLeakDetailToFile”. Per disabilitare i controlli dei leak della memoria, non definire la direttiva “EnableMemoryLeakReporting”.

—————————

Tantini è? se teniamo conto conto che in genere un Feed RSS ogni tanto va anche aggiornato tutti questi errori si motiplicano!!

Preso bene da questo lavoro mi sono armato di debug e pazienza e mi sono messo alla ricerca dei leak perduti…

Il primo grosso problema era dovuto alla creazione di una serie di oggetti nel file SimpleRSSTypes.pas, in pratica tutto ciò che riguardava iTunes veniva creato ed allocato ma non esisteva il distruttore che eliminasse quanto allocato in precedenza, quindi ho risolto  con una bel override del distruttore e dove facevo il free delle risorse:

destructor TRSSItem.Destroy;
begin
  FCategory.Free;
  FPubDate.Free;
  FEnclosure.Free;
  FGUID.Free;
  FSource.Free;
  FAuthor.Free;
  FiTunes.Free;
  inherited;
end;

Fatto questo rimanevano soltanto il leak del  TSimpleParserRSS (oltre ai due intrinsechi delle Indy che per ora non tratterò), in questo caso il bug era nel file SimpleRSS.pas, in due punti si assegnava appunto TSimpleParserRSS a aParser ma finito il suo lavoro non veniva liberato, ho risolto con un blocco Try Finally tipo questo:

finally
  aParser.Free;
end;

Questo risolveva i problemi di leak, rimanevano due bugfix da fare per permettere la compilazione, ovvero l’inclusione della unit IdGlobalProtocols in SimpleRSSTypes.pas per permettere di risolvere la funzione StrInternetToDateTime() che altrimenti non veniva trovata.

Qui bugfix.diff e possibile scaricare il diff (fatto da linux) delle modifiche che ho apportato…
Mentre qui SimpleRSS_fixed.tar è possibile tutto il l’archivio completo già corretto, prossimamente vedrò di pubblicarlo nella sezione “code” :)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *