process shared mutexes?
Konstantin Belousov
kostikbel at gmail.com
Mon Nov 21 15:10:48 UTC 2016
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;
> }
More information about the freebsd-hackers
mailing list