Date: Tue, 9 Jun 2015 21:00:27 -0400 (EDT) From: Daniel Eischen <deischen@freebsd.org> To: "Russell L. Carter" <rcarter@pinyon.org> Cc: freebsd-hackers@freebsd.org Subject: Re: umtx_lock and friends Message-ID: <Pine.GSO.4.64.1506092054570.10480@sea.ntplx.net> In-Reply-To: <55778A60.9090200@pinyon.org> References: <55777108.5020206@pinyon.org> <Pine.GSO.4.64.1506091940001.10480@sea.ntplx.net> <55778A60.9090200@pinyon.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.64.1506092054570.10480>
