public static IEnumerable<AnnotatedPacket> AnnotatePackets( int w, int h, IEnumerable<TtyRecPacket> packets, Func<bool> checkinterrupt )
        {
            var term = new Terminal(w,h);
            var memory_budget3 = Configuration.Main.ChunksTargetMemoryMB * 1000 * 1000;
            var time_budget = TimeSpan.FromMilliseconds( Configuration.Main.ChunksTargetLoadMS );

            var last_restart_position_time = DateTime.MinValue;
            var last_restart_memory_avail  = memory_budget3/3;

            foreach ( var packet in packets ) {
                if ( checkinterrupt() ) break;

                var now = DateTime.Now;

                bool need_restart
                    =  (last_restart_position_time+time_budget < now)
                    || (last_restart_memory_avail <= 1000)
                    ;

                if ( packet.Payload == null ) {
                    using ( term ) {}
                    term = new Terminal(w,h);
                    need_restart = true;
                }

                yield return new AnnotatedPacket()
                    { SinceStart      = packet.SinceStart
                    , Payload         = packet.Payload
                    , RestartPosition = need_restart ? new Terminal(term) : null
                    };

                if ( need_restart ) {
                    last_restart_position_time = now;
                    last_restart_memory_avail = memory_budget3/3;
                } else {
                    last_restart_memory_avail -= w*h*12;
                }

                if ( packet.Payload!=null ) term.Send( packet.Payload );
            }
            using ( term ) {}
        }
Пример #2
0
 /// <summary>
 /// Create a copy of an existing PuTTY terminal, including PuTTY's parse state
 /// </summary>
 /// <param name="toclone">The terminal to make a copy of</param>
 public Terminal( Terminal toclone )
 {
     Handle = ClonePuttyTerminal( toclone.Handle );
     Width  = toclone.Width;
     Height = toclone.Height;
 }
Пример #3
0
 /// <summary>
 /// Create a copy of an existing PuTTY terminal, including PuTTY's parse state
 /// </summary>
 /// <param name="toclone">The terminal to make a copy of</param>
 public Terminal(Terminal toclone)
 {
     Handle = ClonePuttyTerminal(toclone.Handle);
     Width  = toclone.Width;
     Height = toclone.Height;
 }