Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Nov 2016 17:10:40 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Volker Lendecke <Volker.Lendecke@SerNet.DE>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: process shared mutexes?
Message-ID:  <20161121151040.GA54029@kib.kiev.ua>
In-Reply-To: <20161121141616.GB30947@sernet.de>
References:  <20161121133528.GA30947@sernet.de> <20161121135036.GY54029@kib.kiev.ua> <20161121141616.GB30947@sernet.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Nov 21, 2016 at 03:16:16PM +0100, Volker Lendecke wrote:
> On Mon, Nov 21, 2016 at 03:50:36PM +0200, Konstantin Belousov wrote:
> > On Mon, Nov 21, 2016 at 02:35:28PM +0100, Volker Lendecke wrote:
> > > Hello!
> > > 
> > > For Samba's tdb I'm trying to get process shared robust mutexes to
> > > work. However, tdb has a usage pattern that seems to confuse FreeBSD
> > > 11 (32-bit x86 if that matters).
> > > 
> > > The attached program fails in the final pthread_mutex_lock call. If I
> > > comment out the call to
> > > 
> > > ptr = mmap(NULL, 0xb0, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x1000);
> > > 
> > > it works.
> > > 
> > > FWIW, tdb uses robust shared mutexes on Linux successfully for a while
> > > now. I haven't tried Solaris yet, the only other platform I know about
> > > that has them.
> > > 
> > > What am I doing wrong?
Please see the libthr(3) man page, in particular, read the RUN-TIME
SETTINGS section, the description of the kern.ipc.umtx_vnode_persistent
sysctl.

Does setting the sysctl to 1 allow your program to run ?
> > > 
> > > Thanks,
> > > 
> > 
> > There is no attached program, please mail it either inline or put it
> > somewhere on web.
> 
> Hmm. Inline now.
> 
> Volker
> 
> 
> #include <stdio.h>
> #include <pthread.h>
> #include <errno.h>
> #include <unistd.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <sys/mman.h>
> #include <string.h>
> 
> int main(int argc, const char *argv[])
> {
> 	int fd, ret;
> 	void *ptr;
> 	pthread_mutex_t *m;
> 	pthread_mutexattr_t attr;
> 
> 	if (argc != 2) {
> 		fprintf(stderr, "usage: %s <filename>\n", argv[0]);
> 		return 1;
> 	}
> 
> 	fd = open(argv[1], O_RDWR|O_CREAT, 0644);
> 	if (fd == -1) {
> 		perror("open failed");
> 		return 1;
> 	}
> 
> 	ret = ftruncate(fd, 0x1000+0xb0);
> 	if (ret == -1) {
> 		perror("ftruncate failed");
> 		return 1;
> 	}
> 
> 	m = mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
> 	if (m == MAP_FAILED) {
> 		perror("mmap failed");
> 		return 1;
> 	}
> 
> 	ret = pthread_mutexattr_init(&attr);
> 	if (ret != 0) {
> 		fprintf(stderr, "pthread_mutexattr_init failed: %s\n",
> 			strerror(ret));
> 		return 1;
> 	}
> 
> 	ret = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
> 	if (ret != 0) {
> 		fprintf(stderr, "pthread_mutexattr_setpshared failed: %s\n",
> 			strerror(ret));
> 		return 1;
> 	}
> 
> 	ret = pthread_mutex_init(m, &attr);
> 	if (ret != 0) {
> 		fprintf(stderr, "pthread_mutex_init failed: %s\n",
> 			strerror(ret));
> 		return 1;
> 	}
> 
> 	ret = munmap(m, 0x1000);
> 	if (ret == -1) {
> 		perror("munmap failed");
> 		return 1;
> 	}
> 
> #if 1
> 	ptr = mmap(NULL, 0xb0, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x1000);
> 	if (ptr == MAP_FAILED) {
> 		perror("mmap failed");
> 		return 1;
> 	}
> #endif
> 
> 	m = mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
> 	if (m == MAP_FAILED) {
> 		perror("mmap failed");
> 		return 1;
> 	}
> 
> 	ret = pthread_mutex_lock(m);
> 	if (ret != 0) {
> 		fprintf(stderr, "pthread_mutex_lock failed: %s\n",
> 			strerror(ret));
> 		return 1;
> 	}
> 
> 	ret = pthread_mutex_unlock(m);
> 	if (ret != 0) {
> 		fprintf(stderr, "pthread_mutex_lock failed: %s\n",
> 			strerror(ret));
> 		return 1;
> 	}
> 
> 	return 0;
> }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20161121151040.GA54029>