Hi

I have an application written in VB.NET for windows mobile 2005
device. In addition I have 2 unmanaged DLL's written in C which the VB
app uses.

The app runs absolutely fine until the system garbage collector gets
triggered, at which point one of my DLL's (in which I create a
separate thread for some sound recording task) thread gets suspended
and never gets up after that. At this point my application just stops
working.

Is there any way I can mark my THREAD as GC-SAFE so that GC just
bypasses it during its sweep operations.

The intriguiing part is, if I manually trigger the GC with the
following lines (executing these lines quite regularly)

GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()

then it seems to be working fine, even when the GC is virtually always
on.

Anyone has any say on this please advise as I am not convinced with
calling the GC commands from within the application.

Cheers
Sid

Re: Garbage Collector Trauma by ctacke/>

ctacke/>
Fri Feb 15 07:43:22 CST 2008

Are you saying a thread in the *native* DLL is getting suspended? If so
then that's not possible as the GC knows nothing about the threads and
cannot and will not affect them. THis sounds a lot more like a pinning
problem to me. Like your native thread is using some data from the managed
app and when GC happens that managed data is getting moved during a
compaction (which doesn't happen with every GC and would explain why it
doesn't happen when you manually call collect). With what little info we
have so far, my bet is you're passing in a variable that is getting used in
the native DLL - probably being sent by reference - that you're not pinning.


--

Chris Tacke, Embedded MVP
OpenNETCF Consulting
Giving back to the embedded community
http://community.OpenNETCF.com




"sid" <mailsid@gmail.com> wrote in message
news:25261b1a-081c-4e1a-aefc-43eb9ef4373e@d4g2000prg.googlegroups.com...
> Hi
>
> I have an application written in VB.NET for windows mobile 2005
> device. In addition I have 2 unmanaged DLL's written in C which the VB
> app uses.
>
> The app runs absolutely fine until the system garbage collector gets
> triggered, at which point one of my DLL's (in which I create a
> separate thread for some sound recording task) thread gets suspended
> and never gets up after that. At this point my application just stops
> working.
>
> Is there any way I can mark my THREAD as GC-SAFE so that GC just
> bypasses it during its sweep operations.
>
> The intriguiing part is, if I manually trigger the GC with the
> following lines (executing these lines quite regularly)
>
> GC.Collect()
> GC.WaitForPendingFinalizers()
> GC.Collect()
>
> then it seems to be working fine, even when the GC is virtually always
> on.
>
> Anyone has any say on this please advise as I am not convinced with
> calling the GC commands from within the application.
>
> Cheers
> Sid



Re: Garbage Collector Trauma by sid

sid
Fri Feb 15 08:59:34 CST 2008

On 15 Feb, 13:43, "<ctacke/>" <ctacke[at]opennetcf[dot]com> wrote:
> Are you saying a thread in the *native* DLL is getting suspended? =A0If so=

> then that's not possible as the GC knows nothing about the threads and
> cannot and will not affect them. =A0THis sounds a lot more like a pinning
> problem to me. =A0Like your native thread is using some data from the mana=
ged
> app and when GC happens that managed data is getting moved during a
> compaction (which doesn't happen with every GC and would explain why it
> doesn't happen when you manually call collect). =A0With what little info w=
e
> have so far, my bet is you're passing in a variable that is getting used i=
n
> the native DLL - probably being sent by reference - that you're not pinnin=
g.
>
> --
>
> Chris Tacke, Embedded MVP
> OpenNETCF Consulting
> Giving back to the embedded communityhttp://community.OpenNETCF.com
>
> "sid" <mail...@gmail.com> wrote in message
>
> news:25261b1a-081c-4e1a-aefc-43eb9ef4373e@d4g2000prg.googlegroups.com...
>
>
>
> > Hi
>
> > I have an application written in VB.NET for windows mobile 2005
> > device. In addition I have 2 unmanaged DLL's written in C which the VB
> > app uses.
>
> > The app runs absolutely fine until the system garbage collector gets
> > triggered, at which point one of my DLL's (in which I create a
> > separate thread for some sound recording task) thread gets suspended
> > and never gets up after that. At this point my application just stops
> > working.
>
> > Is there any way I can mark my THREAD as GC-SAFE so that GC just
> > bypasses it during its sweep operations.
>
> > The intriguiing part is, if I manually trigger the GC with the
> > following lines (executing these lines quite regularly)
>
> > GC.Collect()
> > GC.WaitForPendingFinalizers()
> > GC.Collect()
>
> > then it seems to be working fine, even when the GC is virtually always
> > on.
>
> > Anyone has any say on this please advise as I am not convinced with
> > calling the GC commands from within the application.
>
> > Cheers
> > Sid- Hide quoted text -
>
> - Show quoted text -

Yes I am sending a few variables from the VB.NET to the C-DLL through
DLL function calls. But all of them seem to be going ByVal. Are
strings sent ByRef even if you send it ByVal. There are only two
variables I send ByRef, but I suspect the problem is with them. I am
still in the process of checking it..