Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/source/extensions/io_socket/user_space/file_event_impl.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include <cstdint>
4
5
#include "envoy/event/dispatcher.h"
6
#include "envoy/event/file_event.h"
7
8
#include "source/common/common/assert.h"
9
#include "source/extensions/io_socket/user_space/io_handle.h"
10
11
namespace Envoy {
12
13
namespace Extensions {
14
namespace IoSocket {
15
namespace UserSpace {
16
17
// A FileEvent implementation which is used to drive UserSpaceHandle.
18
// Declare the class final to safely call virtual function setEnabled in constructor.
19
class FileEventImpl final : public Event::FileEvent, Logger::Loggable<Logger::Id::io> {
20
public:
21
  FileEventImpl(Event::Dispatcher& dispatcher, Event::FileReadyCb cb, uint32_t events,
22
                IoHandle& io_source);
23
24
  // Event::FileEvent
25
  void activate(uint32_t events) override;
26
  void setEnabled(uint32_t events) override;
27
28
  // This event always acts as edge triggered regardless the underlying OS is level or
29
  // edge triggered. The event owner on windows platform should not emulate edge events.
30
0
  void unregisterEventIfEmulatedEdge(uint32_t) override {}
31
0
  void registerEventIfEmulatedEdge(uint32_t) override {}
32
33
  // Notify events. Unlike activate() method, this method activates the given events only if the
34
  // events are enabled.
35
  void activateIfEnabled(uint32_t events);
36
37
private:
38
  // This class maintains the ephemeral events and enabled events.
39
  class EventListener {
40
  public:
41
    ~EventListener() = default;
42
43
    // Reset the enabled events. The caller must refresh the triggered events.
44
0
    void setEnabledEvents(uint32_t enabled_events) { enabled_events_ = enabled_events; }
45
46
    // Return the enabled events.
47
0
    uint32_t getEnabledEvents() { return enabled_events_; }
48
49
0
    void clearEphemeralEvents() {
50
      // Clear ephemeral events to align with FileEventImpl::setEnabled().
51
0
      ephemeral_events_ = 0;
52
0
    }
53
54
0
    void onEventActivated(uint32_t activated_events) { ephemeral_events_ |= activated_events; }
55
56
0
    uint32_t getAndClearEphemeralEvents() { return std::exchange(ephemeral_events_, 0); }
57
58
  private:
59
    // The events set by activate() and will be cleared after the io callback.
60
    uint32_t ephemeral_events_{};
61
    // The events set by setEnabled(). The new value replaces the old value.
62
    uint32_t enabled_events_{};
63
  };
64
65
  // Used to populate the event operations of enable and activate.
66
  EventListener event_listener_;
67
68
  // The handle to registered async callback from dispatcher.
69
  Event::SchedulableCallbackPtr schedulable_;
70
71
  // Supplies readable and writable status.
72
  IoHandle& io_source_;
73
};
74
} // namespace UserSpace
75
} // namespace IoSocket
76
} // namespace Extensions
77
} // namespace Envoy