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 <000001c349e8$1e9dbc40$2c05c192@Capitulina>
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.