Example #1
0
        private object getServerInstance(serverImplementer server, RequestMsg request, out Guid?checkedOutID, out bool lockTaken)
        {
            object result = null;

            checkedOutID = null;
            lockTaken    = false;

            if (server.InstanceMode == ServerInstanceMode.Singleton)
            {
                if (!m_SingletonInstances.TryGetValue(server.Implementation, out result))
                {
                    lock (m_SingletonInstancesLock)
                    {
                        if (!m_SingletonInstances.TryGetValue(server.Implementation, out result))
                        {
                            result = createInstance(server);
                            var dict = new Dictionary <Type, object>(m_SingletonInstances);
                            dict[server.Implementation] = result;
                            m_SingletonInstances        = dict;//atomic
                        }
                    }
                }
            }
            else
            if (server.InstanceMode == ServerInstanceMode.Stateful ||
                server.InstanceMode == ServerInstanceMode.AutoConstructedStateful)
            {
                if (request.RemoteInstance.HasValue)
                {
                    result = App.ObjectStore.CheckOut(request.RemoteInstance.Value);
                    if (result == null || result.GetType() != server.Implementation)
                    {
                        throw new StatefulServerInstanceDoesNotExistException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_DOES_NOT_EXIST_ERROR + server.Implementation.FullName);
                    }

                    checkedOutID = request.RemoteInstance.Value;

                    if (!server.ThreadSafe)
                    {
                        if (!Monitor.TryEnter(result, this.Glue.ServerInstanceLockTimeoutMs))
                        {
                            App.ObjectStore.CheckIn(checkedOutID.Value);  //check it back in because we could not lock it
                            throw new StatefulServerInstanceLockTimeoutException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_LOCK_TIMEOUT_ERROR + server.Implementation.FullName);
                        }
                        lockTaken = true;
                    }
                }
                else
                {
                    result = createInstance(server);  //no need to lock as instance is brand new
                }
            }
            else        // ServerInstanceMode.PerCall
            {
                result = createInstance(server);
            }

            return(result);
        }
Example #2
0
        private serverImplementer getServerImplementer(ServerEndPoint sep, Type contract)
        {
            serverImplementer server;

            if (sep.m_ContractImplementers.TryGetValue(contract, out server))
            {
                return(server);
            }

            server = new serverImplementer(this, sep, contract);       //throws
            sep.m_ContractImplementers.TryAdd(contract, server);
            return(server);
        }
Example #3
0
 private object createInstance(serverImplementer server)
 {
     try
     {
         if (server.SupportsGlueCtor)
         {
             return(Activator.CreateInstance(server.Implementation, Glue, server.InstanceMode));
         }
         else
         {
             return(Activator.CreateInstance(server.Implementation, true));
         }
     }
     catch (Exception error)
     {
         throw new ServerInstanceActivationException(StringConsts.GLUE_SERVER_INSTANCE_ACTIVATION_ERROR + server.Implementation.FullName, error);
     }
 }
Example #4
0
        private object getServerInstance(serverImplementer server, RequestMsg request, out Guid?checkedOutID, out bool lockTaken)
        {
            object result = null;

            checkedOutID = null;
            lockTaken    = false;

            if (server.InstanceMode == ServerInstanceMode.Singleton)
            {
                if (!m_SingletonInstances.TryGetValue(server.Implementation, out result))     //per ServerHandler/Glue instance
                {
                    lock (m_SingletonInstancesLock)
                    {
                        if (!m_SingletonInstances.TryGetValue(server.Implementation, out result))
                        {
                            result = createInstance(server);

                            //Inject dependencies into singleton server implementor ONLY ONCE at creation
                            App.DependencyInjector.InjectInto(result);

                            var dict = new Dictionary <Type, object>(m_SingletonInstances);
                            dict[server.Implementation] = result;
                            m_SingletonInstances        = dict;//atomic
                        }
                    }
                }
            }
            else
            if (server.InstanceMode == ServerInstanceMode.Stateful ||
                server.InstanceMode == ServerInstanceMode.AutoConstructedStateful)
            {
                if (request.RemoteInstance.HasValue)
                {
                    result = App.ObjectStore.CheckOut(request.RemoteInstance.Value);
                    if (result == null || result.GetType() != server.Implementation)
                    {
                        throw new StatefulServerInstanceDoesNotExistException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_DOES_NOT_EXIST_ERROR + server.Implementation.FullName);
                    }

                    checkedOutID = request.RemoteInstance.Value;

                    if (!server.ThreadSafe)
                    {
                        if (!Monitor.TryEnter(result, this.Glue.ServerInstanceLockTimeoutMs))
                        {
                            App.ObjectStore.CheckIn(checkedOutID.Value);  //check it back in because we could not lock it
                            throw new StatefulServerInstanceLockTimeoutException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_LOCK_TIMEOUT_ERROR + server.Implementation.FullName);
                        }
                        lockTaken = true;
                    }
                }
                else
                {
                    result = createInstance(server);   //no need to lock as instance is brand new
                }

                //Inject dependencies into newly created or checked out stateful instance
                //The DI is thread safe because in the unlikely case of DI injected values change,
                //DI sets all ref type fields atomically per CLR guarantee
                App.DependencyInjector.InjectInto(result);
            }
            else        // ServerInstanceMode.PerCall
            {
                result = createInstance(server);

                //Inject dependencies into newly created per-call instance
                App.DependencyInjector.InjectInto(result);
            }

            //singleton is NOT DI'ed here

            return(result);
        }
Example #5
0
 private object createInstance(serverImplementer server)
 {
    try
    {
      if (server.SupportsGlueCtor)
         return Activator.CreateInstance(server.Implementation, Glue, server.InstanceMode);
      else
         return Activator.CreateInstance(server.Implementation, true);
    }
    catch(Exception error)
    {
      throw new ServerInstanceActivationException(StringConsts.GLUE_SERVER_INSTANCE_ACTIVATION_ERROR + server.Implementation.FullName, error);
    }
 } 
Example #6
0
                private object getServerInstance(serverImplementer server, RequestMsg request, out Guid? checkedOutID, out bool lockTaken)
                {
                   object result = null;
                   checkedOutID = null;
                   lockTaken = false;

                   if (server.InstanceMode == ServerInstanceMode.Singleton)
                   {
                     if (!m_SingletonInstances.TryGetValue(server.Implementation, out result))
                       lock(m_SingletonInstancesLock)
                       {
                         if (!m_SingletonInstances.TryGetValue(server.Implementation, out result))
                         {
                           result = createInstance(server);
                           var dict = new Dictionary<Type, object>( m_SingletonInstances );
                           dict[server.Implementation] = result;
                           m_SingletonInstances = dict;//atomic
                         }
                       }
                   }
                   else
                   if (server.InstanceMode == ServerInstanceMode.Stateful || 
                       server.InstanceMode == ServerInstanceMode.AutoConstructedStateful)
                   {
                     if (request.RemoteInstance.HasValue)
                     {
                       result = App.ObjectStore.CheckOut(request.RemoteInstance.Value);
                       if (result==null || result.GetType()!=server.Implementation)
                        throw new StatefulServerInstanceDoesNotExistException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_DOES_NOT_EXIST_ERROR + server.Implementation.FullName);
                       
                       checkedOutID = request.RemoteInstance.Value;

                       if (!server.ThreadSafe)
                       {
                            if (!Monitor.TryEnter(result, this.Glue.ServerInstanceLockTimeoutMs))
                            {
                              App.ObjectStore.CheckIn(checkedOutID.Value);//check it back in because we could not lock it
                              throw new StatefulServerInstanceLockTimeoutException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_LOCK_TIMEOUT_ERROR + server.Implementation.FullName);
                            }
                            lockTaken = true;
                       }
                     }
                     else
                      result = createInstance(server);//no need to lock as instance is brand new
                   }
                   else // ServerInstanceMode.PerCall
                   {
                     result = createInstance(server);
                   }

                   return result;
                }
Example #7
0
 private serverImplementer getServerImplementer(ServerEndPoint sep, Type contract)
 {
   serverImplementer server;
   if (sep.m_ContractImplementers.TryGetValue(contract, out server)) return server;
  
   server = new serverImplementer(this, sep, contract); //throws
   sep.m_ContractImplementers.TryAdd(contract, server); 
   return server;
 }