process shared mutexes?

Volker Lendecke Volker.Lendecke at SerNet.DE
Mon Nov 21 14:16:22 UTC 2016


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;
}


More information about the freebsd-hackers mailing list