Re: When to call code after the GC

Ricardo Mendes <[email protected]>
Newsgroups gmane.comp.windows.devel.dotnet.rotor
Organization GSD / Inesc-ID
Message-ID <002001c35123$9b5a2fb0$2c05c192@Capitulina>
Hello again,

The advice you gave me was correct. I was able to call the function I
wanted, but I got a "Detected the use of a corrupted OBJREF: Possible GC
Hole" exception.
The method executes correctly, but then I get the exception....
I am calling the method inside the helper frame in the FCIMPL1(void,
GCInterface::CollectGeneration, INT32 generation) method (in the
comutilnative.cpp file), after the call to
g_pGCHeap->GarbageCollect(generation);

Is it necessary to erect another helper frame? If so, how is it done? I
tried to do so by adding another
HELPER_METHOD_FRAME_BEGIN_0();

after the other frame ended, but it didn't compile....

Thanks in advance for any help

Ricardo Mendes
Distributed Systems Group
INESC-ID Lisbon, Portugal


----- Original Message -----
From: "Jan Kotas" <[email protected]>
To: <[email protected]>
Sent: Monday, July 14, 2003 4:52 PM
Subject: Re: [DOTNET-ROTOR] When to call code after the GC


> - The parameter for g_Mscorlib.GetMethod should be
> METHOD__GC_MANAGER_2__GC_GO in your case. It is
> METHOD__##classid##__##methodid.
>
> - I don't think you can omit the first ARG_SLOT * parameter for
> pMD->Call(...). You can use NULL since you are not passing any
> parameters.
>
> - Your "Go" method takes one hidden "This" parameter since it is
> instance method. You should change the Go method to be static in C#.
>
> -Jan
>
> This posting is provided "AS IS" with no warranties, and confers no
> rights.
>
> -----Original Message-----
> From: Discussion of the Rotor Shared Source CLI implementation
> [mailto:[email protected]] On Behalf Of Ricardo Mendes
> Sent: Sunday, July 13, 2003 6:07 AM
> To: [email protected]
> Subject: Re: [DOTNET-ROTOR] When to call code after the GC
>
> I tried what you suggested but it didn't work. I think I might have
> missed
> something.
> I created a test class and a test method in "identity.cs"
> (system\runtime\remoting), with the following code:
>
> public class GCManager2
> {
>     public int counter;
>     public Hashtable testTable = new Hashtable( );
>     public GCManager2( )
>     {
>         counter = 0;
>     }
>
>     public void Go( )
>     {
>         testTable.Add( counter.ToString(), counter );
>         counter++;
>     }
> }
>
> Then I added the following lines to "mscorlib.h":
>
> DEFINE_CLASS(GC_MANAGER_2, Remoting, GCManager2)
> DEFINE_METHOD(GC_MANAGER_2, GC_GO, Go, IM_RetVoid)
>
> Then in "comutilnative.cpp" I included mscorlib.h and added the
> following
> lines between the helper frames
> in GCInterface::CollectGeneration:
>
> MethodDesc *pMD = g_Mscorlib.GetMethod(GC_GO);
> pMD->Call(GC_GO);
>
> But when I build Rotor I get an error message because GC_GO is an
> unknown
> identifier.
>
> Where did I go wrong?
>
> Thanks again for any help,
>
> Ricardo Mendes
> Distributed Systems Group
> INESC-ID Lisbon, Portugal
>
>
> ----- Original Message -----
> From: "Jan Kotas" <[email protected]>
> To: <[email protected]>
> Sent: Monday, July 07, 2003 4:36 PM
> Subject: Re: [DOTNET-ROTOR] When to call code after the GC
>
>
> > MethodDesc::Call is used in the EE itself to call the managed code.
> Here
> > is an example from comutilnative.cpp:
> >
> >         MethodDesc *pMD =
> > g_Mscorlib.GetMethod(METHOD__EXCEPTION__GET_MESSAGE);
> >
> >         ARG_SLOT GetMessageArgs[] = { ObjToArgSlot(objException) };
> >         MessageString =
> > (STRINGREF)ArgSlotToObj(pMD->Call(GetMessageArgs,
> > METHOD__EXCEPTION__GET_MESSAGE));
> >
> >
> > In order to call your own method from the EE code, you need to add an
> > entry in clr\src\vm\mscorlib.h. Entry in mscorlib.h will give you the
> > METHOD__XXX constant. If your method has unusual signature, you may
> also
> > need to add an entry to clr\src\vm\metasig.h in order to complete the
> > entry in mscorlib.h.
> >
> > MethodDesc::Call should be used inside
> > HELPER_METHOD_FRAME_BEGIN/HELPER_METHOD_FRAME_END since it needs a
> valid
> > frame to be erected.
> >
> > If your method is not in mscorlib, I would recommend adding a small
> > method to mscorlib that will call your non-mscorlib method. Check
> > LoadISymWrapper method in
> > clr\src\BCL\System\Reflection\Emit\AssemblyBuilder.cs to see how to do
> > it.
> >
> > -Jan
> >
> > This posting is provided "AS IS" with no warranties, and confers no
> > rights.
> >
> > -----Original Message-----
> > From: Discussion of the Rotor Shared Source CLI implementation
> > [mailto:[email protected]] On Behalf Of Ricardo Mendes
> > Sent: Monday, July 07, 2003 8:13 AM
> > To: [email protected]
> > Subject: [DOTNET-ROTOR] When to call code after the GC
> >
> > Hello all,
> >
> > What is the best place to call managed code after a GC? I tried to
> call
> > managed code after the
> > HELPER_METHOD_FRAME_END(); call in the
> > FCIMPL1(void, GCInterface::CollectGeneration, INT32 generation) method
> > (in
> > the comutilnative.cpp file)
> > but it just keeps on firing assertions. I want to call managed code
> > using
> > something like FFI. It would be great
> > to call the code I want from managed code but I don't know if it's
> > possible.
> > Any ideas regarding a place in which I can call managed code safely
> > after a
> > GC?
> >
> > Thanks in advance for any help...
> >
> > Ricardo Mendes
> > Distributed Systems Group
> > INESC-ID Lisbon, Portugal
> >
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.