Posts Tagged ‘programmazione’

Vax

Posted: 14th gennaio 2011 by luca in nerd
Tags: , , ,

/*
* WARNING: Don't even consider trying to compile this 
* on a system where sizeof(int) < 4 sizeof(int) > 4 is fine;
* all the world's not a VAX.
*/

Per chi segue questo blog sicuramente ne sarà al corrente che nel tempo libero (ovvero molto poco) mi diletto nella programmazione Delphi, tutto nasce qualche anno fa per necessità.. infatti il software che utilizzavamo in Croce Viola Cesate scritto in delphi aveva bisogno di modifiche urgenti ed il vecchio programmatore era troppo svogliato per farle.

Allora mi sono armato di manuali, sorgenti e IDE gratuito ho iniziato a lavorarci su…

In questi anni il programma ha cambiato faccia, dalla prima release dove si poteva utilizzare solo una scheda alla volta al multi scheda, dal bde a mysql (nativo).. etc etc..

E mi domandavo, ma tra tutti gli appassionati di soccorso e programmatori… possibile che non ci sia qualcuno che vuole contribuire allo sviluppo???

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” 🙂