Jo Shields 3c1f479b9d Imported Upstream version 4.0.0~alpha1
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
2015-04-07 09:35:12 +01:00

134 lines
3.9 KiB
C#

#if FALSE
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Mono.Debugger;
using Mono.Debugger.Requests;
using Mono.Debugger.Events;
namespace Mono.Debugger.Soft
{
class EventQueueImpl : MirrorImpl, EventQueue
{
bool disconnected;
Dictionary<int, byte[]> reply_packets;
Thread receiver_thread;
Queue queue;
object queue_monitor;
object reply_packets_monitor;
public EventQueueImpl (VirtualMachineImpl vm) : base (vm) {
reply_packets = new Dictionary<int, byte[]> ();
reply_packets_monitor = new Object ();
queue = new Queue ();
queue_monitor = new Object ();
receiver_thread = new Thread (new ThreadStart (receiver_thread_main));
receiver_thread.Start ();
}
public EventSet Remove () {
if (disconnected)
// FIXME: VMDisconnectedException
throw new IOException ();
lock (queue_monitor) {
if (queue.Count == 0)
Monitor.Wait (queue_monitor);
return (EventSet)queue.Dequeue ();
}
}
public EventSet Remove (int timeout) {
throw new NotImplementedException ();
}
Event DecodeEventInfo (WireProtocol.EventInfo info) {
EventRequest req = FindRequest (info.requestId);
if (info.eventKind == WireProtocol.EVENT_VM_START) {
WireProtocol.VMStartEventInfo einfo = (WireProtocol.VMStartEventInfo)info;
return new VMStartEventImpl (vm, req, new ThreadReferenceImpl (vm, einfo.thread), new AppDomainMirrorImpl (vm, einfo.domain));
} else if (info.eventKind == WireProtocol.EVENT_VM_DEATH) {
return new VMDeathEventImpl (vm, req);
} else if (info.eventKind == WireProtocol.EVENT_THREAD_START) {
WireProtocol.ThreadStartEventInfo einfo = (WireProtocol.ThreadStartEventInfo)info;
return new ThreadStartEventImpl (vm, req, new ThreadReferenceImpl (vm, einfo.thread));
} else if (info.eventKind == WireProtocol.EVENT_THREAD_DEATH) {
WireProtocol.ThreadDeathEventInfo einfo = (WireProtocol.ThreadDeathEventInfo)info;
return new ThreadDeathEventImpl (vm, req, new ThreadReferenceImpl (vm, einfo.thread));
} else {
throw new NotImplementedException ();
}
}
EventRequest FindRequest (int requestId) {
if (requestId == 0)
return null;
else
return ((EventRequestManagerImpl)vm.EventRequestManager).FindRequest (requestId);
}
// Wait for the reply for a command packet
public byte[] WaitForReply (int packetId) {
while (true) {
lock (reply_packets_monitor) {
if (reply_packets.ContainsKey (packetId)) {
byte[] reply = reply_packets [packetId];
reply_packets.Remove (packetId);
return reply;
} else {
Monitor.Wait (reply_packets_monitor);
}
}
}
}
void add_event_set (EventSet set) {
lock (queue_monitor) {
queue.Enqueue (set);
Monitor.Pulse (queue_monitor);
}
}
void receiver_thread_main () {
Connection conn = vm.Connection;
while (true) {
byte[] packet = conn.ReadPacket ();
if (packet.Length == 0) {
disconnected = true;
VMDisconnectEventImpl ev = new VMDisconnectEventImpl (vm, null);
add_event_set (new EventSetImpl (vm, new Event [] { ev }, SuspendPolicy.SuspendNone));
break;
}
if (WireProtocol.IsReplyPacket (packet)) {
/* Reply packet */
int id = WireProtocol.GetPacketId (packet);
lock (reply_packets_monitor) {
reply_packets [id] = packet;
Monitor.PulseAll (reply_packets_monitor);
}
} else {
WireProtocol.Packet decoded = WireProtocol.DecodePacket (packet);
if (decoded is WireProtocol.Event.CompositePacket) {
WireProtocol.Event.CompositePacket p = (WireProtocol.Event.CompositePacket)decoded;
Event[] events = new Event [p.events.Length];
for (int i = 0; i < p.events.Length; ++i) {
events [i] = DecodeEventInfo (p.events [i]);
}
add_event_set (new EventSetImpl (vm, events, p.suspendPolicy));
}
}
}
}
}
}
#endif