umtx_lock and friends
Russell L. Carter
rcarter at pinyon.org
Wed Jun 10 00:52:52 UTC 2015
Hi Daniel,
On 06/09/15 16:57, Daniel Eischen wrote:
> On Tue, 9 Jun 2015, Russell L. Carter wrote:
>
>> Hi,
>>
>> I'm investigating what the most lightweight inter-process mutex
>> technique on FreeBSD and have been looking at the
>> infrastructure in /usr/include/sys/umtx.h
>>
>> However, my simple test program fails to link:
>>
>> #include <stdio.h>
>> #include <sys/types.h>
>> #include <machine/atomic.h>
>> #include <errno.h>
>> #include <sys/umtx.h>
>>
>> int main(int, char **)
>> {
>> printf("Testing...");
>> struct umtx m;
>> umtx_init(&m);
>> u_long id=5;
>> umtx_lock(&m, id);
>> umtx_unlock(&m, id);
>> printf("Test done.");
>> return 0;
>> }
>>
>> produces the following:
>>
>> tester.cpp:(.text+0x36): undefined reference to `_umtx_lock(umtx*)'
>> tester.cpp:(.text+0x5f): undefined reference to `_umtx_unlock(umtx*)'
>>
>> I've tried linking against a variety of suspects in /usr/lib but
>> no luck.
>>
>> go-lang uses _umtx_op but they make the syscall directly via asm,
>> it seems.
>>
>> I can build an inter-process mutex over semaphores but the umtx
>> stuff looks perfect if I can get it to work.
>
> I'm not sure you are really suppose to be using those directly.
> They are provided for FreeBSD's libraries (libthr) to use.
But libthr doesn't support inter-process mutexes, correct? Here's
the relevant excerpt from pthread_rwlockattr_setpshared(3):
"BUGS
The PTHREAD_PROCESS_SHARED attribute is not supported."
> If they are meant for public consumption, I don't like how they
> are implemented as static inlines in sys/umtx.h - it's not
> possible to properly bind to these functions from non-C
> languages.
>
> But, nonetheless, your example compiles and runs just fine as
> a C program on FreeBSD 10-stable.
>
On FreeBSD 10-stable r283752 amd64, here is the compile line:
/usr/bin/cc -O -Wall tester.cpp -o tester
/tmp/tester-b681b3.o: In function `main':
tester.cpp:(.text+0x35): undefined reference to `_umtx_lock(umtx*)'
tester.cpp:(.text+0x5c): undefined reference to `_umtx_unlock(umtx*)'
Compilers don't matter, linking against libthr or libstdthreads
doesn't matter.
Thanks,
Russell
More information about the freebsd-hackers
mailing list