#include <fcntl.h>
#include <stdint.h>
#include <unistd.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <linux/futex.h>

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

typedef volatile uint32_t futex_t;

static futex_t *futexes;

static void finit(void)
{
	int fd;

	fd = open("/tmp/syncronization_futex_base_file", O_RDWR | O_CREAT, 0666);

	if (fd < 0) {
		fprintf(stderr, "open(): %s\n", strerror(errno));
		exit(1);
	}

	if (ftruncate(fd, getpagesize())) {
		fprintf(stderr, "ftruncate(): %s\n", strerror(errno));
		exit(1);
	}

	futexes = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

	if (futexes == MAP_FAILED) {
		fprintf(stderr, "mmap(): %s\n", strerror(errno));
		exit(1);
	}
}

static void fwait(unsigned int id, struct timespec *timeout)
{
	syscall(SYS_futex, &futexes[id], FUTEX_WAIT, futexes[id], timeout);
}

static void fwake(unsigned int id)
{
	int ret;

	do {
		ret = syscall(SYS_futex, &futexes[id], FUTEX_WAKE, INT_MAX, NULL);
		usleep(100);
	} while (ret == 0);
}

int main(void)
{
	int pid;

	finit();

	pid = fork();

	switch (pid) {
	case 0:
		fprintf(stderr, "Child calls wait\n");
		fwait(0, NULL);
		fprintf(stderr, "Child woken up\n");
	break;
	case -1:
		fprintf(stderr, "fork(): %s\n", strerror(errno));
	break;
	default:
		/* uncomment to change ordering */
		//usleep(100);
		fprintf(stderr, "Parent calls wake\n");
		fwake(0);
		fprintf(stderr, "Parent finishes\n");
	}

	return 0;
}
------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to