/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <functional>
#include <map>
#include <mutex>

#include <fruit/fruit.h>

#include "common/libs/fs/epoll.h"
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/result.h"

#pragma once

namespace cuttlefish {

using EpollCallback = std::function<Result<void>(EpollEvent)>;

class EpollPool {
 public:
  EpollPool(Epoll);
  EpollPool(EpollPool&&);
  EpollPool& operator=(EpollPool&&);

  /**
   * The `callback` function will be invoked with an EpollEvent containing `fd`
   * and a subset of the bits in `events` matching which events were actually
   * observed. The callback is invoked exactly once (enforced via EPOLLONESHOT)
   * and must be re-`Register`ed to receive events again. This can be done
   * in the callback implementation. Callbacks are invoked by callers of the
   * `HandleEvent` function, and any errors produced by the callback function
   * will manifest there. Callbacks that return errors will not be automatically
   * re-registered.
   */
  Result<void> Register(SharedFD fd, uint32_t events, EpollCallback callback);
  Result<void> HandleEvent();
  Result<void> Remove(SharedFD fd);

 private:
  std::shared_mutex instance_mutex_;
  Epoll epoll_;
  std::mutex callbacks_mutex_;
  std::map<SharedFD, EpollCallback> callbacks_;
};

fruit::Component<EpollPool> EpollLoopComponent();

}  // namespace cuttlefish
