Please do not reply to this email- if you want to comment on the bug, go to the URL shown below and enter your comments there.
Changed by [EMAIL PROTECTED] http://bugzilla.ximian.com/show_bug.cgi?id=82490 --- shadow/82490 2007-08-19 15:55:38.000000000 -0400 +++ shadow/82490.tmp.7207 2007-08-19 15:55:38.000000000 -0400 @@ -0,0 +1,148 @@ +Bug#: 82490 +Product: Mono: Runtime +Version: 1.2 +OS: +OS Details: +Status: NEW +Resolution: +Severity: +Priority: Normal +Component: remoting +AssignedTo: [EMAIL PROTECTED] +ReportedBy: [EMAIL PROTECTED] +QAContact: [EMAIL PROTECTED] +TargetMilestone: --- +URL: +Cc: +Summary: ContextStatic variable initializer doesn't work + +The per-context variable, like: + +[ContextStatic] +static int foo = 10; + +is not initialized to given value. I would expect it to initialize to 10 in +all contexts (like both static and non-static variables work). It appears, +that the initializer is called only first time the variable is used. This +is clearly shown with this example: + +using System; +using System.Runtime.Remoting.Contexts; + + +class GeneratorAttribute : ContextAttribute +{ + public GeneratorAttribute () + : base ("generator") + { + } +} + +[ Generator () ] +class A : ContextBoundObject +{ + public void Foo () + { + B.Current ().Foo (); + } +} + +class B +{ + [ ContextStatic ] + static B current = new B (); + + static int foo = 8; + int goo; + + public static B Current () + { + if (current == null) + { + System.Console.WriteLine ("not initialized?"); + current = new B (); + } + return current; + } + + public B () + { + this.goo = foo++; + System.Console.WriteLine ("C foo:{0} goo:{1} ctxid:{2}", foo, goo, +System.Threading.Thread.CurrentContext.ContextID); + } + + + public void Foo () + { + System.Console.WriteLine ("F foo:{0} goo:{1} ctxid:{2}", foo, goo, +System.Threading.Thread.CurrentContext.ContextID); + } +} + + +class Foo +{ + public static void Main () + { + A a1 = new A (); + A a2 = new A (); + A a3 = new A (); + + a1.Foo (); + a2.Foo (); + a3.Foo (); + a1.Foo (); + a2.Foo (); + a3.Foo (); + + B.Current ().Foo (); + } +} + + +The output is: +C foo:1 goo:0 ctxid:1 +F foo:8 goo:0 ctxid:1 +not initialized? +C foo:9 goo:8 ctxid:2 +F foo:9 goo:8 ctxid:2 +not initialized? +C foo:10 goo:9 ctxid:3 +F foo:10 goo:9 ctxid:3 +F foo:10 goo:0 ctxid:1 +F foo:10 goo:8 ctxid:2 +F foo:10 goo:9 ctxid:3 +not initialized? +C foo:11 goo:10 ctxid:0 +F foo:11 goo:10 ctxid:0 + + +Notice, that the first time when B's constructor is called (in non-zero +context), even static variable 'foo' is not initialized. All next requests +for 'current' in contexts 2 and 3 aren't calling initializer. Even context +0 is not initialized. + +I would expect output like: +C foo:9 goo:8 ctxid:1 +F foo:9 goo:8 ctxid:1 +C foo:10 goo:9 ctxid:2 +F foo:10 goo:9 ctxid:2 +C foo:11 goo:10 ctxid:3 +F foo:11 goo:10 ctxid:3 +F foo:11 goo:8 ctxid:1 +F foo:11 goo:9 ctxid:2 +F foo:11 goo:10 ctxid:3 +C foo:12 goo:11 ctxid:0 +F foo:12 goo:11 ctxid:0 + + +Also, I think the test mono/mono/tests/context-static.cs is wrong: + + if (T.var != 0) return true; + +should probably be + + if (T.var != 5) return true; + +as var has initializer var = 5 _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
