Exemple #1
0
		public static int Select(ref PhpArray read, ref PhpArray write, ref PhpArray except, int tv_sec, int tv_usec)
		{
			if ((read == null || read.IsEmpty()) && (write == null || write.IsEmpty()))
				return except == null ? 0 : except.Count;

			var readResult = new PhpArray();
			var writeResult = new PhpArray();
			var i = 0;
			var timer = Stopwatch.StartNew();
			var waitTime = tv_sec*1000 + tv_usec;
			while (true)
			{
				if (read != null)
				{
					readResult.Clear();
					foreach (var item in read)
					{
						var stream = item.Value as PhpStream;
						if (stream == null)
							continue;
						if (stream.CanReadWithoutLock())
							readResult.Add(item.Key, item.Value);
					}
				}
				if (write != null)
				{
					writeResult.Clear();
					foreach (var item in write)
					{
						var stream = item.Value as PhpStream;
						if (stream == null)
							continue;
						if (stream.CanWriteWithoutLock())
							writeResult.Add(item.Key, item.Value);
					}
				}
				if (readResult.Count > 0 || writeResult.Count > 0 || except.Count > 0)
					break;
				i++;
				if (timer.ElapsedMilliseconds > waitTime)
					break;
				if (i < 10)
					Thread.Yield();
				else
					Thread.Sleep(Math.Min(i, waitTime));
			}
			read = readResult;
			write = writeResult;
			return read.Count + write.Count + (except == null ? 0 : except.Count);
		}