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)11bool 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)19bool PollFlagsSet::write_flags_local(PollFlags flags) { 20 return flags_.add_flags(flags); 21 } 22 flush() const23bool 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() const36PollFlags PollFlagsSet::read_flags() const { 37 flush(); 38 return flags_; 39 } 40 read_flags_local() const41PollFlags PollFlagsSet::read_flags_local() const { 42 return flags_; 43 } 44 clear_flags(PollFlags flags)45void PollFlagsSet::clear_flags(PollFlags flags) { 46 flags_.remove_flags(flags); 47 } 48 clear()49void PollFlagsSet::clear() { 50 to_write_ = 0; 51 flags_ = {}; 52 } 53 operator <<(StringBuilder & sb,PollFlags flags)54StringBuilder &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