[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#8976) LMDB > use posix_madvise(3) instead of madvise(3) for SmartOS

matthieu.guegan@smile-suisse.com wrote:
> On Fri, Feb 15, 2019 at 4:33 PM Howard Chu <hyc@symas.com> wrote:
>> Matthieu GUEGAN wrote:
>>> On Fri, Feb 15, 2019 at 3:56 PM Howard Chu <hyc@symas.com> wrote:
>>>> mguegan@virtua.ch wrote:
>>>>> Full_Name: Matthieu Guegan
>>>>> Version: current
>>>>> OS: SmartOS
>>>>> URL:
>>>>> Submission from: (NULL) (
>>>>> Hi,
>>>>> In order to compile knot[1] on SmartOS, I have done a series of little patches.
>>>>> One of them is linked to the LMDB project, which redirects me here.
>>>>> The idea is to tell SmartOS (and I think the SunOS family) to make use of
>>>>> posix_madvise(3), instead of madvise(3) as implementation on this OS[2] is
>>>>> different than, for example, the Linux[3] one.
>>>>> So, I kindly ask you to take a look at the merge request of the knot project[4],
>>>>> in particular the `src/contrib/lmdb/mdb.c` patch (that's just a ifdef
>>>>> modification) : would it be possible to apply this patch directly in this
>>>>> repository ?
>>>> I see no functional difference between your references [2] and [3].
>>>> What is the benefit of this patch?
>>> Well, the Solaris/SunOS's madvise(3) is defined with an old `caddr_t`
>>> type whereas Linux (and *BSD OSes too) use a more modern approach with
>>> `void *`.
>>> On the `knot` project, which embed the lmdb part of openldap,
>>> compilation failed when using madvise(3) on SmartOS, so I did a
>>> replacement with posix_madvise(3) which uses the `void *` argument
>>> too.
>>> I don't know what's the best way to handle this case, that's why I ask here.
>> A caddr_t is just a typedef of "char *". It should always be legal to
>> pass a void * to such a parameter. What is your compile error message?
> ```
> contrib/lmdb/mdb.c: In function 'mdb_env_map':
> contrib/lmdb/mdb.c:3998:3: error: implicit declaration of function
> 'madvise'; did you mean 'raise'?
> [-Werror=implicit-function-declaration]
>    madvise(env->me_map, env->me_mapsize, MADV_RANDOM);
>    ^~~~~~~
>    raise

This has absolutely nothing to do with whether the parameter is a caddr_t or a void *.
Why would you even mention something totally irrelevant to the actual error?

Strange that you have MADV_RANDOM defined but no declaration of madvise().
Sounds like your system's header files are playing stupid games with definitions.
If you can find out what flags must be used to make the header files properly
declare the madvise function, a patch for that may be acceptable.

  -- Howard Chu
  CTO, Symas Corp.           http://www.symas.com
  Director, Highland Sun     http://highlandsun.com/hyc/
  Chief Architect, OpenLDAP  http://www.openldap.org/project/