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(); } } }