Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }
Ejemplo n.º 3
0
        /// <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);
            }
        }
Ejemplo n.º 4
0
        /// <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();
            }
        }