Skip to content
  • David Howells's avatar
    [PATCH] NOMMU: Make futexes work under NOMMU conditions · 930e652a
    David Howells authored
    
    
    Make futexes work under NOMMU conditions.
    
    This can be tested by running this in one shell:
    
    	#define SYSERROR(X, Y) \
    		do { if ((long)(X) == -1L) { perror(Y); exit(1); }} while(0)
    
    	int main()
    	{
    		int shmid, tmp, *f, n;
    
    		shmid = shmget(23, 4, IPC_CREAT|0666);
    		SYSERROR(shmid, "shmget");
    
    		f = shmat(shmid, NULL, 0);
    		SYSERROR(f, "shmat");
    
    		n = *f;
    		printf("WAIT: %p{%x}\n", f, n);
    		tmp = futex(f, FUTEX_WAIT, n, NULL, NULL, 0);
    		SYSERROR(tmp, "futex");
    		printf("WAITED: %d\n", tmp);
    
    		tmp = shmdt(f);
    		SYSERROR(tmp, "shmdt");
    
    		exit(0);
    	}
    
    And then this in the other shell:
    
    	#define SYSERROR(X, Y) \
    		do { if ((long)(X) == -1L) { perror(Y); exit(1); }} while(0)
    
    	int main()
    	{
    		int shmid, tmp, *f;
    
    		shmid = shmget(23, 4, IPC_CREAT|0666);
    		SYSERROR(shmid, "shmget");
    
    		f = shmat(shmid, NULL, 0);
    		SYSERROR(f, "shmat");
    
    		(*f)++;
    		printf("WAKE: %p{%x}\n", f, *f);
    		tmp = futex(f, FUTEX_WAKE, 1, NULL, NULL, 0);
    		SYSERROR(tmp, "futex");
    		printf("WOKE: %d\n", tmp);
    
    		tmp = shmdt(f);
    		SYSERROR(tmp, "shmdt");
    
    		exit(0);
    	}
    
    The first program will set up a SYSV IPC SHM segment and wait on a futex in it
    for the number at the start to change.  The program will increment that number
    and wake the first program up.  This leads to output of the form:
    
    	SHELL 1			SHELL 2
    	=======================	=======================
    	# /dowait
    	WAIT: 0xc32ac000{0}
    				# /dowake
    				WAKE: 0xc32ac000{1}
    	WAITED: 0		WOKE: 1
    
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    930e652a