Minnesläcka i 1.2.2?

Moderator: Telldus

PerM
Posts: 58
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Minnesläcka i 1.2.2?

Post by PerM »

Hej,

Jag utvecklar en mjukvara för hemautomation och vill naturligtvis stödja Tellstick. Implementeringen av Tellstick gick smärtfritt, men nu när jag börjat använda grejerna får jag problem med att Windows' växlingsfil (Page File) fylls sakta men säkert. Givetvis trodde jag att jag gjort ett misstag i implementationen men efter mycket letande kan jag bara konstatera att problemet ligger utanför min applikation, eller i varje fall inte i CLR-delen då minnesanvändningen ligger konstant.

Jag håller just nu på att skriva en testapplikation för att säkerställa ovanstående konstaterande, men vill ändå fråga ifall ni känner till några minnesproblem i v1.2.2 av Tellstick-driven, TellUsbD101.dll, samt vad skillnaderna är i version 1.2.3, den saknar versionshistorik.
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Hej, testa gärna version 2.0 istället där många åtgärder för minnesläckor är fixade.

Hittar du fler där är du hemskt välkommen men en rapport på vad du hittar.

Utvecklingsinformation till 2.0 hittas här: http://developer.telldus.se/doxygen/telldus_core.html
Micke Prag
Software
Telldus Technologies
PerM
Posts: 58
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Post by PerM »

Ok, så det finns kända minnesläckor i 1.2.3? Kanske vore en idé att skriva något om det så man får veta det :)

FYI, jag körde en maximalt nedslimmad applikation mot 1.2.3 under natten och den slukade glatt 112MB under 24h.

Jag ska prova 2.0, finns den färdigpaketerad? Om inte, behövs det något speciellt för att den ska fungera mot ftdchip's driver eller räcker det med att Windows har hittat stickan och sedan ladda TellUsbD101.dll?
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

I 2.0 ska du inte ladda TellUsbD101.dll utan TelldusCore.dll. Den finns färdigpacketerad som beta. Kolla tråden på forumet för länk till nerladdningen.

Skarpa versionen kommer släppas inom ett par dagar.
Micke Prag
Software
Telldus Technologies
PerM
Posts: 58
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Post by PerM »

Jag kanske är blind, vilken tråd refererar du till?

Edit: Ah - TelldusCenter, trodde först det var en egen applikation.
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
PerM
Posts: 58
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Post by PerM »

Hej igen,

Nu tänker jag sticka ut hakan och framföra lite konstruktiv kritik angående det API som Tellduscore (och nuvarande dll?) exponerar.
http://developer.telldus.se/doxygen/telldus_core.html wrote:Since telldus-core gives up the ownership of the string we must manualy free up the resource after we are done with it.
Hur många fler funktioner som lämnar över ägandeskapet av minne finns det? (dokumentationen säger inget om detta) Utan tydlig information om detta är det ju 100% säkert att alla program som använder TelldusCore kommer att lida av minnesläckor!

Om det absolut är nödvändigt att lämna över minnet så är det mycket säkrare att delkarera metoden så här:

Code: Select all

int tdGetName( int intDeviceId, char *buffer, int bufferSize  )
Fördelen med detta är att man för användaren/programmeraren verkligen belyser att ett överlämnande av data sker. Det är dessutom upp till användaren att allokera så mycket minne som han anser nödvändigt. Returvärdet skulle vid lyckad operation vara 0 och vid för liten buffer det antal chars som behövs för att hämta hela namnet, inklusive terminerande NULL-char samt negativa felkoder för intrerna fel. Som användare kan man då enkelt avgöra om operationen lyckades och, om man så önskar, få ut mer information om problemet.

Vidare har jag i och med mina funderingar på ovanstående insett att den exempel implementationen som finns för .Net här, samt min egen implemementation antagligen inte gör rätt när det gäller P/Invoke.

Tydligen förutsätter v2 av CLR P/Invoke att det minne som returneras som en char * ska avallokeras med Marshal.FreeCoTaskMem, vilket förutsätter att det allokerats med CoTaskMemAlloc - gissningsvis använder ni new eller malloc() för det? Tydligen fungerar det utan minnesläckr i .Net v2, men det är ju mot alla principer att inte använda rätt avallokeringsmetod; dvs new/delete, malloc/free och CoTaskMemAlloc/FreeCoTaskMem

Enligt denna tråd kommer dessutom beteendet för P/Invoke att förändras när vad det gäller avallokeringen av minnet. I v4 av .Net kommer den inte längre att anropa FreeCoTaskMem vilket slutar i ytterligare minnesläckor (egentligen är ju detta beteende bättre eftersom inte alla metoder som returnerar en char * faktiskt släpper minnet). Det är alltså bara tur att det fungerar alls.

Med ovanstående föreslagna signatur på tdGetName() blir .Net implementationen så här:

Code: Select all

[DllImport( "TelldusCore.dll" )]
public static extern int tdGetName( int intDeviceId, System.Text.StringBuilder sb, int bufferSize );
och används så här:

Code: Select all

StringBuilder sb = new StringBuilder( 50 );
int result = tdGetName( 1, sb, sb.Capacity );
För att kunna vara kompatibla med både nuvarande och framtida .Net versioner men främst för att tydligt visa att ett överlämnande av data sker föreslår jag därför att ni uppdaterar era publika APIer enl. ovanstående.

Ett annat alternativ är att TelldusCore tillhandahåller ett allokerings/avallokerings gränssnitt som användare av biblioteket kan använda. Det förhindrar alla eventuella problem med allokering/avallokering då man gömmer den problematiken för användaren.

Exempel:

Code: Select all

[DllImport( "TelldusCore.dll" )]
public static extern IntPtr tdGetName( int intDeviceId );

[DllImport( "TelldusCore.dll" )]
public static extern void tdDeallocate( IntPtr data );

IntPtr data = tdGetName( 1 );
string s = Marshal.PtrToStringBSTR( data );
deallocate( data );
Båda de föreslagna lösningarna bör fungera även i ren 64-bitars miljö utan några modifikationer (givetvis måste TelldusCore kompileras som 64bit)

// Per
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Tack för synpunkterna. Du har givetvis rätt i dina påståenden. Vi ska titta på hur vi kan implementera detta utan att bryta API. Troligtvis får det bli dubbla funktioner för de funktioner som returnerar char *:

Code: Select all

char *tdGetName(int deviceId);
void tdDeallocate(char *p);
och även en funktion där man skickar in en buffert:

Code: Select all

int tdGetNameInBuffert(int deviceId, char *buffert, int len);
Då får man själv välja vilket sätt som passar att implementera det på.
Micke Prag
Software
Telldus Technologies
PerM
Posts: 58
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Post by PerM »

Jätte bra, jag ser fram emot ett uppdaterat API.
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
PerM
Posts: 58
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Post by PerM »

Hej,

Har det skett några framsteg i detta område?
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Detta kommer släppas först i version 2.0.1
Micke Prag
Software
Telldus Technologies
krambriw
Posts: 654
Joined: Fri Mar 17, 2023 9:45 am

Post by krambriw »

Hej, med anledning av detta (TelldusCore.dll)???

Behövs det en uppdatering av plugin för EG som laddar TelldusCore.dll istället?

mvh Walter
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Jag har uppdaterat EventGhost-pluginet för att använda TelldusCore.dll istället och nu när 2.0 är officiellt släppt ska jag commita den till EG.
Micke Prag
Software
Telldus Technologies
krambriw
Posts: 654
Joined: Fri Mar 17, 2023 9:45 am

Post by krambriw »

Tack Micke,
mvh Walter
PerM
Posts: 58
Joined: Fri Mar 17, 2023 9:45 am
Contact:

Post by PerM »

micke.prag wrote:Detta kommer släppas först i version 2.0.1
Ok, fair enough. Någon grov tidsplan satt för den?
Beyond Measure - mer än bara mätning: Rita regler grafiskt, styr enheter, skapa grafer, skicka/ta emot SMS, E-mail, 1-Wire, RFXtrx, Tellstick....
micke.prag
Site Admin
Posts: 2243
Joined: Fri Mar 17, 2023 9:45 am
Location: Lund
Contact:

Post by micke.prag »

Då vi precis har släppt 2.0.0 har vi inte hunnit börja planera 2.0.1. Du kan dock följa arbetet på:
http://developer.telldus.se/milestone/2.0.1

Och specifikt för detta:
http://developer.telldus.se/ticket/66
Micke Prag
Software
Telldus Technologies
Post Reply