/*
    PIP - Platform Independent Primitives
    Private PIP wait object
    Ivan Pelipenko peri4ko@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 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 Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef PIWAITEVENT_P_H
#define PIWAITEVENT_P_H

#include "pibase.h"
// clang-format off
#ifdef WINDOWS
#  include <stdarg.h>
#  include <windef.h>
#  include <winbase.h>
#else
#  include <sys/select.h>
#  include <unistd.h>
#endif
// clang-format on


class PIP_EXPORT PIWaitEvent {
public:
	~PIWaitEvent();

	enum CheckRole { // UNIX only
		CheckRead,
		CheckWrite,
		CheckExeption
	};

	void create();
	void destroy();
	bool wait(int fd = -1, CheckRole role = CheckRead);
	bool sleep(int us); // return if sleep done
	void interrupt();
	bool isCreate() const;
	void * getEvent() const; // WINDOWS only

private:
#ifdef WINDOWS
	void * event = nullptr;
#else
	int pipe_fd[2] = {-1, -1};
	fd_set fds[3];
	enum {
		ReadEnd  = 0,
		WriteEnd = 1
	};
#endif
};


#endif // PIWAITEVENT_P_H
