/// <summary>
        /// Creates a prestage writer.
        /// </summary>
        /// <param name="settings">The settings to use for this prebuffer writer</param>
        /// <param name="onRollover">delegate to call when a file is done with this stage.</param>
        public PrebufferWriter(PrebufferWriterSettings settings, Action <PrebufferRolloverArgs <TKey, TValue> > onRollover)
            : base(MessageClass.Framework)
        {
            if (settings is null)
            {
                throw new ArgumentNullException("settings");
            }
            if (onRollover is null)
            {
                throw new ArgumentNullException("onRollover");
            }

            m_settings = settings.CloneReadonly();
            m_settings.Validate();

            m_performanceLog = Log.RegisterEvent(MessageLevel.Info, MessageFlags.PerformanceIssue, "Queue is full", 0, MessageRate.PerSecond(1), 1);
            m_currentlyRollingOverFullQueue = false;
            m_latestTransactionId.Value     = 0;
            m_syncRoot                         = new object();
            m_activeQueue                      = new SortedPointBuffer <TKey, TValue>(m_settings.MaximumPointCount, true);
            m_processingQueue                  = new SortedPointBuffer <TKey, TValue>(m_settings.MaximumPointCount, true);
            m_activeQueue.IsReadingMode        = false;
            m_processingQueue.IsReadingMode    = false;
            m_onRollover                       = onRollover;
            m_waitForEmptyActiveQueue          = new SafeManualResetEvent(false);
            m_rolloverTask                     = new ScheduledTask(ThreadingMode.DedicatedForeground, ThreadPriority.AboveNormal);
            m_rolloverTask.Running            += m_rolloverTask_Running;
            m_rolloverTask.UnhandledException += OnProcessException;
        }
 public override void Validate()
 {
     if (IsEnabled)
     {
         m_prebufferWriter.Validate();
         m_firstStageWriter.Validate();
         foreach (var stage in m_stagingRollovers)
         {
             stage.Validate();
         }
     }
 }