Linux-FD

 view release on metacpan or  search on metacpan

lib/Linux/FD.xs  view on Meta::CPAN

		if (ret == -1) {
			if (errno == EAGAIN)
				XSRETURN_EMPTY;
			else
				die_sys("Couldn't write to eventfd: %s");
		}
		RETVAL = value;
	OUTPUT:
		RETVAL


MODULE = Linux::FD				PACKAGE = Linux::FD::Signal

SV* new(const char* classname, sigset_t* sigmask, ...)
	PREINIT:
		int i, flags = SFD_CLOEXEC;
	CODE:
		for (i = 2; i < items; i++)
			flags |= get_signal_flag(ST(i));
		RETVAL = new_signalfd(classname, sigmask, flags);
	OUTPUT:
		RETVAL

void set_mask(Fd fd, sigset_t* sigmask)
	CODE:
	if(signalfd(fd, sigmask, 0) == -1)
		die_sys("Couldn't set_mask: %s");

struct signalfd_siginfo receive(Fd fd)
	PREINIT:
		int tmp;
	CODE:
		do {
			tmp = read(fd, &RETVAL, sizeof(RETVAL));
		} while (interrupted(tmp));
		if (tmp == -1) {
			if (errno == EAGAIN)
				XSRETURN_EMPTY;
			else
				die_sys("Couldn't read from signalfd: %s");
		}
	OUTPUT:
		RETVAL


MODULE = Linux::FD				PACKAGE = Linux::FD::Timer

SV* new(const char* classname, SV* clock, ...)
	PREINIT:
		int i, flags = TFD_CLOEXEC;
	CODE:
		for (i = 2; i < items; i++)
			flags |= get_timer_flag(ST(i));
		RETVAL = new_timerfd(classname, clock, flags, "Linux::FD::Timer->new");
	OUTPUT:
		RETVAL

void get_timeout(Fd timerfd)
	PREINIT:
		struct itimerspec value;
	PPCODE:
		if (timerfd_gettime(timerfd, &value) == -1)
			die_sys("Couldn't get_timeout: %s");
		mXPUSHn(timespec_to_nv(&value.it_value));
		if (GIMME_V == G_ARRAY)
			mXPUSHn(timespec_to_nv(&value.it_interval));

SV* set_timeout(Fd timerfd, struct timespec new_value, struct timespec new_interval = NEVER, bool abstime = FALSE)
	PREINIT:
		struct itimerspec new_itimer, old_itimer;
	PPCODE:
		new_itimer.it_value = new_value;
		new_itimer.it_interval = new_interval;
		if (timerfd_settime(timerfd, (abstime ? TIMER_ABSTIME : 0), &new_itimer, &old_itimer) == -1)
			die_sys("Couldn't set_timeout: %s");
		mXPUSHn(timespec_to_nv(&old_itimer.it_value));
		if (GIMME_V == G_ARRAY)
			mXPUSHn(timespec_to_nv(&old_itimer.it_interval));

IV receive(Fd timerfd)
	PREINIT:
		uint64_t buffer;
		int ret;
	CODE:
		do {
			ret = read(timerfd, &buffer, sizeof buffer);
		} while (interrupted(ret));
		if (ret == -1) {
			if (errno == EAGAIN)
				XSRETURN_EMPTY;
			else
				die_sys("Couldn't read from timerfd: %s");
		}
		RETVAL = buffer;
	OUTPUT:
		RETVAL

void clocks(SV* classname)
	INIT:
	int i;
	PPCODE:
	for (i = 0; i < sizeof clocks / sizeof *clocks; ++i)
		mXPUSHp(clocks[i].key, clocks[i].length);



( run in 1.983 second using v1.01-cache-2.11-cpan-71847e10f99 )