public int Send(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError error) { int sent = 0; while (true) { sent += m_socket.Send(buffer, offset + sent, size - sent, socketFlags, out error); if (error == SocketError.WouldBlock) { error = SocketError.Success; } if (error != SocketError.Success) { return(sent); } if (sent < size) { m_writeCS.Enter(); m_writingThread = MicroThread.CurrentThread; m_writingThread.Wait(); m_writingThread = null; m_writeCS.Exit(); } else { return(sent); } } }
public void Decrease() { Console.WriteLine("Semaphore:Decrease {0} -> {1}", m_value, m_value - 1); m_value--; if (m_value < 0) { MicroThread t = MicroThread.CurrentThread; m_suspendedThreads.Enqueue(t); t.Wait(); } }
public T Receive() { MicroThread t = MicroThread.CurrentThread; if (m_senders.Count == 0) { m_receivers.Enqueue(t); t.Wait(); } else { MicroThread sender = m_senders.Dequeue(); sender.WakeUp(); } return(m_dataQueue.Dequeue()); }
public MicroSocket Accept() { Print("Begin accepting"); m_readCS.Enter(); m_readingThread = MicroThread.CurrentThread; m_readingThread.Wait(); m_readingThread = null; m_readCS.Exit(); Print("Accept returned"); Socket newSocket = m_socket.Accept(); MicroSocket s = new MicroSocket(newSocket); return(s); }
public void Send(T data) { MicroThread t = MicroThread.CurrentThread; m_dataQueue.Enqueue(data); if (m_receivers.Count == 0) { m_senders.Enqueue(t); t.Wait(); } else { MicroThread receiver = m_receivers.Dequeue(); receiver.WakeUp(); t.Yield(); } }
public int Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError error) { while (true) { int received = m_socket.Receive(buffer, offset, size, socketFlags, out error); if (error == SocketError.Success) { return(received); } if (error != SocketError.WouldBlock) { return(received); } m_readCS.Enter(); m_readingThread = MicroThread.CurrentThread; m_readingThread.Wait(); m_readingThread = null; m_readCS.Exit(); } }
public bool Connect(IPAddress address, int port) { Print("Begin connecting to {0}:{1}", address, port); try { m_socket.Connect(new IPEndPoint(address, port)); } catch (SocketException) { // ignore blocking connect exception. shouldn't there be some other way to do this... //Console.WriteLine("exc cont"); } m_writeCS.Enter(); m_writingThread = MicroThread.CurrentThread; m_writingThread.Wait(); m_writingThread = null; m_writeCS.Exit(); //Console.WriteLine("STATE {0}", m_waitState); if ((m_selectStatus & MicroSocketSelectStatus.Error) != 0) { Console.WriteLine("Connect failed"); return(false); } else if ((m_selectStatus & MicroSocketSelectStatus.Write) != 0) { //Console.WriteLine("Connected!"); return(true); } else { throw new Exception("illegal state"); } }
public MicroSocket Accept() { Print("Begin accepting"); m_readCS.Enter(); m_readingThread = MicroThread.CurrentThread; m_readingThread.Wait(); m_readingThread = null; m_readCS.Exit(); Print("Accept returned"); Socket newSocket = m_socket.Accept(); MicroSocket s = new MicroSocket(newSocket); return s; }
public int Send(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError error) { int sent = 0; while (true) { sent += m_socket.Send(buffer, offset + sent, size - sent, socketFlags, out error); if (error == SocketError.WouldBlock) { error = SocketError.Success; } if (error != SocketError.Success) { return sent; } if (sent < size) { m_writeCS.Enter(); m_writingThread = MicroThread.CurrentThread; m_writingThread.Wait(); m_writingThread = null; m_writeCS.Exit(); } else { return sent; } } }
public int Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags, out SocketError error) { while (true) { int received = m_socket.Receive(buffer, offset, size, socketFlags, out error); if (error == SocketError.Success) { return received; } if (error != SocketError.WouldBlock) { return received; } m_readCS.Enter(); m_readingThread = MicroThread.CurrentThread; m_readingThread.Wait(); m_readingThread = null; m_readCS.Exit(); } }
public bool Connect(IPAddress address, int port) { Print("Begin connecting to {0}:{1}", address, port); try { m_socket.Connect(new IPEndPoint(address, port)); } catch (SocketException) { // ignore blocking connect exception. shouldn't there be some other way to do this... //Console.WriteLine("exc cont"); } m_writeCS.Enter(); m_writingThread = MicroThread.CurrentThread; m_writingThread.Wait(); m_writingThread = null; m_writeCS.Exit(); //Console.WriteLine("STATE {0}", m_waitState); if ((m_selectStatus & MicroSocketSelectStatus.Error) != 0) { Console.WriteLine("Connect failed"); return false; } else if ((m_selectStatus & MicroSocketSelectStatus.Write) != 0) { //Console.WriteLine("Connected!"); return true; } else { throw new Exception("illegal state"); } }