private static void CurrentContextOnOperationCompleted(object sender)
        {
            IStardustContext context = null;

            try
            {
                context = (IStardustContext)sender;
                WaitOperationRelease(context);
                DisposeContext(context);
            }
            catch (Exception ex)
            {
                ex.Log();
            }
            finally
            {
                if (context != null)
                {
                    if (DoLoggingLight)
                    {
                        Logging.DebugMessage($"Disconnecting event handler {context.ContextId}");
                    }
                    context.ClearDisposeActoion();
                }
            }
        }
 internal static void RegisterForDispose(this IStardustContext currentContext, IDisposable instance)
 {
     try
     {
         if (DoLoggingLight)
         {
             Logging.DebugMessage($"Register disposable item {instance.GetType().FullName}");
         }
         var container = GetStardustContextProvider(currentContext);
         lock (container)
         {
             if (DoLoggingLight)
             {
                 Logging.DebugMessage($"before insert: Dispose list size {container.DisposeList?.Count}");
             }
             container.DisposeList?.Add(instance);
             if (DoLoggingLight)
             {
                 Logging.DebugMessage($"after insert: Dispose list size {container.DisposeList?.Count}");
             }
         }
     }
     catch (Exception ex)
     {
         ex.Log();
     }
 }
示例#3
0
        public static void ClearContext(this IStardustContext currentContext)
        {
            var container = GetContainer(currentContext);

            lock (container)
            {
                container.Clear();
            }
        }
示例#4
0
        private static void WaitOperationRelease(IStardustContext context)
        {
            var threadLocker = context.GetItemFromContext(typeof(ManualResetEvent).FullName) as ManualResetEvent;

            if (threadLocker.IsInstance())
            {
                threadLocker.WaitOne();
            }
        }
        public static void ClearContext(this IStardustContext currentContext)
        {
            var container = GetContainer(currentContext);

            lock (container)
            {
                container.Clear();
                GetStardustContextProvider(currentContext).DisposeList?.AsParallel().ForAll(i => i?.TryDispose());
            }
        }
示例#6
0
        public static void RemoveItemFromContext(this IStardustContext currentContext, string key)
        {
            var container = GetContainer(currentContext);

            lock (container)
            {
                object instance;
                if (!container.TryRemove(key, out instance))
                {
                    Logging.DebugMessage("failed to remove item '{0}'", key);
                }
            }
        }
示例#7
0
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            IStardustContext ctx = null;

            try
            {
                ctx = ContextScopeExtensions.CreateScope();
                if (request.Version.Envelope == EnvelopeVersion.None)
                {
                    runtime = RuntimeFactory.CreateRuntime();
                    runtime.GetStateStorageContainer().TryAddStorageItem((ThreadSynchronizationContext)ctx, Synccontext);
                    var httpRequest = request.Properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
                    if (httpRequest != null)
                    {
                        var msg = httpRequest.Headers["X-Stardust-Meta"];
                        if (msg.ContainsCharacters())
                        {
                            try
                            {
                                var item = Resolver.Activate <IReplaceableSerializer>().Deserialize <RequestHeader>(Convert.FromBase64String(msg).GetStringFromArray());
                                request.Properties.Add("autoHeader", item);
                                runtime.GetStateStorageContainer().TryAddStorageItem(true, "isRest");
                            }
                            catch
                            {
                            }
                        }
                    }

                    return(ctx);
                }
                if (request.Headers.Any(messageHeader => messageHeader.Name == "HeaderInfoIncluded"))
                {
                    runtime = RuntimeFactory.CreateRuntime();
                    runtime.GetStateStorageContainer().TryAddStorageItem((ThreadSynchronizationContext)ctx, Synccontext);
                    return(ctx);
                }
                ;
                var header = request.Headers.GetHeader <RequestHeader>("RequestHeader", RequestHeader.NS);
                request.Properties.Add("autoHeader", header);
                runtime = RuntimeFactory.CreateRuntime();
                runtime.GetStateStorageContainer().TryAddStorageItem((ThreadSynchronizationContext)ctx, Synccontext);
            }
            catch (Exception ex)
            {
                ex.Log();
            }
            return(ctx);
        }
 internal static void DisposeContext(this IStardustContext currentContext)
 {
     try
     {
         StardustContextProvider item;
         int counter = 0;
         while (!StateStorage.TryRemove(currentContext.ContextId.ToString(), out item))
         {
             Thread.Sleep(10);
             counter++;
             if (counter > 10)
             {
                 if (DoLoggingLight)
                 {
                     Logging.DebugMessage($"Unable to remove item {currentContext.ContextId}");
                 }
                 return;
             }
         }
         if (item.DisposeList != null)
         {
             if (DoLoggingLight)
             {
                 Logging.DebugMessage($"Disposing {item.DisposeList.Count} items for context {currentContext.ContextId}");
             }
             foreach (var disposable in item.DisposeList)
             {
                 if (DoLoggingLight)
                 {
                     Logging.DebugMessage($"Disposing {disposable?.GetType().Name}");
                 }
                 disposable.TryDispose();
             }
         }
         if (DoLoggingLight)
         {
             Logging.DebugMessage($"Disposing clearing disposable list");
         }
         item?.DisposeList?.Clear();
         if (DoLoggingLight)
         {
             Logging.DebugMessage($"Disposing clearing container");
         }
         item?.Dispose();
     }
     catch
     {
     }
 }
 private static void WaitOperationRelease(IStardustContext context)
 {
     try
     {
         var threadLocker = context.GetItemFromContext(typeof(ManualResetEvent).FullName) as ManualResetEvent;
         threadLocker?.WaitOne();
     }
     catch (Exception ex)
     {
         if (DoLoggingLight)
         {
             ex.Log("WTF?!?");
         }
     }
 }
示例#10
0
 private static StardustContextProvider GetStardustContextProvider(IStardustContext currentContext)
 {
     try
     {
         if (currentContext == null)
         {
             Logging.DebugMessage("WTF??");
             currentContext = ThreadSynchronizationContext.BeginContext(Guid.NewGuid());
         }
         return(((ThreadSynchronizationContext)currentContext).StateContainer);
     }
     catch (Exception ex)
     {
         Logging.Exception(ex);
         throw;
     }
 }
示例#11
0
        public static object GetItemFromContext(this IStardustContext currentContext, string key)
        {
            var container = GetContainer(currentContext);

            lock (container)
            {
                object instance;
                if (container.TryGetValue(key, out instance))
                {
                    return(instance);
                }
                if (DoLogging && key != "Stardust.Nucleus.ContextProviders.IExtendedScopeProvider")
                {
                    Logging.DebugMessage("Item with key {0} was not found in context {1}", key, currentContext.ContextId);
                }
                return(null);
            }
        }
示例#12
0
        public static void SetItemInContext(this IStardustContext currentContext, string key, object item)
        {
            var container = GetContainer(currentContext);

            lock (container)
            {
                if (DoLogging)
                {
                    Logging.DebugMessage("inserting {0}", key);
                }
                if (container.ContainsKey(key))
                {
                    object oldValue;
                    container.TryRemove(key, out oldValue);
                }
                if (!container.TryAdd(key, item))
                {
                    Logging.DebugMessage("inserting item {0} failed", key);
                }
            }
        }
示例#13
0
 private static StardustContextProvider GetStardustContextProvider(IStardustContext currentContext)
 {
     try
     {
         return(((ThreadSynchronizationContext)currentContext).StateContainer);
     }
     catch (Exception ex)
     {
         Logging.Exception(ex);
         //if (DoLogging)
         {
             try
             {
                 //if (DoLogging)
                 {
                     for (var i = 0; i < 100; i++)
                     {
                         var st1 = new StackTrace(new StackFrame(i, true));
                         if (st1.ToString().ContainsCharacters())
                         {
                             Logging.DebugMessage("[ext] Stack{1}: {0}  [{2}]", st1.ToString(), i, currentContext.ContextId);
                         }
                         else
                         {
                             break;
                         }
                     }
                 }
             }
             catch (Exception)
             {
             }
         }
         throw;
     }
 }
        private static StardustContextProvider GetStardustContextProvider(IStardustContext currentContext)
        {

            try
            {
                return ((ThreadSynchronizationContext)currentContext).StateContainer;
            }
            catch (Exception ex)
            {
                Logging.Exception(ex);
                //if (DoLogging)
                {
                    try
                    {
                        //if (DoLogging)
                        {
                            for (var i = 0; i < 100; i++)
                            {
                                var st1 = new StackTrace(new StackFrame(i, true));
                                if(st1.ToString().ContainsCharacters())
                                Logging.DebugMessage("[ext] Stack{1}: {0}  [{2}]", st1.ToString(), i, currentContext.ContextId);
                                else break;

                            }
                        }
                    }
                    catch (Exception)
                    {
                    }
                }
                throw;
            }
        }
示例#15
0
        internal static void RegisterForDispose(this IStardustContext currentContext, IDisposable instance)
        {
            var container = GetStardustContextProvider(currentContext);

            container.DisposeList.Add(instance);
        }
示例#16
0
 private static StardustContextProvider GetStardustContextProvider(IStardustContext currentContext)
 {
     try
     {
         if (currentContext == null)
         {
             Logging.DebugMessage("WTF??");
             currentContext = ThreadSynchronizationContext.BeginContext(Guid.NewGuid());
         }
         return ((ThreadSynchronizationContext)currentContext).StateContainer;
     }
     catch (Exception ex)
     {
         Logging.Exception(ex);
         throw;
     }
 }
示例#17
0
        private static ConcurrentDictionary <string, object> GetContainer(IStardustContext currentContext)
        {
            var container = GetStardustContextProvider(currentContext);

            return(container.Container);
        }
示例#18
0
 private static void WaitOperationRelease(IStardustContext context)
 {
     var threadLocker = context.GetItemFromContext(typeof(ManualResetEvent).FullName) as ManualResetEvent;
     if (threadLocker.IsInstance())
         threadLocker.WaitOne();
 }
示例#19
0
 private static ConcurrentDictionary<string, object> GetContainer(IStardustContext currentContext)
 {
     var container = GetStardustContextProvider(currentContext);
     return container.Container;
 }