umtx_lock and friends
Daniel Eischen
deischen at freebsd.org
Wed Jun 10 01:00:29 UTC 2015
On Tue, 9 Jun 2015, Russell L. Carter wrote:
> 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."
Correct, not supported yet. A rather large change to change
pthread mutex and CV types from pointers to structs is needed.
>> 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.
Is cc doing something special because it thinks it is C++?
I'm on 10-stable amd64 and that example (saved as tester.c)
works just fine.
--
DE
More information about the freebsd-hackers
mailing list