|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "net/third_party/quiche/src/epoll_server/fake_simple_epoll_server.h" | 
|  |  | 
|  | namespace epoll_server { | 
|  | namespace test { | 
|  |  | 
|  | FakeTimeSimpleEpollServer::FakeTimeSimpleEpollServer() : now_in_usec_(0) {} | 
|  |  | 
|  | FakeTimeSimpleEpollServer::~FakeTimeSimpleEpollServer() = default; | 
|  |  | 
|  | int64_t FakeTimeSimpleEpollServer::NowInUsec() const { return now_in_usec_; } | 
|  |  | 
|  | FakeSimpleEpollServer::FakeSimpleEpollServer() : until_in_usec_(-1) {} | 
|  |  | 
|  | FakeSimpleEpollServer::~FakeSimpleEpollServer() = default; | 
|  |  | 
|  | int FakeSimpleEpollServer::epoll_wait_impl(int /*epfd*/, | 
|  | struct epoll_event* events, | 
|  | int max_events, int timeout_in_ms) { | 
|  | int num_events = 0; | 
|  | while (!event_queue_.empty() && num_events < max_events && | 
|  | event_queue_.begin()->first <= NowInUsec() && | 
|  | ((until_in_usec_ == -1) || | 
|  | (event_queue_.begin()->first < until_in_usec_))) { | 
|  | int64_t event_time_in_usec = event_queue_.begin()->first; | 
|  | events[num_events] = event_queue_.begin()->second; | 
|  | if (event_time_in_usec > NowInUsec()) { | 
|  | set_now_in_usec(event_time_in_usec); | 
|  | } | 
|  | event_queue_.erase(event_queue_.begin()); | 
|  | ++num_events; | 
|  | } | 
|  | if (num_events == 0) {       // then we'd have waited 'till the timeout. | 
|  | if (until_in_usec_ < 0) {  // then we don't care what the final time is. | 
|  | if (timeout_in_ms > 0) { | 
|  | AdvanceBy(timeout_in_ms * 1000); | 
|  | } | 
|  | } else {  // except we assume that we don't wait for the timeout | 
|  | // period if until_in_usec_ is a positive number. | 
|  | set_now_in_usec(until_in_usec_); | 
|  | // And reset until_in_usec_ to signal no waiting (as | 
|  | // the AdvanceByExactly* stuff is meant to be one-shot, | 
|  | // as are all similar net::EpollServer functions) | 
|  | until_in_usec_ = -1; | 
|  | } | 
|  | } | 
|  | if (until_in_usec_ >= 0) { | 
|  | CHECK(until_in_usec_ >= NowInUsec()); | 
|  | } | 
|  | return num_events; | 
|  | } | 
|  |  | 
|  | }  // namespace test | 
|  | }  // namespace epoll_server |