Re: [Pharo-project] garbage collection

2012-02-20 Thread Norbert Hartl

Am 19.02.2012 um 18:26 schrieb Chris Muller:

 Very strange. Shortly after I read your post I opened a unresponsive image
 myself. In the process stack I saw that magma was the culprit (didn't 
 remember
 I have it installed in that image). However the problem was that I moved my
 directory and magma was looking for the old path. I didn't investigate 
 further but
 it seems that the MagmaRepositoryController#open (called on startUp) is
 able to block the UI thread. In the same image I could use seaside still 
 although
 the UI was frozen.
 
 Hi.  Based on your description, it sounds like Magma hit its warning
 condition check that it found a file named _open in the repository
 directory, indicating it thinks another process has it open.  This can
 occur if the server image did not shut down properly last time.
 
 Before starting the image, see if there is a file called _open and,
 if there is, delete it.  The image should start normally now.
 
The directory wasn't there anymore where magma was looking for it. Does magma 
look in other directories as well. The magma/ Folder was still in the same 
directory as the image. But I thought magma is looking for the absolute path 
because that's what I can see in the debug log. Anyway there was a file called 
_open in that directory. So either magma didn't find the directory or it was 
locked by the _open.

 This is something that has annoyed me at least a couple of times as
 well.  I'm not sure what the UI process was doing in your case, but
 Alt+. should allow you to interrupt it and see the stacks..  My
 suspicion is that something in the image wanted a MagmaSession to do
 something, but since the server was waiting for you to respond to the
 Warning about _open it wouldn't return...
 
Alt+. did not work. It was not reacting to anything. The warning about _open 
would have been a dialog?

 The confusing part for me is, the image startup code runs in the UI
 process doesn't it?  So why were there two Processes to possibly get
 into a deadlock?

Well, I don't have enough knowledge but I would say in pharo it isn't 
impossible that there are more than one thread being involved.

Norbert


Re: [Pharo-project] garbage collection

2012-02-20 Thread Stéphane Ducasse
For your information igor and marcus fixed the interrupt handler in pharo1.4 nd 
now you can avoid dot kill the finalize process.

Stef

 Very strange. Shortly after I read your post I opened a unresponsive image
 myself. In the process stack I saw that magma was the culprit (didn't 
 remember
 I have it installed in that image). However the problem was that I moved my
 directory and magma was looking for the old path. I didn't investigate 
 further but
 it seems that the MagmaRepositoryController#open (called on startUp) is
 able to block the UI thread. In the same image I could use seaside still 
 although
 the UI was frozen.
 
 Hi.  Based on your description, it sounds like Magma hit its warning
 condition check that it found a file named _open in the repository
 directory, indicating it thinks another process has it open.  This can
 occur if the server image did not shut down properly last time.
 
 Before starting the image, see if there is a file called _open and,
 if there is, delete it.  The image should start normally now.
 
 The directory wasn't there anymore where magma was looking for it. Does magma 
 look in other directories as well. The magma/ Folder was still in the same 
 directory as the image. But I thought magma is looking for the absolute path 
 because that's what I can see in the debug log. Anyway there was a file 
 called _open in that directory. So either magma didn't find the directory or 
 it was locked by the _open.
 
 This is something that has annoyed me at least a couple of times as
 well.  I'm not sure what the UI process was doing in your case, but
 Alt+. should allow you to interrupt it and see the stacks..  My
 suspicion is that something in the image wanted a MagmaSession to do
 something, but since the server was waiting for you to respond to the
 Warning about _open it wouldn't return...
 
 Alt+. did not work. It was not reacting to anything. The warning about _open 
 would have been a dialog?
 
 The confusing part for me is, the image startup code runs in the UI
 process doesn't it?  So why were there two Processes to possibly get
 into a deadlock?
 
 Well, I don't have enough knowledge but I would say in pharo it isn't 
 impossible that there are more than one thread being involved.
 
 Norbert




Re: [Pharo-project] garbage collection

2012-02-20 Thread Milan Mimica
On 14 February 2012 23:54, Milan Mimica milan.mim...@gmail.com wrote:

 On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:


 semaphores collect: [:sema |
sema -
(sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) ]

 Can you try invoking it on your image , look for those who has an
 empty array, which will mean that there is no references to it except
 semaphore table itself.


 There is 69 of such semaphores, out of hundreds in total. Not much :-/
 On a normal image there is only a few.


Should say that the 69 leaked semaphores are probably there because of the
bug that leaks a semaphore on each image save. Still, that should be
causing major problems in my case.


-- 
Milan Mimica
http://sparklet.sf.net


Re: [Pharo-project] garbage collection

2012-02-20 Thread Igor Stasenko
On 20 February 2012 16:47, Milan Mimica milan.mim...@gmail.com wrote:
 On 14 February 2012 23:54, Milan Mimica milan.mim...@gmail.com wrote:

 On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:


 semaphores collect: [:sema |
        sema -
                (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) ]

 Can you try invoking it on your image , look for those who has an
 empty array, which will mean that there is no references to it except
 semaphore table itself.


 There is 69 of such semaphores, out of hundreds in total. Not much :-/
 On a normal image there is only a few.


 Should say that the 69 leaked semaphores are probably there because of the
 bug that leaks a semaphore on each image save. Still, that should be causing
 major problems in my case.


Well, that should not cause problem unless you keep the image running
and running and running (so garbage accumulates).
And of course, if you restart an image, an external semaphore table wiped out..
so i think we having a side effect of running image stably for quite a
long duration (and this is positive part) , but which uncovering such
bags :)


 --
 Milan Mimica
 http://sparklet.sf.net



-- 
Best regards,
Igor Stasenko.



Re: [Pharo-project] garbage collection

2012-02-20 Thread Guido Stepken
Am 20.02.2012 17:51 schrieb Igor Stasenko siguc...@gmail.com:
...
 so i think we having a side effect of running image stably for quite a
 long duration (and this is positive part) , but which uncovering such
 bags :)

There are a lot more of leaks deep in the core of Pharo that make the
machine dog-slow and absolutely unusable for long-term purposes.

A resource watchdog would be nice to have, hat keep operators informed. :-)

Have fun debugging, Guido Stepken


Re: [Pharo-project] garbage collection

2012-02-20 Thread Milan Mimica
On 20 February 2012 16:47, Milan Mimica milan.mim...@gmail.com wrote:


 Still, that should be causing major problems in my case.


I am missing a not somewhere here.



-- 
Milan Mimica
http://sparklet.sf.net


Re: [Pharo-project] garbage collection

2012-02-20 Thread Igor Stasenko
On 20 February 2012 18:30, Guido Stepken gstep...@googlemail.com wrote:
 Am 20.02.2012 17:51 schrieb Igor Stasenko siguc...@gmail.com:


 ...
 so i think we having a side effect of running image stably for quite a
 long duration (and this is positive part) , but which uncovering such
 bags :)

 There are a lot more of leaks deep in the core of Pharo that make the
 machine dog-slow and absolutely unusable for long-term purposes.

Guido, try to not repeat yourself. Your initial message were heard.
Loud and clear.
If you want to help diagnosing this particular problem, and help
finding solution, feel free to do it.
But please don't turn every topic into own speech pedestal.

 A resource watchdog would be nice to have, hat keep operators informed. :-)

 Have fun debugging, Guido Stepken



-- 
Best regards,
Igor Stasenko.



Re: [Pharo-project] garbage collection

2012-02-19 Thread Chris Muller
 Very strange. Shortly after I read your post I opened a unresponsive image
 myself. In the process stack I saw that magma was the culprit (didn't remember
 I have it installed in that image). However the problem was that I moved my
 directory and magma was looking for the old path. I didn't investigate 
 further but
 it seems that the MagmaRepositoryController#open (called on startUp) is
 able to block the UI thread. In the same image I could use seaside still 
 although
 the UI was frozen.

Hi.  Based on your description, it sounds like Magma hit its warning
condition check that it found a file named _open in the repository
directory, indicating it thinks another process has it open.  This can
occur if the server image did not shut down properly last time.

Before starting the image, see if there is a file called _open and,
if there is, delete it.  The image should start normally now.

This is something that has annoyed me at least a couple of times as
well.  I'm not sure what the UI process was doing in your case, but
Alt+. should allow you to interrupt it and see the stacks..  My
suspicion is that something in the image wanted a MagmaSession to do
something, but since the server was waiting for you to respond to the
Warning about _open it wouldn't return...

The confusing part for me is, the image startup code runs in the UI
process doesn't it?  So why were there two Processes to possibly get
into a deadlock?

 - Chris



Re: [Pharo-project] garbage collection

2012-02-17 Thread Milan Mimica
On 17 February 2012 08:15, Henrik Johansen henrik.s.johan...@veloxit.nowrote:


 As per later mails though, network reinitialization is already one case in
 the base image where such leaks can occur , so it's not certain Magma is
 involved at all...


Might be also because of RFB server, but that is less likely.


-- 
Milan Mimica
http://sparklet.sf.net


Re: [Pharo-project] garbage collection

2012-02-17 Thread Sven Van Caekenberghe

On 17 Feb 2012, at 09:16, Milan Mimica wrote:

 Might be also because of RFB server, but that is less likely.

I have the impression that most people who run in trouble with server images 
are using RFB.

On the other hand, those not using RFB with probably restart server images 
sooner.

Anyway, Henrik's list is excellent, thanks !

Sven




Re: [Pharo-project] garbage collection

2012-02-17 Thread Norbert Hartl

Am 17.02.2012 um 09:25 schrieb Sven Van Caekenberghe:

 
 On 17 Feb 2012, at 09:16, Milan Mimica wrote:
 
 Might be also because of RFB server, but that is less likely.
 
 I have the impression that most people who run in trouble with server images 
 are using RFB.
 
Very strange. Shortly after I read your post I opened a unresponsive image 
myself. In the process stack I saw that magma was the culprit (didn't remember 
I have it installed in that image). However the problem was that I moved my 
directory and magma was looking for the old path. I didn't investigate further 
but it seems that the MagmaRepositoryController#open (called on startUp) is 
able to block the UI thread. In the same image I could use seaside still 
although the UI was frozen.

Norbert




Re: [Pharo-project] garbage collection

2012-02-16 Thread Henrik Johansen
On Feb 15, 2012, at 5:53 PM, Igor Stasenko wrote:

 On 15 February 2012 11:26, Henrik Johansen henrik.s.johan...@veloxit.no 
 wrote:
 I sort of doubt Magma uses anything registering external objects but the 
 standard Sockets…
 While interrupting finalization process _could_ be a culprit, I'd rather 
 watch for something like what happened with the InputEventFetcher, where 
 registration/deregistration ends up not being symmetric.
 
 Perhaps Magma tries to reuse existing Socket instances by calls to 
 initialize:/acceptFrom: for example?
 
 I think changing ExternalSemaphoreTable to a weak structure would be a 
 really bad idea btw.
 All of a sudden, you free up slots which were previously taken for insertion 
 of old objects.
 
 There is no guarantee the external user of the semaphore will stop using the 
 index it was given just because the image no longer holds a reference to the 
 object which used to occupy that index.
 
 So if you register a new object in the same slot, in the case of Sockets at 
 least, you could potentially end up responding to signals from both the old 
 external user, and the new one.
 
 TLDR; Any object registered in this table by definition needs explicit 
 cleanup of external users before they are GC'd. Thus, making the table weak 
 makes no sense.
 
 
 Yes, that could happen.
 Well, then the only option is to check what code producing leaks. And
 that's not trivial, since
 you cannot trace references back to semaphore's original owner. :(
 
 
 -- 
 Best regards,
 Igor Stasenko.
 

It's not such a big task to review the current users, there are like 5 of them 
in the base image.

AFAICT:
1) InputEventFetcher, this has been bug-fixed once already. No leaks as long as 
it has a single entry in startup/shutdown lists.
2) Sockets, which, to my knowledge work OK with the weak finalization.
3) AsyncFile, only done correctly if #close'd at EOL. No weak cleanup done it 
seems, could be changed to work like Sockets.
4) StandardFileStream url opening, should be modified to use an ensure: block. 
Only applicable when running in a browser though, unlikely to be a large issue.
5) NetNameResolver, never unregisters the semaphore, and leaks one whenever 
network needs (re)initialization. Snapshot? Image quit? Arbitrary points during 
execution? Reading the plugin source would tell the real cases I guess. A 
probable culprit in this case, I would say.

I opened http://code.google.com/p/pharo/issues/detail?id=5310 , which contains 
proposed changes related to 3-5.

I also opened 2 additional issues for things I ran into, but didn't do as it 
wasn't worth the effort/strictly related:

5311: Rewrite AsyncFile to have weak finalization for guaranteed cleanup of 
external objects
5312: Move StandardFileStream browserRequest protocol functionality to a 
separate package, and deprecate the protocol itself.
The main purpose of the methods in this protocol has nothing to do with 
FileStreams, but rather performing navigation in a Browser when Pharo is run as 
a plugin.

Cheers,
Henry





Re: [Pharo-project] garbage collection

2012-02-16 Thread Milan Mimica
When Magma is down there are no instances of MaTimer. There are 3 instances
of MaServerSocket though.

On 15 February 2012 18:41, Chris Muller asquea...@gmail.com wrote:

 Milan, try checking whether the number of instances of MaTimer
 correlate to the number of instances of Semaphore you are seeing.

  - Chris

 On Tue, Feb 14, 2012 at 2:01 PM, Milan Mimica milan.mim...@gmail.com
 wrote:
  This is more of a GC theory question perhaps, but I do have practical
  problems, so: I'm trying to figure out how come my headless Pharo 1.3
 image
  with fairly recent Cog running Magma ran out of Semaphores. I know there
 is
  a fixed limit on number of semaphores Cog can handle, and only Magma and
 RFB
  server have been running on this image for two months, and there wasn't
 any
  heavy load whatsoever, so something must be leaking semaphores - or more
  likely - something must be leaking objects having reference(s) to
  semaphore(s). I am not leaking sockets btw.
 
  At the moment there is about 1400 instances of Semaphore class, and
 around
  400 after GC.
  So first question is: Suppose I haven't run GC manually, could the
 semaphore
  limit be hit?
 
  400 is still too high for a idling image, don't you think?
 
  Anyway, what I try next is to shut down Magma completely and try to clean
  the memory by hand. I notice some MaServerSockets are still floating
 around
  so I track the pointers and I find that all the references are circular!
  Question two: Does Pharo's GC solve circular references? If yes, how
 good is
  it at it?
 
  But then, thinking more about it, the whole running image is one big
 graph
  of circular references, you wouldn't want the GC to clean that :) So how
  does it really work? That's my naive view anyway.
 
  After I wrote all this I figure I'm better of taking a fresh new image
 and
  load what I need into it, even if I have to do it every two months. Not
  saving the image is also an option. Yeah, I think I'm going to do just
 that.
  I found my solution, at least this e-mail served for something. Since I
  don't have a blog I'll send it anyway.
 
 
  --
  Milan Mimica
 




-- 
Milan Mimica
http://sparklet.sf.net


Re: [Pharo-project] garbage collection

2012-02-16 Thread Stéphane Ducasse
Tx for the bug entries!!!

 I sort of doubt Magma uses anything registering external objects but the 
 standard Sockets…
 While interrupting finalization process _could_ be a culprit, I'd rather 
 watch for something like what happened with the InputEventFetcher, where 
 registration/deregistration ends up not being symmetric.
 
 Perhaps Magma tries to reuse existing Socket instances by calls to 
 initialize:/acceptFrom: for example?
 
 I think changing ExternalSemaphoreTable to a weak structure would be a 
 really bad idea btw.
 All of a sudden, you free up slots which were previously taken for 
 insertion of old objects.
 
 There is no guarantee the external user of the semaphore will stop using 
 the index it was given just because the image no longer holds a reference 
 to the object which used to occupy that index.
 
 So if you register a new object in the same slot, in the case of Sockets at 
 least, you could potentially end up responding to signals from both the old 
 external user, and the new one.
 
 TLDR; Any object registered in this table by definition needs explicit 
 cleanup of external users before they are GC'd. Thus, making the table weak 
 makes no sense.
 
 
 Yes, that could happen.
 Well, then the only option is to check what code producing leaks. And
 that's not trivial, since
 you cannot trace references back to semaphore's original owner. :(
 
 
 -- 
 Best regards,
 Igor Stasenko.
 
 
 It's not such a big task to review the current users, there are like 5 of 
 them in the base image.
 
 AFAICT:
 1) InputEventFetcher, this has been bug-fixed once already. No leaks as long 
 as it has a single entry in startup/shutdown lists.
 2) Sockets, which, to my knowledge work OK with the weak finalization.
 3) AsyncFile, only done correctly if #close'd at EOL. No weak cleanup done it 
 seems, could be changed to work like Sockets.
 4) StandardFileStream url opening, should be modified to use an ensure: 
 block. Only applicable when running in a browser though, unlikely to be a 
 large issue.
 5) NetNameResolver, never unregisters the semaphore, and leaks one whenever 
 network needs (re)initialization. Snapshot? Image quit? Arbitrary points 
 during execution? Reading the plugin source would tell the real cases I 
 guess. A probable culprit in this case, I would say.
 
 I opened http://code.google.com/p/pharo/issues/detail?id=5310 , which 
 contains proposed changes related to 3-5.
 
 I also opened 2 additional issues for things I ran into, but didn't do as it 
 wasn't worth the effort/strictly related:
 
 5311: Rewrite AsyncFile to have weak finalization for guaranteed cleanup of 
 external objects
 5312: Move StandardFileStream browserRequest protocol functionality to a 
 separate package, and deprecate the protocol itself.
 The main purpose of the methods in this protocol has nothing to do with 
 FileStreams, but rather performing navigation in a Browser when Pharo is run 
 as a plugin.
 
 Cheers,
 Henry
 
 
 




Re: [Pharo-project] garbage collection

2012-02-16 Thread Chris Muller
Ok.  I thought you were trying to figure out whether the majority of
the Semaphores you were seeing were due to Magma or not.  I have a
suspicion that they may be.  Which might be a concern since I didn't
realize there was a Semaphore limit..

I was suggesting that, since MaTimer references Mutex references
Semaphore, you could do:

Semaphore instanceCount - MaTimer instanceCount   The number of
Semaphores allocated due to Magma's use of MaTimer

 - Chris

On Thu, Feb 16, 2012 at 10:57 AM, Milan Mimica milan.mim...@gmail.com wrote:
 When Magma is down there are no instances of MaTimer. There are 3 instances
 of MaServerSocket though.

 On 15 February 2012 18:41, Chris Muller asquea...@gmail.com wrote:

 Milan, try checking whether the number of instances of MaTimer
 correlate to the number of instances of Semaphore you are seeing.

  - Chris

 On Tue, Feb 14, 2012 at 2:01 PM, Milan Mimica milan.mim...@gmail.com
 wrote:
  This is more of a GC theory question perhaps, but I do have practical
  problems, so: I'm trying to figure out how come my headless Pharo 1.3
  image
  with fairly recent Cog running Magma ran out of Semaphores. I know there
  is
  a fixed limit on number of semaphores Cog can handle, and only Magma and
  RFB
  server have been running on this image for two months, and there wasn't
  any
  heavy load whatsoever, so something must be leaking semaphores - or more
  likely - something must be leaking objects having reference(s) to
  semaphore(s). I am not leaking sockets btw.
 
  At the moment there is about 1400 instances of Semaphore class, and
  around
  400 after GC.
  So first question is: Suppose I haven't run GC manually, could the
  semaphore
  limit be hit?
 
  400 is still too high for a idling image, don't you think?
 
  Anyway, what I try next is to shut down Magma completely and try to
  clean
  the memory by hand. I notice some MaServerSockets are still floating
  around
  so I track the pointers and I find that all the references are circular!
  Question two: Does Pharo's GC solve circular references? If yes, how
  good is
  it at it?
 
  But then, thinking more about it, the whole running image is one big
  graph
  of circular references, you wouldn't want the GC to clean that :) So how
  does it really work? That's my naive view anyway.
 
  After I wrote all this I figure I'm better of taking a fresh new image
  and
  load what I need into it, even if I have to do it every two months. Not
  saving the image is also an option. Yeah, I think I'm going to do just
  that.
  I found my solution, at least this e-mail served for something. Since I
  don't have a blog I'll send it anyway.
 
 
  --
  Milan Mimica
 




 --
 Milan Mimica
 http://sparklet.sf.net



Re: [Pharo-project] garbage collection

2012-02-16 Thread Henrik Johansen

On Feb 17, 2012, at 3:01 AM, Chris Muller wrote:

 Ok.  I thought you were trying to figure out whether the majority of
 the Semaphores you were seeing were due to Magma or not.  I have a
 suspicion that they may be.  Which might be a concern since I didn't
 realize there was a Semaphore limit..

There isn't a limit to Semaphores per se, but there's (in Cog) a limit to the 
amount of Semaphores which can be registered in the ExternalSemaphoreTable 
(a.k.a. being available to signal by primitives).

In the base image the five cases I mentioned earlier are the only users, any 
wrongdoings on Magma's part would either be through something doing custom 
registering in that table, or misuse of base users, like reusing Sockets by 
sending certain messages, as mentioned in my first mail.

As per later mails though, network reinitialization is already one case in the 
base image where such leaks can occur , so it's not certain Magma is involved 
at all...

Cheers,
Henry 


Re: [Pharo-project] garbage collection

2012-02-15 Thread Henrik Johansen
I sort of doubt Magma uses anything registering external objects but the 
standard Sockets…
While interrupting finalization process _could_ be a culprit, I'd rather watch 
for something like what happened with the InputEventFetcher, where 
registration/deregistration ends up not being symmetric. 

Perhaps Magma tries to reuse existing Socket instances by calls to 
initialize:/acceptFrom: for example?

I think changing ExternalSemaphoreTable to a weak structure would be a really 
bad idea btw.
All of a sudden, you free up slots which were previously taken for insertion of 
old objects.

There is no guarantee the external user of the semaphore will stop using the 
index it was given just because the image no longer holds a reference to the 
object which used to occupy that index.

So if you register a new object in the same slot, in the case of Sockets at 
least, you could potentially end up responding to signals from both the old 
external user, and the new one.

TLDR; Any object registered in this table by definition needs explicit cleanup 
of external users before they are GC'd. Thus, making the table weak makes no 
sense.

Cheers,
Henry

On Feb 15, 2012, at 12:11 AM, Igor Stasenko wrote:

 On 15 February 2012 00:54, Milan Mimica milan.mim...@gmail.com wrote:
 On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:
 
 
 semaphores collect: [:sema |
sema -
(sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) ]
 
 Can you try invoking it on your image , look for those who has an
 empty array, which will mean that there is no references to it except
 semaphore table itself.
 
 
 There is 69 of such semaphores, out of hundreds in total. Not much :-/
 On a normal image there is only a few.
 
 
 So, we got a leak somewhere. Can you double-check,
 this is semaphores which in the list which
 when you inspect that list
 will show entries like
 
 a Semaphore() - #()
 
 but not a total number of entries.
 
 Oh, ok lets just change the code:
 
 | semaphores arr |
 
 arr := ExternalSemaphoreTable unprotectedExternalObjects.
 semaphores := arr reject: #isNil.
 
 semaphores reject: [:sema |
   (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) isEmpty not ]
 
 so, normally this code should answer an empty array.
 If not, then there's leak
 
 -- 
 Best regards,
 Igor Stasenko.
 




Re: [Pharo-project] garbage collection

2012-02-15 Thread Igor Stasenko
On 15 February 2012 11:26, Henrik Johansen henrik.s.johan...@veloxit.no wrote:
 I sort of doubt Magma uses anything registering external objects but the 
 standard Sockets…
 While interrupting finalization process _could_ be a culprit, I'd rather 
 watch for something like what happened with the InputEventFetcher, where 
 registration/deregistration ends up not being symmetric.

 Perhaps Magma tries to reuse existing Socket instances by calls to 
 initialize:/acceptFrom: for example?

 I think changing ExternalSemaphoreTable to a weak structure would be a really 
 bad idea btw.
 All of a sudden, you free up slots which were previously taken for insertion 
 of old objects.

 There is no guarantee the external user of the semaphore will stop using the 
 index it was given just because the image no longer holds a reference to the 
 object which used to occupy that index.

 So if you register a new object in the same slot, in the case of Sockets at 
 least, you could potentially end up responding to signals from both the old 
 external user, and the new one.

 TLDR; Any object registered in this table by definition needs explicit 
 cleanup of external users before they are GC'd. Thus, making the table weak 
 makes no sense.


Yes, that could happen.
Well, then the only option is to check what code producing leaks. And
that's not trivial, since
you cannot trace references back to semaphore's original owner. :(


-- 
Best regards,
Igor Stasenko.



Re: [Pharo-project] garbage collection

2012-02-15 Thread Chris Muller
Milan, try checking whether the number of instances of MaTimer
correlate to the number of instances of Semaphore you are seeing.

 - Chris

On Tue, Feb 14, 2012 at 2:01 PM, Milan Mimica milan.mim...@gmail.com wrote:
 This is more of a GC theory question perhaps, but I do have practical
 problems, so: I'm trying to figure out how come my headless Pharo 1.3 image
 with fairly recent Cog running Magma ran out of Semaphores. I know there is
 a fixed limit on number of semaphores Cog can handle, and only Magma and RFB
 server have been running on this image for two months, and there wasn't any
 heavy load whatsoever, so something must be leaking semaphores - or more
 likely - something must be leaking objects having reference(s) to
 semaphore(s). I am not leaking sockets btw.

 At the moment there is about 1400 instances of Semaphore class, and around
 400 after GC.
 So first question is: Suppose I haven't run GC manually, could the semaphore
 limit be hit?

 400 is still too high for a idling image, don't you think?

 Anyway, what I try next is to shut down Magma completely and try to clean
 the memory by hand. I notice some MaServerSockets are still floating around
 so I track the pointers and I find that all the references are circular!
 Question two: Does Pharo's GC solve circular references? If yes, how good is
 it at it?

 But then, thinking more about it, the whole running image is one big graph
 of circular references, you wouldn't want the GC to clean that :) So how
 does it really work? That's my naive view anyway.

 After I wrote all this I figure I'm better of taking a fresh new image and
 load what I need into it, even if I have to do it every two months. Not
 saving the image is also an option. Yeah, I think I'm going to do just that.
 I found my solution, at least this e-mail served for something. Since I
 don't have a blog I'll send it anyway.


 --
 Milan Mimica




Re: [Pharo-project] garbage collection

2012-02-14 Thread Sven Van Caekenberghe
Milan,

On 14 Feb 2012, at 21:01, Milan Mimica wrote:

 This is more of a GC theory question perhaps, but I do have practical 
 problems, so: I'm trying to figure out how come my headless Pharo 1.3 image 
 with fairly recent Cog running Magma ran out of Semaphores. I know there is a 
 fixed limit on number of semaphores Cog can handle, and only Magma and RFB 
 server have been running on this image for two months, and there wasn't any 
 heavy load whatsoever, so something must be leaking semaphores - or more 
 likely - something must be leaking objects having reference(s) to 
 semaphore(s). I am not leaking sockets btw.
 
 At the moment there is about 1400 instances of Semaphore class, and around 
 400 after GC.
 So first question is: Suppose I haven't run GC manually, could the semaphore 
 limit be hit?
 
 400 is still too high for a idling image, don't you think?
 
 Anyway, what I try next is to shut down Magma completely and try to clean the 
 memory by hand. I notice some MaServerSockets are still floating around so I 
 track the pointers and I find that all the references are circular!
 Question two: Does Pharo's GC solve circular references? If yes, how good is 
 it at it?
 
 But then, thinking more about it, the whole running image is one big graph of 
 circular references, you wouldn't want the GC to clean that :) So how does it 
 really work? That's my naive view anyway.
 
 After I wrote all this I figure I'm better of taking a fresh new image and 
 load what I need into it, even if I have to do it every two months. Not 
 saving the image is also an option. Yeah, I think I'm going to do just that. 
 I found my solution, at least this e-mail served for something. Since I don't 
 have a blog I'll send it anyway.
 
 
 -- 
 Milan Mimica

There was a semaphore related problem in 1.3 that was fixed some time ago.
Doing regular image saves was one of the factors involved.
Search the mailing list or issues list for semaphore.

Sven




Re: [Pharo-project] garbage collection

2012-02-14 Thread Milan Mimica
On 14 February 2012 21:09, Sven Van Caekenberghe s...@beta9.be wrote:


 There was a semaphore related problem in 1.3 that was fixed some time ago.
 Doing regular image saves was one of the factors involved.
 Search the mailing list or issues list for semaphore.


Nah, leaking one semaphore per image save is not a problem. I don't
save regularly. The remark on image saving was that when you save the
image, you save all the crap that is running, and it accumulates every
time. There is no point saving an image in production if you are persisting
data externally.
Besides that I don't remember anything related being fixed.


-- 
Milan Mimica
http://sparklet.sf.net


Re: [Pharo-project] garbage collection

2012-02-14 Thread Stéphane Ducasse
let us know because we should address that or at least documented it and be 
aware of the problem.
Tx

On Feb 14, 2012, at 9:21 PM, Milan Mimica wrote:

 On 14 February 2012 21:09, Sven Van Caekenberghe s...@beta9.be wrote:
 
 There was a semaphore related problem in 1.3 that was fixed some time ago.
 Doing regular image saves was one of the factors involved.
 Search the mailing list or issues list for semaphore.
 
 Nah, leaking one semaphore per image save is not a problem. I don't save 
 regularly. The remark on image saving was that when you save the image, you 
 save all the crap that is running, and it accumulates every time. There is no 
 point saving an image in production if you are persisting data externally.
 Besides that I don't remember anything related being fixed.
 
 
 -- 
 Milan Mimica
 http://sparklet.sf.net




Re: [Pharo-project] garbage collection

2012-02-14 Thread Sven Van Caekenberghe

On 14 Feb 2012, at 21:21, Milan Mimica wrote:

 On 14 February 2012 21:09, Sven Van Caekenberghe s...@beta9.be wrote:
 
 There was a semaphore related problem in 1.3 that was fixed some time ago.
 Doing regular image saves was one of the factors involved.
 Search the mailing list or issues list for semaphore.
 
 Nah, leaking one semaphore per image save is not a problem. I don't save 
 regularly. The remark on image saving was that when you save the image, you 
 save all the crap that is running, and it accumulates every time. There is no 
 point saving an image in production if you are persisting data externally.
 Besides that I don't remember anything related being fixed.

These are not necessarily related, but these are some of them:

http://code.google.com/p/pharo/issues/detail?id=4910
http://code.google.com/p/pharo/issues/detail?id=4768
http://code.google.com/p/pharo/issues/detail?id=4505





Re: [Pharo-project] garbage collection

2012-02-14 Thread Igor Stasenko
Just in time.

Before leaving home last week Friday, i sketched things to be checked
on next week.
And one of them was:
 - turning an external semaphore table to hold semaphores weakly.

The problem that currently a
Smalltalk externalSemaphoreTable
is an Array, means that even if in the rest of image nobody points to
some semaphore in that array,
it will be not GCed unless someone will cleanup the entry there.

Now the reasons why certain semaphores are leaked (and not cleaned up
in external semaphore table)
could be different, like abnormal process termination, forgetting
putting  #ensure: etc.
But by making that array to be weak array we can make sure that it
won't overflow with garbage which no-one uses.

And of course if it overflows because those semaphores is actually
used, then its another story.

On 14 February 2012 22:01, Milan Mimica milan.mim...@gmail.com wrote:
 This is more of a GC theory question perhaps, but I do have practical
 problems, so: I'm trying to figure out how come my headless Pharo 1.3 image
 with fairly recent Cog running Magma ran out of Semaphores. I know there is
 a fixed limit on number of semaphores Cog can handle, and only Magma and RFB
 server have been running on this image for two months, and there wasn't any
 heavy load whatsoever, so something must be leaking semaphores - or more
 likely - something must be leaking objects having reference(s) to
 semaphore(s). I am not leaking sockets btw.

 At the moment there is about 1400 instances of Semaphore class, and around
 400 after GC.
 So first question is: Suppose I haven't run GC manually, could the semaphore
 limit be hit?

 400 is still too high for a idling image, don't you think?

 Anyway, what I try next is to shut down Magma completely and try to clean
 the memory by hand. I notice some MaServerSockets are still floating around
 so I track the pointers and I find that all the references are circular!
 Question two: Does Pharo's GC solve circular references? If yes, how good is
 it at it?

 But then, thinking more about it, the whole running image is one big graph
 of circular references, you wouldn't want the GC to clean that :) So how
 does it really work? That's my naive view anyway.

 After I wrote all this I figure I'm better of taking a fresh new image and
 load what I need into it, even if I have to do it every two months. Not
 saving the image is also an option. Yeah, I think I'm going to do just that.
 I found my solution, at least this e-mail served for something. Since I
 don't have a blog I'll send it anyway.


 --
 Milan Mimica




-- 
Best regards,
Igor Stasenko.



Re: [Pharo-project] garbage collection

2012-02-14 Thread Milan Mimica
Ah great! I knew something weird was going on. It will be much easier to
detect possible semaphore leakage once the VM itself stops leaking them.


On 14 February 2012 22:38, Igor Stasenko siguc...@gmail.com wrote:

 Just in time.

 Before leaving home last week Friday, i sketched things to be checked
 on next week.
 And one of them was:
  - turning an external semaphore table to hold semaphores weakly.

 The problem that currently a
 Smalltalk externalSemaphoreTable
 is an Array, means that even if in the rest of image nobody points to
 some semaphore in that array,
 it will be not GCed unless someone will cleanup the entry there.

 Now the reasons why certain semaphores are leaked (and not cleaned up
 in external semaphore table)
 could be different, like abnormal process termination, forgetting
 putting  #ensure: etc.
 But by making that array to be weak array we can make sure that it
 won't overflow with garbage which no-one uses.

 And of course if it overflows because those semaphores is actually
 used, then its another story.

 On 14 February 2012 22:01, Milan Mimica milan.mim...@gmail.com wrote:
  This is more of a GC theory question perhaps, but I do have practical
  problems, so: I'm trying to figure out how come my headless Pharo 1.3
 image
  with fairly recent Cog running Magma ran out of Semaphores. I know there
 is
  a fixed limit on number of semaphores Cog can handle, and only Magma and
 RFB
  server have been running on this image for two months, and there wasn't
 any
  heavy load whatsoever, so something must be leaking semaphores - or more
  likely - something must be leaking objects having reference(s) to
  semaphore(s). I am not leaking sockets btw.
 
  At the moment there is about 1400 instances of Semaphore class, and
 around
  400 after GC.
  So first question is: Suppose I haven't run GC manually, could the
 semaphore
  limit be hit?
 
  400 is still too high for a idling image, don't you think?
 
  Anyway, what I try next is to shut down Magma completely and try to clean
  the memory by hand. I notice some MaServerSockets are still floating
 around
  so I track the pointers and I find that all the references are circular!
  Question two: Does Pharo's GC solve circular references? If yes, how
 good is
  it at it?
 
  But then, thinking more about it, the whole running image is one big
 graph
  of circular references, you wouldn't want the GC to clean that :) So how
  does it really work? That's my naive view anyway.
 
  After I wrote all this I figure I'm better of taking a fresh new image
 and
  load what I need into it, even if I have to do it every two months. Not
  saving the image is also an option. Yeah, I think I'm going to do just
 that.
  I found my solution, at least this e-mail served for something. Since I
  don't have a blog I'll send it anyway.
 
 
  --
  Milan Mimica
 



 --
 Best regards,
 Igor Stasenko.




-- 
Milan Mimica
http://sparklet.sf.net


Re: [Pharo-project] garbage collection

2012-02-14 Thread Igor Stasenko
On 14 February 2012 23:45, Milan Mimica milan.mim...@gmail.com wrote:
 Ah great! I knew something weird was going on. It will be much easier to
 detect possible semaphore leakage once the VM itself stops leaking them.

VM cannot leak semaphores because their lifetime are controlled by image.
The change i proposing is in image, not VM.

Here the small snippet of code i wrote to check if every semaphore
registered in external semaphore table
belongs to something, but not just held by table itself:

| semaphores arr |

arr := ExternalSemaphoreTable unprotectedExternalObjects.
semaphores := arr reject: #isNil.

semaphores collect: [:sema |
sema -
(sema pointersTo reject: [:ptr | ptr == arr or: [ptr == 
semaphores ] ] ) ]

Can you try invoking it on your image , look for those who has an
empty array, which will mean that there is no references to it except
semaphore table itself.



 On 14 February 2012 22:38, Igor Stasenko siguc...@gmail.com wrote:

 Just in time.

 Before leaving home last week Friday, i sketched things to be checked
 on next week.
 And one of them was:
  - turning an external semaphore table to hold semaphores weakly.

 The problem that currently a
 Smalltalk externalSemaphoreTable
 is an Array, means that even if in the rest of image nobody points to
 some semaphore in that array,
 it will be not GCed unless someone will cleanup the entry there.

 Now the reasons why certain semaphores are leaked (and not cleaned up
 in external semaphore table)
 could be different, like abnormal process termination, forgetting
 putting  #ensure: etc.
 But by making that array to be weak array we can make sure that it
 won't overflow with garbage which no-one uses.

 And of course if it overflows because those semaphores is actually
 used, then its another story.

 On 14 February 2012 22:01, Milan Mimica milan.mim...@gmail.com wrote:
  This is more of a GC theory question perhaps, but I do have practical
  problems, so: I'm trying to figure out how come my headless Pharo 1.3
  image
  with fairly recent Cog running Magma ran out of Semaphores. I know there
  is
  a fixed limit on number of semaphores Cog can handle, and only Magma and
  RFB
  server have been running on this image for two months, and there wasn't
  any
  heavy load whatsoever, so something must be leaking semaphores - or more
  likely - something must be leaking objects having reference(s) to
  semaphore(s). I am not leaking sockets btw.
 
  At the moment there is about 1400 instances of Semaphore class, and
  around
  400 after GC.
  So first question is: Suppose I haven't run GC manually, could the
  semaphore
  limit be hit?
 
  400 is still too high for a idling image, don't you think?
 
  Anyway, what I try next is to shut down Magma completely and try to
  clean
  the memory by hand. I notice some MaServerSockets are still floating
  around
  so I track the pointers and I find that all the references are circular!
  Question two: Does Pharo's GC solve circular references? If yes, how
  good is
  it at it?
 
  But then, thinking more about it, the whole running image is one big
  graph
  of circular references, you wouldn't want the GC to clean that :) So how
  does it really work? That's my naive view anyway.
 
  After I wrote all this I figure I'm better of taking a fresh new image
  and
  load what I need into it, even if I have to do it every two months. Not
  saving the image is also an option. Yeah, I think I'm going to do just
  that.
  I found my solution, at least this e-mail served for something. Since I
  don't have a blog I'll send it anyway.
 
 
  --
  Milan Mimica
 



 --
 Best regards,
 Igor Stasenko.




 --
 Milan Mimica
 http://sparklet.sf.net



-- 
Best regards,
Igor Stasenko.



Re: [Pharo-project] garbage collection

2012-02-14 Thread Milan Mimica
On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:


 semaphores collect: [:sema |
sema -
(sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) ]

 Can you try invoking it on your image , look for those who has an
 empty array, which will mean that there is no references to it except
 semaphore table itself.


There is 69 of such semaphores, out of hundreds in total. Not much :-/
On a normal image there is only a few.


-- 
Milan Mimica
http://sparklet.sf.net


Re: [Pharo-project] garbage collection

2012-02-14 Thread Igor Stasenko
On 15 February 2012 00:54, Milan Mimica milan.mim...@gmail.com wrote:
 On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:


 semaphores collect: [:sema |
        sema -
                (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) ]

 Can you try invoking it on your image , look for those who has an
 empty array, which will mean that there is no references to it except
 semaphore table itself.


 There is 69 of such semaphores, out of hundreds in total. Not much :-/
 On a normal image there is only a few.


So, we got a leak somewhere. Can you double-check,
this is semaphores which in the list which
when you inspect that list
will show entries like

a Semaphore() - #()

but not a total number of entries.

Oh, ok lets just change the code:

| semaphores arr |

arr := ExternalSemaphoreTable unprotectedExternalObjects.
semaphores := arr reject: #isNil.

semaphores reject: [:sema |
   (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
semaphores ] ] ) isEmpty not ]

so, normally this code should answer an empty array.
If not, then there's leak

-- 
Best regards,
Igor Stasenko.



Re: [Pharo-project] garbage collection

2012-02-14 Thread Igor Stasenko
On 15 February 2012 01:11, Igor Stasenko siguc...@gmail.com wrote:
 On 15 February 2012 00:54, Milan Mimica milan.mim...@gmail.com wrote:
 On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:


 semaphores collect: [:sema |
        sema -
                (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) ]

 Can you try invoking it on your image , look for those who has an
 empty array, which will mean that there is no references to it except
 semaphore table itself.


 There is 69 of such semaphores, out of hundreds in total. Not much :-/
 On a normal image there is only a few.


 So, we got a leak somewhere. Can you double-check,
 this is semaphores which in the list which
 when you inspect that list
 will show entries like

 a Semaphore() - #()

 but not a total number of entries.

 Oh, ok lets just change the code:

 | semaphores arr |

 arr := ExternalSemaphoreTable unprotectedExternalObjects.
 semaphores := arr reject: #isNil.

 semaphores reject: [:sema |
       (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) isEmpty not ]

 so, normally this code should answer an empty array.
 If not, then there's leak


btw, i found it strange that #pointersTo does not reports a context of
closure, which apparently
holds a strong reference to semaphore, i.e. the following must yield true:


| sema |
sema := Semaphore new.
sema pointersTo includes: thisContext



-- 
Best regards,
Igor Stasenko.



Re: [Pharo-project] garbage collection

2012-02-14 Thread Igor Stasenko
On 15 February 2012 01:18, Igor Stasenko siguc...@gmail.com wrote:
 On 15 February 2012 01:11, Igor Stasenko siguc...@gmail.com wrote:
 On 15 February 2012 00:54, Milan Mimica milan.mim...@gmail.com wrote:
 On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:


 semaphores collect: [:sema |
        sema -
                (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) ]

 Can you try invoking it on your image , look for those who has an
 empty array, which will mean that there is no references to it except
 semaphore table itself.


 There is 69 of such semaphores, out of hundreds in total. Not much :-/
 On a normal image there is only a few.


 So, we got a leak somewhere. Can you double-check,
 this is semaphores which in the list which
 when you inspect that list
 will show entries like

 a Semaphore() - #()

 but not a total number of entries.

 Oh, ok lets just change the code:

 | semaphores arr |

 arr := ExternalSemaphoreTable unprotectedExternalObjects.
 semaphores := arr reject: #isNil.

 semaphores reject: [:sema |
       (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) isEmpty not ]

 so, normally this code should answer an empty array.
 If not, then there's leak


 btw, i found it strange that #pointersTo does not reports a context of
 closure, which apparently
 holds a strong reference to semaphore, i.e. the following must yield true:


 | sema |
 sema := Semaphore new.
 sema pointersTo includes: thisContext

ah, ok, it seems to be intended by implementation:

objectsToAlwaysExclude := {
thisContext.
thisContext sender.
thisContext sender sender.
objectsToExclude.
}.



 --
 Best regards,
 Igor Stasenko.



-- 
Best regards,
Igor Stasenko.



Re: [Pharo-project] garbage collection

2012-02-14 Thread Milan Mimica
| semaphores arr res |

arr := ExternalSemaphoreTable unprotectedExternalObjects.
semaphores := arr reject: #isNil.

res := semaphores collect: [:sema | sema pointersTo reject: [:ptr | ptr ==
arr or: [ptr == semaphores ] ] ].
res := res select: [ :each | each isEmpty ].
res size.

Yes, that's what I did, I'm sure. All of my images, except a fresh 1.4,
answer a number 0.

On 15 February 2012 00:11, Igor Stasenko siguc...@gmail.com wrote:

 On 15 February 2012 00:54, Milan Mimica milan.mim...@gmail.com wrote:
  On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:
 
 
  semaphores collect: [:sema |
 sema -
 (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
  semaphores ] ] ) ]
 
  Can you try invoking it on your image , look for those who has an
  empty array, which will mean that there is no references to it except
  semaphore table itself.
 
 
  There is 69 of such semaphores, out of hundreds in total. Not much :-/
  On a normal image there is only a few.
 

 So, we got a leak somewhere. Can you double-check,
 this is semaphores which in the list which
 when you inspect that list
 will show entries like

 a Semaphore() - #()

 but not a total number of entries.

 Oh, ok lets just change the code:

 | semaphores arr |

 arr := ExternalSemaphoreTable unprotectedExternalObjects.
 semaphores := arr reject: #isNil.

 semaphores reject: [:sema |
(sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) isEmpty not ]

 so, normally this code should answer an empty array.
 If not, then there's leak

 --
 Best regards,
 Igor Stasenko.




-- 
Milan Mimica
http://sparklet.sf.net


Re: [Pharo-project] garbage collection

2012-02-14 Thread Igor Stasenko
So, what i suggest you to do is to replace Array with WeakArray in

ExternalSemaphoreTableclearExternalObjects

and restart the image, so change will be put in effect.

And report an observation if it cures the problem (and not adds new ones ;).

On 15 February 2012 01:23, Milan Mimica milan.mim...@gmail.com wrote:
 | semaphores arr res |

 arr := ExternalSemaphoreTable unprotectedExternalObjects.
 semaphores := arr reject: #isNil.

 res := semaphores collect: [:sema | sema pointersTo reject: [:ptr | ptr ==
 arr or: [ptr == semaphores ] ] ].
 res := res select: [ :each | each isEmpty ].
 res size.

 Yes, that's what I did, I'm sure. All of my images, except a fresh 1.4,
 answer a number 0.


 On 15 February 2012 00:11, Igor Stasenko siguc...@gmail.com wrote:

 On 15 February 2012 00:54, Milan Mimica milan.mim...@gmail.com wrote:
  On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:
 
 
  semaphores collect: [:sema |
         sema -
                 (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
  semaphores ] ] ) ]
 
  Can you try invoking it on your image , look for those who has an
  empty array, which will mean that there is no references to it except
  semaphore table itself.
 
 
  There is 69 of such semaphores, out of hundreds in total. Not much :-/
  On a normal image there is only a few.
 

 So, we got a leak somewhere. Can you double-check,
 this is semaphores which in the list which
 when you inspect that list
 will show entries like

 a Semaphore() - #()

 but not a total number of entries.

 Oh, ok lets just change the code:

 | semaphores arr |

 arr := ExternalSemaphoreTable unprotectedExternalObjects.
 semaphores := arr reject: #isNil.

 semaphores reject: [:sema |
       (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) isEmpty not ]

 so, normally this code should answer an empty array.
 If not, then there's leak

 --
 Best regards,
 Igor Stasenko.




 --
 Milan Mimica
 http://sparklet.sf.net



-- 
Best regards,
Igor Stasenko.



Re: [Pharo-project] garbage collection

2012-02-14 Thread Igor Stasenko
.. and perhaps we should tell Chris to check Magma code about
potential leak by preventing unregistering external semaphores.
of course, that could be Pharo bug as well.

On 15 February 2012 02:11, Igor Stasenko siguc...@gmail.com wrote:
 So, what i suggest you to do is to replace Array with WeakArray in

 ExternalSemaphoreTableclearExternalObjects

 and restart the image, so change will be put in effect.

 And report an observation if it cures the problem (and not adds new ones ;).

 On 15 February 2012 01:23, Milan Mimica milan.mim...@gmail.com wrote:
 | semaphores arr res |

 arr := ExternalSemaphoreTable unprotectedExternalObjects.
 semaphores := arr reject: #isNil.

 res := semaphores collect: [:sema | sema pointersTo reject: [:ptr | ptr ==
 arr or: [ptr == semaphores ] ] ].
 res := res select: [ :each | each isEmpty ].
 res size.

 Yes, that's what I did, I'm sure. All of my images, except a fresh 1.4,
 answer a number 0.


 On 15 February 2012 00:11, Igor Stasenko siguc...@gmail.com wrote:

 On 15 February 2012 00:54, Milan Mimica milan.mim...@gmail.com wrote:
  On 14 February 2012 22:55, Igor Stasenko siguc...@gmail.com wrote:
 
 
  semaphores collect: [:sema |
         sema -
                 (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
  semaphores ] ] ) ]
 
  Can you try invoking it on your image , look for those who has an
  empty array, which will mean that there is no references to it except
  semaphore table itself.
 
 
  There is 69 of such semaphores, out of hundreds in total. Not much :-/
  On a normal image there is only a few.
 

 So, we got a leak somewhere. Can you double-check,
 this is semaphores which in the list which
 when you inspect that list
 will show entries like

 a Semaphore() - #()

 but not a total number of entries.

 Oh, ok lets just change the code:

 | semaphores arr |

 arr := ExternalSemaphoreTable unprotectedExternalObjects.
 semaphores := arr reject: #isNil.

 semaphores reject: [:sema |
       (sema pointersTo reject: [:ptr | ptr == arr or: [ptr ==
 semaphores ] ] ) isEmpty not ]

 so, normally this code should answer an empty array.
 If not, then there's leak

 --
 Best regards,
 Igor Stasenko.




 --
 Milan Mimica
 http://sparklet.sf.net



 --
 Best regards,
 Igor Stasenko.



-- 
Best regards,
Igor Stasenko.