#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