Date: Mon, 21 Nov 2016 15:16:16 +0100 From: Volker Lendecke <Volker.Lendecke@SerNet.DE> To: Konstantin Belousov <kostikbel@gmail.com> Cc: freebsd-hackers@freebsd.org Subject: Re: process shared mutexes? Message-ID: <20161121141616.GB30947@sernet.de> In-Reply-To: <20161121135036.GY54029@kib.kiev.ua> References: <20161121133528.GA30947@sernet.de> <20161121135036.GY54029@kib.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
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? > > > > 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?20161121141616.GB30947>