Rather than changing the handle (making it harder to associate the handle with the "real" socket), it would be nicer to have a SocketFinalizer or something - it could even be a subclass of socket??
________________________________________ From: [email protected] [[email protected]] On Behalf Of Henrik Sperre Johansen [[email protected]] Sent: Tuesday, July 12, 2011 8:16 AM To: [email protected] Subject: Re: [Pharo-project] Socket objects created twice ? On 12.07.2011 13:38, Sven Van Caekenberghe wrote: > Hi All, > > I encountered something that I do not understand. I tried this in 1.2.2 and > 1.4 with both my normal, older CogVM as well as the lastest one by Estaban. > > In a normal clean image, there would be not Socket instances. > > Socket allInstances size = 0 > > Now create any kind of Socket > > Socket new (or newTCP, newUDP) > > Now > > Socket allInstances size = 2 > > So Smalltalk reports two instances, but it seems they share the same > socketHandle and semaphores, so one seems to be a shallow copy of the other. > > (Close the one instance, 3 timesRepeat: [ Smalltalk garbageCollect ] and they > are both gone). > > Is this normal ? > Is there really only one OS level socket ? > Does this have to do with Sockets being in a WeakRegistry ? > > It is confusing to say the least. > > Sven Yes it's normal, one is the finalizer of the other. To differentiate them more easily, you could do Socket >> actAsFinalizer socketHandle := socketHandle bitInvert. and finalize self primSocketDestroyGently: socketHandle bitInvert. This will (99.9% likely at least) give a printstring of invalidSocketHandle for the finalizing Socket instance. Cheers, Henry
