Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Mar 2002 23:43:00 +0100 (CET)
From:      BOUWSMA Beery <freebsd-user@dcf77-zeit.netscum.dyndns.dk>
To:        Terry Lambert <tlambert2@mindspring.com>
Cc:        hackers@freebsd.org, Jonathan Buzzard <jonathan@buzzard.org.uk>, "Garrett A. Wollman" <wollman@freebsd.org>
Subject:   Re: How to correctly detect POSIX 1003.1b features on FreeBSD?
Message-ID:  <200203272243.g2RMh0Q01586@beerswilling.netscum.dyndns.dk>
References:  <20020312140904.A799@bbn.com> <3C8E742C.7C2E63B8@mindspring.com> <20020312193514.A2226@bbn.com> <20020313005940.GB32410@elvis.mu.org> <20020312201314.A2345@bbn.com> <3C8EB31E.19382903@mindspring.com> <20020312214007.A2526@bbn.com> <200203201907.g2KJ71R03929@beerswilling.netscum.dyndns.dk> <3C990F76.B66BEBF9@mindspring.com>

next in thread | previous in thread | raw e-mail | index | archive | help

Moin, moin!
%s wrote on %.3s, %lld Sep 1993

> > Anyway, when compiling this Linux program, which has lines
> [ ... ]
> > linking fails...
> 
> Don't compile on Linux?  8-) 8-)

BINGO!!!  Give that man a cigar.  Once again it has been pointed out
to me that my messages are hopelessly unclear.  Let me try again:

This program, originally written for Linux, needs a few small hacks
to get it to compile and/or work under FreeBSD.  Once one slays the
obvious dragons, leaving the m{un}lockall() calls untouched, any
attempts to compile this program, originally written for Linux,
under FreeBSD (stable, for what it's worth) are doomed to failure
by the following:
  [continue with the original ``undefined reference
   to `munlockall' '' errors]


>  Is your code controlling a
> nuclear reactor?  No?  Then it doesn't need the calls.  8-).

Well, no.  But it is connected to a (wait, I need to hold the
punchline until it's appropriate)


> I don't know the proper test off the top of my head, but I
> know who would know, and I know a test that works for
> m{un}lockall(), and both of those are better anyway.

Thanks!  I'm all ears.

Unfortunately.


> The person who would know would be Garrett A. Wollman; his
> email is <wollman@FreeBSD.org>.  He would know because he's
> been on the committes, and he's know because he wrote the
> shm_open(3) library code... just like it says at the bottom

And best of all, from my occasional views into the Monastery,
he's sufficiently interested in the topic that if I were to
mention that this collection of k0deZ is intended to interface
a radio, erm, I mean <blink>   -->  RADIO  <--   </BLINK> clock
timekeeping driver (emphasis on RADIO, that is ****RADIO****),      <- look!!!
then perhaps it may grab his interest.  Or not.    ^^^^^


> The test that works for m{un}lockall() requires that you:
[...]
> o	The mlockall() function takes a flags argument that
> 	is an inclusive OR of one of several manifest
> 	constants.
> 
> So basically, if you test for the manifest constants before
> making a call that uses them, then you are safe, e.g.:
> 
> 	#ifdef MCL_CURRENT
> 		mlockall( MCL_CURRENT);
> 	#endif
[...]
> This should work everywhere, even on Linux, without having to
> break down and ask the person who wrote the code from the POSIX

Unfortunately, while I'd love to tell you that it works just all
sorts of groovy and everything, I regret to say that in the
included file <sys/mman.h> one finds the following lines:

| #ifdef _P1003_1B_VISIBLE
| /*
|  * Process memory locking
|  */
| #define MCL_CURRENT     0x0001  /* Lock only current memory */
| #define MCL_FUTURE      0x0002  /* Lock all future memory as well */
| 
| #endif /* _P1003_1B_VISIBLE */

Comparable to the lines around m{un}lockall() themselves.


And in spite of wrapping the calls in the program in question
with a test for this...

|                 /* lock all memory pages */
| #ifdef MCL_CURRENT  /* is the mlockall() call available? */
|                 if (mlockall(MCL_CURRENT | MCL_FUTURE) !=0)
|                         syslog(LOG_INFO, "error unable to lock memory pages");
| #else  /* no, do without, but make note of it... */
|                 syslog(LOG_INFO, "error unsupported memory pages lock call");
| #endif

again everything falls apart with the failure:

/usr/bin/gcc -s -o radioclkd radioclkd.o
radioclkd.o: In function `Catch':
radioclkd.o(.text+0xd73): undefined reference to `munlockall'
radioclkd.o: In function `main':
radioclkd.o(.text+0x11e3): undefined reference to `mlockall'
*** Error code 1


> Alternately, you could send an email to Garrett.

This sounds like a good idea, since within the last week he has
made mention of the particular broadcast station around which this
code in question is based, but more importantly, because I wasn't
able to convert your suggestions into working code.  Naturally, my
ugly brute force ``solution'' of an `#if 0' wrapper sort of messes
up things for Linux and Solaris...

But thanks for the ideas.  As I said many moons ago, I know nothing.


ihr
barry bouwsma


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203272243.g2RMh0Q01586>