Example #1
0
            private static async Task <bool> OnRelease(ArenaSession s)
            {
                var l = s.GetLock();

                try
                {
                    using (var t = EndSession(s))
                    {
                        if (await t)
                        {
                            lock (sessions)
                            {
                                if (s._locks == 0)
                                {
                                    s.Session = null;
                                    sessions.Remove(s.Email);
                                    s.Dispose();

                                    return(true);
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Util.Logging.Log(e);
                }
                finally
                {
                    l.Dispose();
                }

                return(false);
            }
Example #2
0
            private static void Release(ArenaSession s)
            {
                lock (sessions)
                {
                    var b = s._locks == 0;

                    if (!b && --s._locks == 0)
                    {
                        s._released = DateTime.UtcNow;
                        b           = true;
                    }

                    if (b)
                    {
                        if (!s.HasSession)
                        {
                            var l = s.TryGetLock();
                            if (l != null)
                            {
                                try
                                {
                                    sessions.Remove(s.Email);
                                    s.Dispose();
                                    return;
                                }
                                finally
                                {
                                    l.Dispose();
                                }
                            }
                        }
                    }
                    else
                    {
                        return;
                    }

                    if (releasing != null)
                    {
                        releasing.Enqueue(s);
                    }
                    else
                    {
                        releasing = new Queue <ArenaSession>();
                        releasing.Enqueue(s);
                        ReleaseAsync();
                    }
                }
            }