Browse Source

added Poll

Nicolas Cannasse 19 years ago
parent
commit
9da9b35a01
2 changed files with 70 additions and 2 deletions
  1. 60 0
      std/neko/net/Poll.hx
  2. 10 2
      std/neko/net/ThreadServer.hx

+ 60 - 0
std/neko/net/Poll.hx

@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2005, The haXe Project Contributors
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ */
+package neko.net;
+
+class Poll {
+
+	var d : Void;
+
+	public function new( n : Int ) {
+		d = socket_poll_alloc(n);
+	}
+
+	public function poll( a : Array<Socket>, ?t : Float ) : Array<Socket> {
+		untyped {
+			var c = __dollar__hnew(16);
+			var r = __dollar__amake(a.length);
+			var i = 0;
+			var len = a.length;
+			while( i < len ){
+				r[i] = a[i].__s;
+				__dollar__hadd(c,a[i].__s,a[i]);
+				i += 1;
+			}
+			r = socket_poll(r,d,t);
+			i = 0;
+			len = __dollar__asize(r);
+			while( i < len ) {
+				r[i] = __dollar__hget(c,r[i],null);
+				i += 1;
+			}
+			return Array.new1(r,len);
+		}
+	}
+
+	static var socket_poll_alloc = neko.Lib.load("std","socket_poll_alloc",1);
+	static var socket_poll = neko.Lib.load("std","socket_poll",3);
+
+}

+ 10 - 2
std/neko/net/ThreadServer.hx

@@ -27,6 +27,7 @@ package neko.net;
 private typedef ThreadInfos = {
 	var id : Int;
 	var t : neko.vm.Thread;
+	var p : neko.net.Poll;
 	var socks : Array<neko.net.Socket>;
 }
 
@@ -52,6 +53,7 @@ class ThreadServer<Client,Message> {
 	public var maxBufferSize : Int;
 	public var messageHeaderSize : Int;
 	public var updateTime : Float;
+	public var maxSockPerThread : Int;
 
 	public function new() {
 		threads = new Array();
@@ -62,6 +64,7 @@ class ThreadServer<Client,Message> {
 		errorOutput = neko.io.File.stderr();
 		initialBufferSize = (1 << 10);
 		maxBufferSize = (1 << 16);
+		maxSockPerThread = 64;
 		updateTime = 1;
 	}
 
@@ -107,7 +110,7 @@ class ThreadServer<Client,Message> {
 
 	function loopThread( t : ThreadInfos ) {
 		if( t.socks.length > 0 )
-			for( s in neko.net.Socket.select(t.socks,null,null,connectLag).read ) {
+			for( s in t.p.poll(t.socks,connectLag) ) {
 				var infos : ClientInfos<Client> = s.custom;
 				try {
 					readClientData(infos);
@@ -189,7 +192,12 @@ class ThreadServer<Client,Message> {
 		worker = neko.vm.Thread.create(runWorker);
 		timer = neko.vm.Thread.create(runTimer);
 		for( i in 0...nthreads ) {
-			var t = { id : i, t : null, socks : new Array() };
+			var t = {
+				id : i,
+				t : null,
+				socks : new Array(),
+				p : new neko.net.Poll(maxSockPerThread),
+			};
 			threads.push(t);
 			t.t = neko.vm.Thread.create(callback(runThread,t));
 		}