/* * Copyright (C) 2017 Mentor Graphics Development (Deutschland) GmbH * * 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. */ #ifndef WM_UTIL_HPP #define WM_UTIL_HPP #include #include #include extern "C" { #include }; #ifdef __GNUC__ #define ATTR_FORMAT(stringindex, firsttocheck) \ __attribute__((format(printf, stringindex, firsttocheck))) #define ATTR_NORETURN __attribute__((noreturn)) #else #define ATTR_FORMAT(stringindex, firsttocheck) #define ATTR_NORETURN #endif #define lognotice(...) AFB_NOTICE(__VA_ARGS__) #define logerror(...) AFB_ERROR(__VA_ARGS__) #define fatal(...) \ do { \ AFB_ERROR(__VA_ARGS__); \ abort(); \ } while (0) #ifdef DEBUG_OUTPUT #define logdebug(...) AFB_DEBUG(__VA_ARGS__) #else #define logdebug(...) #endif #ifndef NDEBUG #define DB(expr) \ do { \ std::ostringstream o; \ o << __FILE__ << ":" << __LINE__ << ":" << __func__ << ": " << expr; \ logdebug("%s", o.str().c_str()); \ } while (0) #else #define DB(expr) #endif // _ _ _ __ _ // ___| |_ _ __ _ _ ___| |_ _ _ _ __ (_) __ _ _ _ ___ / _| __| | // / __| __| '__| | | |/ __| __| | | | | '_ \| |/ _` | | | |/ _ \ | |_ / _` | // \__ \ |_| | | |_| | (__| |_ | |_| | | | | | (_| | |_| | __/ | _| (_| | // |___/\__|_| \__,_|\___|\__| \__,_|_| |_|_|\__, |\__,_|\___|___|_| \__,_| // |_| |_____| struct unique_fd { int fd{-1}; unique_fd() = default; explicit unique_fd(int f) : fd{f} {} operator int() const { return fd; } ~unique_fd(); unique_fd(unique_fd const &) = delete; unique_fd &operator=(unique_fd const &) = delete; unique_fd(unique_fd &&o) : fd(o.fd) { o.fd = -1; } unique_fd &operator=(unique_fd &&o) { std::swap(this->fd, o.fd); return *this; } }; // _ _ ____ _ _ // ___| |_ _ __ _ _ ___| |_ | _ \ ___ | | | ___ _ __ // / __| __| '__| | | |/ __| __| | |_) / _ \| | |/ _ \ '__| // \__ \ |_| | | |_| | (__| |_ | __/ (_) | | | __/ | // |___/\__|_| \__,_|\___|\__| |_| \___/|_|_|\___|_| // struct Poller { std::vector> handlers; std::vector pfds; Poller() = default; void add_fd(int fd, std::function handler); int check_events(); }; #endif // !WM_UTIL_HPP