Esempio n. 1
0
        private static void filterLogMessages(LinkedList <Ice.LogMessage> logMessages,
                                              HashSet <Ice.LogMessageType> messageTypes,
                                              HashSet <string> traceCategories, int messageMax)
        {
            Debug.Assert(logMessages.Count > 0 && messageMax != 0);

            //
            // Filter only if one of the 3 filters is set; messageMax < 0 means "give me all"
            // that match the other filters, if any.
            //
            if (messageTypes.Count > 0 || traceCategories.Count > 0 || messageMax > 0)
            {
                int count = 0;
                var p     = logMessages.Last;
                while (p != null)
                {
                    bool           keepIt = false;
                    Ice.LogMessage msg    = p.Value;
                    if (messageTypes.Count == 0 || messageTypes.Contains(msg.type))
                    {
                        if (msg.type != Ice.LogMessageType.TraceMessage || traceCategories.Count == 0 ||
                            traceCategories.Contains(msg.traceCategory))
                        {
                            keepIt = true;
                        }
                    }

                    if (keepIt)
                    {
                        ++count;
                        if (messageMax > 0 && count >= messageMax)
                        {
                            // Remove all older messages
                            p = p.Previous;
                            while (p != null)
                            {
                                var previous = p.Previous;
                                logMessages.Remove(p);
                                p = previous;
                            }
                            break; // while
                        }
                        else
                        {
                            p = p.Previous;
                        }
                    }
                    else
                    {
                        var previous = p.Previous;
                        logMessages.Remove(p);
                        p = previous;
                    }
                }
            }
            // else, don't need any filtering
        }
Esempio n. 2
0
        internal List <Ice.RemoteLoggerPrx> log(Ice.LogMessage logMessage)
        {
            lock (this)
            {
                List <Ice.RemoteLoggerPrx> remoteLoggers = null;

                //
                // Put message in _queue
                //
                if ((logMessage.type != Ice.LogMessageType.TraceMessage && _maxLogCount > 0) ||
                    (logMessage.type == Ice.LogMessageType.TraceMessage && _maxTraceCount > 0))
                {
                    _queue.AddLast(logMessage);

                    if (logMessage.type != Ice.LogMessageType.TraceMessage)
                    {
                        Debug.Assert(_maxLogCount > 0);
                        if (_logCount == _maxLogCount)
                        {
                            //
                            // Need to remove the oldest log from the queue
                            //
                            Debug.Assert(_oldestLog != null);
                            var next = _oldestLog.Next;
                            _queue.Remove(_oldestLog);
                            _oldestLog = next;

                            while (_oldestLog != null && _oldestLog.Value.type == Ice.LogMessageType.TraceMessage)
                            {
                                _oldestLog = _oldestLog.Next;
                            }
                            Debug.Assert(_oldestLog != null); // remember: we just added a Log at the end
                        }
                        else
                        {
                            Debug.Assert(_logCount < _maxLogCount);
                            _logCount++;
                            if (_oldestLog == null)
                            {
                                _oldestLog = _queue.Last;
                            }
                        }
                    }
                    else
                    {
                        Debug.Assert(_maxTraceCount > 0);
                        if (_traceCount == _maxTraceCount)
                        {
                            //
                            // Need to remove the oldest trace from the queue
                            //
                            Debug.Assert(_oldestTrace != null);
                            var next = _oldestTrace.Next;
                            _queue.Remove(_oldestTrace);
                            _oldestTrace = next;

                            while (_oldestTrace != null && _oldestTrace.Value.type != Ice.LogMessageType.TraceMessage)
                            {
                                _oldestTrace = _oldestTrace.Next;
                            }
                            Debug.Assert(_oldestTrace != null);  // remember: we just added a Log at the end
                        }
                        else
                        {
                            Debug.Assert(_traceCount < _maxTraceCount);
                            _traceCount++;
                            if (_oldestTrace == null)
                            {
                                _oldestTrace = _queue.Last;
                            }
                        }
                    }
                }

                //
                // Queue updated, now find which remote loggers want this message
                //
                foreach (RemoteLoggerData p in _remoteLoggerMap.Values)
                {
                    Filters filters = p.filters;

                    if (filters.messageTypes.Count == 0 || filters.messageTypes.Contains(logMessage.type))
                    {
                        if (logMessage.type != Ice.LogMessageType.TraceMessage || filters.traceCategories.Count == 0 ||
                            filters.traceCategories.Contains(logMessage.traceCategory))
                        {
                            if (remoteLoggers == null)
                            {
                                remoteLoggers = new List <Ice.RemoteLoggerPrx>();
                            }
                            remoteLoggers.Add(p.remoteLogger);
                        }
                    }
                }

                return(remoteLoggers);
            }
        }