Yep - ScriptScope.InitializeLifetimeService now returns null in 2.6.  And doing 
the same in MbrBase will make it stay alive forever as well.

From: users-boun...@lists.ironpython.com 
[mailto:users-boun...@lists.ironpython.com] On Behalf Of mohammad mustaq
Sent: Wednesday, August 11, 2010 7:25 PM
To: Discussion of IronPython
Subject: Re: [IronPython] Query regarding Proxy Object lease period


I am using IronPython 2.0.When you said ScriptScope is returning null did you 
mean ScriptScope.InitializeLifetimeService() is returning null. So do you mean 
to say that overriding "InitializeLifetimeService" in MbrBase is sufficient to 
keep the hosting API objects alive.
On Wed, Aug 11, 2010 at 10:26 PM, Dino Viehland 
<di...@microsoft.com<mailto:di...@microsoft.com>> wrote:
What version of IronPython are you using?  When I try this against 2.6.1 
ScriptScope is "properly" returning null.    I would recommend seeing how the 
lifetime issue stacks up w/ everything returning null.    I think long term we 
need to provide an API that lets you provide the sponsors for hosting API 
objects but until we do that leasing your own objects may be futile unless 
there a whole lot of them in comparison to the hosting API objects.  I actually 
 haven't done the leasing stuff myself either so I'm not sure I can quickly 
cook up an example.

From: 
users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com> 
[mailto:users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com>]
 On Behalf Of mohammad mustaq
Sent: Wednesday, August 11, 2010 7:30 AM
To: Discussion of IronPython
Subject: Re: [IronPython] Query regarding Proxy Object lease period


I did override "InitializeLifetimeService" in MbrBase to return null. But in my 
example the "scope" object dies at first instance, so how would overriding 
"InitializeLifetimeService" in MbrBase help. Could you please modify my code to 
illustrate the right usage of ISponsor on the client side.

My application will create objects periodically in the appdomain and execute 
methods implemented in IronPython. These methods may take around 20 minutes to 
execute. The whole application may run for a day or more. So I need to take 
this into consideration while implementing the lifetime service.

I needed to confirm one thing. Do i need to provide the lease period for all 
objects created in the Appdomain. As per the code given below do i need to 
provide the lease period for "code","scope","mbr","script", "ops" etc.
Or is it only based on how long I expect the object to be alive.

I am new to this concept of Appdomain hence my questions may sound silly.
On Tue, Aug 10, 2010 at 10:15 PM, Dino Viehland 
<di...@microsoft.com<mailto:di...@microsoft.com>> wrote:
The trick to keeping an object alive isn't to call InitializeLifetimeService 
yourself but instead to return an appropriate lease.  For example if you 
overrode InitializeLifetimeService in MbrBase to always return null your object 
will be kept alive forever.  That will work fine as long as the app domain 
isn't living for an extremely long time or that you have a limited number of 
these MBROs that you're creating in the app domain.

We still have this problem to solve in the DLR as well where we're still 
returning null.  I think  the correct solution is that we need to use 
ISponsor's (ClientSPonsor provides an implementation of this) on the client 
side and then call ILease.Register so the object can call back to your sponser.

From: 
users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com> 
[mailto:users-boun...@lists.ironpython.com<mailto:users-boun...@lists.ironpython.com>]
 On Behalf Of mohammad mustaq
Sent: Tuesday, August 10, 2010 6:43 AM
To: Discussion of IronPython
Subject: [IronPython] Query regarding Proxy Object lease period


Hi,

I posted this last week and I did not get a response.Hence posting it again.

I have an application that creates a python engine in a new appdomain. If I do 
not specify a lease period I see that the objects are disconnected when I leave 
it idle for a period of 5 minutes. I used "InitializeLifetimeService" to keep 
the object alive forever but it did not work. The "dlr-spec-hosting" document 
mentions the following in page 93 under "Current Issues" section : "Currently 
if you do not use a host for 15 min, it dies, and you lose your data. We've 
added InitializeLifetimeService on objects to cause them to stay alive forever, 
but we need to think through the design and the host controls here". Currently 
I renew the object using "ILease". I do not know if this is the right thing to 
do. Could you please suggest me the right way to deal with this issue. I have 
provided the code below for your reference.

Thanks,
Mustaq

using System;
using Microsoft.Scripting;
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime;

class Foo
{
    public static void Main(string[] args)
    {
        AppDomain ad = AppDomain.CreateDomain("foo");
        ScriptEngine engine = Python.CreateEngine(ad);
        engine.Runtime.LoadAssembly(typeof(MbrBase).Assembly);

        ScriptSource code = engine.CreateScriptSourceFromString(@"
import MbrBase
class C(MbrBase):
    def Test_C(self, log):
        print 0
a = C()
", SourceCodeKind.Statements);

        ScriptScope scope = engine.CreateScope();
        ILease lifeTime = (ILease)scope.InitializeLifetimeService(); // Is this 
supposed to keep the object alive forever.

        lifeTime.Renew(TimeSpan.FromDays(1)); // Provided a lease for one day.
        code.Execute(scope);  // If the above lease is not mentioned then 
execution fails on this line after being inactive for 5 minutes.

        Console.WriteLine("Trying to do it... {0}", 
AppDomain.CurrentDomain.Id<http://AppDomain.CurrentDomain.Id>);
        MbrBase mbr = (MbrBase)scope.GetVariable("a");

        string isSubClassCode = String.Format("issubclass({0},{1})", "C", 
"MbrBase");
        ScriptSource script = 
engine.CreateScriptSourceFromString(isSubClassCode, SourceCodeKind.Expression);
        bool result = (bool)script.Execute(scope);

        if (result == true)
        {
            ObjectOperations ops = engine.Operations;
            ObjectHandle subClass = scope.GetVariableHandle("C");    // get 
back a handle
            ObjectHandle instance = ops.Call(subClass, new ObjectHandle[0]);  
// invoke the handle to create an instance
            mbr = instance.Unwrap() as MbrBase;  // now we know we have an MBR 
and we can unwrap it to our local side

            ObjectHandle temp = ops.GetMember(instance, "Test_C");
            object log = null;
            ops.Call(temp, log);
        }

        mbr.DoItVirtually();
        mbr.DoIt();
        Console.ReadKey();
    }
}

public class MbrBase : MarshalByRefObject
{
    public virtual void DoItVirtually()
    {
        Console.WriteLine("Did it virtually {0}", 
AppDomain.CurrentDomain.Id<http://AppDomain.CurrentDomain.Id>);
    }

    public void DoIt()
    {
        Console.WriteLine("Did it {0}", 
AppDomain.CurrentDomain.Id<http://AppDomain.CurrentDomain.Id>);
    }
}



_______________________________________________
Users mailing list
Users@lists.ironpython.com<mailto:Users@lists.ironpython.com>
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com


_______________________________________________
Users mailing list
Users@lists.ironpython.com<mailto:Users@lists.ironpython.com>
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

_______________________________________________
Users mailing list
Users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to