/* * Copyright (C) 1998-2013 Paul Davis * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __selectable_h__ #define __selectable_h__ #include #include #include #include #include #include "pbd/libpbd_visibility.h" namespace Select { enum LIBPBD_API Condition { Readable = 0x1, Writable = 0x2, Exception = 0x4 }; class LIBPBD_API Selectable : public sigc::trackable { public: Selectable (int fd); Selectable (const std::string &, int flags, int mode = 0); Selectable (FILE *); ~Selectable (); sigc::signal readable; sigc::signal writable; sigc::signal exceptioned; int fd() { return _fd; } bool ok() { return _ok; } protected: void selected (unsigned int condition); int condition; int _fd; friend class Selector; private: enum { fromFD, fromPath, fromFILE }; bool _ok; int _type; std::string path; }; class LIBPBD_API Selector { private: int post_select (fd_set *, fd_set *, fd_set *); int _max_fd; typedef std::list Selectables; Selectables selectables; pthread_mutex_t list_lock; static bool use_list_lock; public: Selector (); void multithreaded (bool yn) { use_list_lock = yn; } void add (int condition, Selectable *s); void remove (Selectable *); int select (unsigned long usecs); }; } /* namespace */ #endif // __selectable_h__