1 //
2 // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 #include "td/utils/port/PollFlags.h"
8 
9 namespace td {
10 
write_flags(PollFlags flags)11 bool PollFlagsSet::write_flags(PollFlags flags) {
12   if (flags.empty()) {
13     return false;
14   }
15   auto old_flags = to_write_.fetch_or(flags.raw(), std::memory_order_relaxed);
16   return (flags.raw() & ~old_flags) != 0;
17 }
18 
write_flags_local(PollFlags flags)19 bool PollFlagsSet::write_flags_local(PollFlags flags) {
20   return flags_.add_flags(flags);
21 }
22 
flush() const23 bool PollFlagsSet::flush() const {
24   if (to_write_.load(std::memory_order_relaxed) == 0) {
25     return false;
26   }
27   auto to_write = to_write_.exchange(0, std::memory_order_relaxed);
28   auto old_flags = flags_;
29   flags_.add_flags(PollFlags::from_raw(to_write));
30   if (flags_.can_close()) {
31     flags_.remove_flags(PollFlags::Write());
32   }
33   return flags_ != old_flags;
34 }
35 
read_flags() const36 PollFlags PollFlagsSet::read_flags() const {
37   flush();
38   return flags_;
39 }
40 
read_flags_local() const41 PollFlags PollFlagsSet::read_flags_local() const {
42   return flags_;
43 }
44 
clear_flags(PollFlags flags)45 void PollFlagsSet::clear_flags(PollFlags flags) {
46   flags_.remove_flags(flags);
47 }
48 
clear()49 void PollFlagsSet::clear() {
50   to_write_ = 0;
51   flags_ = {};
52 }
53 
operator <<(StringBuilder & sb,PollFlags flags)54 StringBuilder &operator<<(StringBuilder &sb, PollFlags flags) {
55   sb << '[';
56   if (flags.can_read()) {
57     sb << 'R';
58   }
59   if (flags.can_write()) {
60     sb << 'W';
61   }
62   if (flags.can_close()) {
63     sb << 'C';
64   }
65   if (flags.has_pending_error()) {
66     sb << 'E';
67   }
68   return sb << ']';
69 }
70 
71 }  // namespace td
72