* LifetimeServices.cs: Implemented all methods.
[mono.git] / mcs / class / corlib / System.Runtime.Remoting.Lifetime / LeaseManager.cs
1 //
2 // System.Runtime.Remoting.Identity.cs
3 //
4 // Author: Lluis Sanchez Gual (lluis@ideary.com)
5 //
6 // (C) 2003, Lluis Sanchez Gual
7 //\r
8 \r
9 using System;\r
10 using System.Threading;\r
11 using System.Collections;\r
12 using System.Runtime.Remoting;\r
13 \r
14 namespace System.Runtime.Remoting.Lifetime\r
15 {\r
16         internal class LeaseManager\r
17         {\r
18                 ArrayList _objects = new ArrayList();\r
19                 Timer _timer = null;\r
20 \r
21                 public void SetPollTime (TimeSpan timeSpan)\r
22                 {\r
23                         lock (_objects.SyncRoot) \r
24                         {\r
25                                 if (_timer != null)\r
26                                         _timer.Change (timeSpan,timeSpan);\r
27                         }\r
28                 }\r
29 \r
30                 public void TrackLifetime (ServerIdentity identity)\r
31                 {\r
32                         lock (_objects.SyncRoot)\r
33                         {\r
34                                 identity.Lease.Activate();\r
35                                 _objects.Add (identity);\r
36 \r
37                                 if (_timer == null) StartManager();\r
38                         }\r
39                 }\r
40 \r
41                 public void StartManager()\r
42                 {\r
43                         _timer = new Timer (new TimerCallback (ManageLeases), null, LifetimeServices.LeaseManagerPollTime,LifetimeServices.LeaseManagerPollTime);\r
44                 }\r
45 \r
46                 public void StopManager()\r
47                 {\r
48                         _timer.Dispose();\r
49                         _timer = null;\r
50                 }\r
51 \r
52                 public void ManageLeases(object state)\r
53                 {\r
54                         lock (_objects.SyncRoot)\r
55                         {\r
56                                 int n=0;\r
57                                 while (n < _objects.Count)\r
58                                 {\r
59                                         ServerIdentity ident = (ServerIdentity)_objects[n];\r
60                                         ident.Lease.UpdateState();\r
61                                         if (ident.Lease.CurrentState == LeaseState.Expired)\r
62                                         {\r
63                                                 _objects.RemoveAt (n);\r
64                                                 ident.OnLifetimeExpired ();\r
65                                         }\r
66                                         else\r
67                                                 n++;\r
68                                 }\r
69 \r
70                                 if (_objects.Count == 0) \r
71                                         StopManager();\r
72                         }\r
73                 }\r
74         }\r
75 }\r