Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.399 Beiträge
 
Delphi 12 Athens
 
#9

Re: FastXMM - Speicher Manager

  Alt 21. Mai 2006, 10:47
OK, hab mir die neue Version mal angesehn ... ein Problem hat Piere jetzt "umgangen".

Früher ging es nicht, da das Modul, welches den FastMM initialisiert, diesen auch wieder freigibt.
Dann würde also in der Demo FastMM schon freigegeben, bevor der letzte SharedMM beendet wurde.

Tja .. ratet mal, wie er das jetzt umgangen hat?
Genau, er shared den MM nicht mehr ... also jede DLL hat trotz eines SharedMMs ihren eigenen MM .. was spaßig wird, sobald man zwischen diesen DLLs Speicher rumschieben will °_°

Delphi-Quellcode:
// TestDLL.dpr > TestDLL1.dll, TestDLL2.dll

Library TestDLL;

// FastMM Options: (muß man aber nicht aktivieren, da es eh ignoriert wird)
// {$DEFINE ShareMM}
// {$DEFINE AttemptToUseSharedMM}

Uses FastMM4;

Function TestAlloc: Pointer;
  Begin
    GetMem(Result, 1024);
  End;

Procedure TestFree(P: Pointer);
  Begin
    FreeMem(P);
  End;

Exports TestAlloc, TestFree;

End.
Hier mal 'ne Demo für den "einfachsten" Fall:
Dieser Code führete mal zu 'nem "netten" Fehler, aber wie gesagt, da jetzt FastMM sich nicht als SharedMM installiert, obwohl man es ihm doch gesagt hat, passiert hier jetzt kein Fehler mehr, es sei denn man versucht Speicher in dem Glauben an einen gemeinsamen MM in der einen DLL zu reservieren und in der anderen freizugeben (siehe nächster Code).
Delphi-Quellcode:
// TestProc.dpr > TestProc.exe

Program TestProc;

Uses Windows;

Var TestDLL1, TestDLL2: THandle;
  TestAlloc1, TestAlloc2: Function: Pointer;
  TestFree1, TestFree2: Procedure(P: Pointer);
  P1, P2: Pointer;

Begin
  TestDLL1 := LoadLibrary('TestDLL1.dll'); // erste Instance initialisiert den FastMM
  @TestAlloc1 := GetProcAddress(TestDLL1, 'TestAlloc');
  @TestFree1 := GetProcAddress(TestDLL1, 'TestFree');

  TestDLL2 := LoadLibrary('TestDLL2.dll'); // weitere Instancen sharen mit dem FastMM der ersten Instance
  @TestAlloc2 := GetProcAddress(TestDLL2, 'TestAlloc');
  @TestFree2 := GetProcAddress(TestDLL2, 'TestFree');

  P1 := TestAlloc1;
  P2 := TestAlloc2;

  TestFree1(P1);
  FreeLibrary(TestDLL1); // ist Owner des initialisierten FastMM und gibt diesen daher auch frei
                          // und meckert auch gleich, weil noch Speicher (P2) reserviert ist (wenn LeakCheck aktiviert)

  TestFree2(P2); // der DelphiMM meckert, weil er P2 nicht kennt
  FreeLibrary(TestDLL2);
End.
Eigntlich sollte man mit TestFree aus der anderen TestDLL*.dll Speicher freigeben können ... schließlich hat man FastMM ja gesagt, daß er nur einen SharedMM initialisieren soll und somit in beiden DLLs die selben FreeMem's aufgerufen würden.
Delphi-Quellcode:
// TestProc.dpr > TestProc.exe
  ...
  P2 := TestAlloc2;

  TestFree1(P1);
  TestFree1(P2); // hier der Fehler

  FreeLibrary(TestDLL1);
  FreeLibrary(TestDLL2);
End.
oder so:
Delphi-Quellcode:
// TestProc.dpr > TestProc.exe
  ...
  P2 := TestAlloc2;

  FreeLibrary(TestDLL1); // gibt seinen FastMM frei
                          // und meckert auch gleich, weil noch Speicher (P1) reserviert ist (wenn LeakCheck aktiviert)

  TestFree2(P1); // FastMM meckert, weil er P1 nicht kennt und dieser eh schon freigegeben wurde
  TestFree2(P2);

  FreeLibrary(TestDLL2); // gibt seinen FastMM frei
End.


FasterMM: stimmt nicht, vorallem da ich im Moment nur die Pascalversionen hab (kein optimiertes ASM)
StableMM, ReplacementMM: da gibts och schon was, welches so, oder so ähnlich heißt
BetterMM, ExtremeMM, XtremeMM: ich weiß nicht ... so richtig gefällt mir dat och nicht -.-''
und Better klingt so nach ... °_°
HimitsuMM, GoMM, WorkingMM: hmmmm?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat