コード例 #1
0
        public override void ReceiveLog(LogRecord record, string kind)
        {
            MemoryBuffer <byte> buf = new MemoryBuffer <byte>();

            record.WriteRecordToBuffer(this.LogInfoOptions, buf);

            MasterBuffer.NonStopWriteWithLock(buf.Memory, true, FastStreamNonStopWriteMode.DiscardExistingData);

            lock (LockObj)
            {
                foreach (var pipe in this.SubscribersList)
                {
                    pipe.CounterPart._NullCheck();

                    lock (pipe.CounterPart.StreamWriter.LockObj)
                    {
                        if (pipe.CounterPart.StreamWriter.NonStopWriteWithLock(buf.Memory, false, FastStreamNonStopWriteMode.DiscardExistingData) != 0)
                        {
                            // To avoid deadlock, CompleteWrite() must be called from other thread.
                            // (CompleteWrite() ==> Disconnect ==> Socket Log will recorded ==> ReceiveLog() ==> this function will be called!)
                            TaskUtil.StartSyncTaskAsync(() => pipe.CounterPart.StreamWriter.CompleteWrite(false), false, false)._LaissezFaire(true);
                        }
                    }
                }
            }
        }