/// <summary> /// 写文件 /// </summary> internal void WriteFile() { bool isErrorWait = isError; do { Monitor.Enter(bufferLock); if (buffers.Length == 0) { if (buffer.IsBuffer) { currentBuffers.Array[0] = buffer; buffer.Clear(); ++currentBuffers.Length; } else { isWritting = false; Monitor.Exit(bufferLock); if (isErrorWait) { Monitor.Enter(waitLock); Monitor.PulseAll(waitLock); Monitor.Exit(waitLock); } return; } } else { currentBuffers.Exchange(ref buffers); } Monitor.Exit(bufferLock); WaitBuffer[] bufferArray = currentBuffers.Array; int count = currentBuffers.Length, index = 0; if (!isError) { try { do { bufferArray[index].WriteFile(this); }while (++index != count); } catch (Exception error) { isError = true; log.Add(Log.LogType.Error, error); AutoCSer.Threading.ThreadPool.Tiny.FastStart(this, AutoCSer.Threading.Thread.CallType.FileStreamWriterDispose); } } while (index != count) { isErrorWait |= bufferArray[index++].Error(this); } currentBuffers.Length = 0; }while (true); }
/// <summary> /// 回调处理 /// </summary> private void onReceive() { Callback <ReturnValue <outputParameterType> > callback = Callback; if (callback != null) { Monitor.Enter(OutputLock); do { currentOutputParameters.Exchange(ref outputParameters); Monitor.Exit(OutputLock); ReturnValue <outputParameterType>[] outputParameterArray = currentOutputParameters.Array; int index = 0, count = currentOutputParameters.Length; do { try { do { callback.Call(ref outputParameterArray[index]); }while (++index != count); break; } catch (Exception error) { Socket.Log.Add(AutoCSer.Log.LogType.Error, error); } }while (++index != count); if (AutoCSer.DynamicArray <outputParameterType> .IsClearArray) { System.Array.Clear(outputParameterArray, 0, count); } currentOutputParameters.Length = 0; Monitor.Enter(OutputLock); if (outputParameters.Length == 0) { isOutput = 0; Monitor.Exit(OutputLock); return; } }while (true); } }
/// <summary> /// 回调处理 /// </summary> private void onReceive() { Action <ReturnValue> callback = Callback; if (callback != null) { Monitor.Enter(OutputLock); do { currentOutputParameters.Exchange(ref outputParameters); Monitor.Exit(OutputLock); ReturnType[] outputParameterArray = currentOutputParameters.Array; int index = 0, count = currentOutputParameters.Length; do { try { do { callback(new ReturnValue { Type = outputParameterArray[index] }); }while (++index != count); break; } catch (Exception error) { Socket.Log.Add(AutoCSer.Log.LogType.Error, error); } }while (++index != count); currentOutputParameters.Length = 0; Monitor.Enter(OutputLock); if (outputParameters.Length == 0) { isOutput = 0; Monitor.Exit(OutputLock); return; } }while (true); } }
/// <summary> /// 单线程建图 /// </summary> private unsafe void buildGraph() { Builder builder = new Builder(Boot); for (LeftArray <Node> reader = new LeftArray <Node>(Boot.Nodes.Values.getArray()); reader.Length != 0; reader.Exchange(ref builder.Writer)) { builder.Set(ref reader); builder.Build(); } }