void PosixSelectorBase::TryConnecting()
{
	for (Watched *toconnect = m_connecting.First(), *next; toconnect; toconnect = next)
	{
		next = toconnect->Suc();
		TryConnecting(toconnect);

		// "next" element can be detached during
		// the "TryConnecting(toconnect)" call.
		// If it happened - restart the loop.
		if (next && !m_connecting.HasLink(next))
			next = m_connecting.First();
	}
}
void PosixSelectorBase::SetMode(List<Watched>& from, const PosixSelectListener* listener, int fd, Type mode)
{
	for (Watched *watched = from.First(); watched; watched = watched->Suc())
	{
		if (watched->m_listener == listener && (fd == -1 || fd == watched->m_fd))
		{
			if (watched->m_mode == mode)
				continue;

			Log(SPEW, "%010p: Adjusting %010p listener (file %d=%d) mode %d -> %d\n",
				this, listener, fd, watched->m_fd, (int)watched->m_mode, (int)mode);
			watched->m_mode = mode;
			OpStatus::Ignore(SetModeInternal(watched, mode));
		}
	}
}
void PosixSelectorBase::Detach(List<Watched>& from, const PosixSelectListener* listener, int fd)
{
	for (Watched *watched = from.First(), *next; watched; watched = next)
	{
		next = watched->Suc();
		if (watched->m_listener == listener && (fd == -1 || fd == watched->m_fd))
		{
			Log(VERBOSE, "%010p: Detach %010p listener (file %d=%d).\n",
				this, listener, fd, watched->m_fd);
			DetachInternal(watched);
			watched->SetWatched(false);

			/* Remove from list. If they are not referenced elsewhere (e.g. in
			 * the list of waiting poll events), it is deleted. */
			watched->Out();
			watched->Destroy();
		}
	}
}