Ik ben aan een multithreaded FTP server bezig die als NT service draait. Werkt al prima (download beta) maar ik zit met een behoorlijk probleem: de server heeft een memory leak van anywhere tussen 10 en 40 KB per session.
Ik gebruikte maar 2 keer dynamisch gealloceerd buffers, en die worden allebei binnen dezelfde method ook weer netjes gefreed. Na enige uurtjes debuggen kwam ik erachter wat de oorzaak was: de WinAPI TerminateThread functie.
De sessions extenden een (door drZymo gemaakte) thread class die met CreateThread en TerminateThread werkt en een ThreadHandler method laat overriden. Ik moet zeggen dat we behoorlijk in onze nopjes waren met deze nette OOP oplossing
Maar ik kwam er dus achter dat TerminateThread een thread ook echt alleen maar terminate; alle lokale variabelen (de thread's stack dus) blijven gewoon in het geheugen, of je ze nu dynamisch of statisch alloceert.
Een flag zetten per thread waarmee je aan de thread laat weten dat hij zichzelf moet beëindigen is ook geen oplossing; de threads zullen de meeste tijd in een recv() call zitten, en het is de bedoeling dat een session per direct kan worden beeindigd, en niet pas als de client besluit weer wat te zenden. ExitThread zou eigenlijk een prima functie hiervoor zijn (deze ruimt namelijk wel de stack op), ware het niet dat deze alleen de aanroepende thread kan beeindigen...
Iemand enig idee hoe ik de complete thread, dus inclusief stack, opruim?
Ik gebruikte maar 2 keer dynamisch gealloceerd buffers, en die worden allebei binnen dezelfde method ook weer netjes gefreed. Na enige uurtjes debuggen kwam ik erachter wat de oorzaak was: de WinAPI TerminateThread functie.
De sessions extenden een (door drZymo gemaakte) thread class die met CreateThread en TerminateThread werkt en een ThreadHandler method laat overriden. Ik moet zeggen dat we behoorlijk in onze nopjes waren met deze nette OOP oplossing
Een flag zetten per thread waarmee je aan de thread laat weten dat hij zichzelf moet beëindigen is ook geen oplossing; de threads zullen de meeste tijd in een recv() call zitten, en het is de bedoeling dat een session per direct kan worden beeindigd, en niet pas als de client besluit weer wat te zenden. ExitThread zou eigenlijk een prima functie hiervoor zijn (deze ruimt namelijk wel de stack op), ware het niet dat deze alleen de aanroepende thread kan beeindigen...
Iemand enig idee hoe ik de complete thread, dus inclusief stack, opruim?
4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1