misc: Use allocate_once in getmntent

Both the buffer and struct mntent are now allocated on the heap.
This results in a slight reduction of RSS usage.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
Florian Weimer 2019-08-28 12:01:48 +02:00
parent ffced383cd
commit 35ffd20dbd
2 changed files with 30 additions and 17 deletions

View File

@ -1,3 +1,11 @@
2019-08-28 Florian Weimer <fweimer@redhat.com>
* misc/mntent.c (struct mntent_buffer): Define.
(mntent_buffer): Adjust type to void *.
(allocate): Adjust for allocate_once.
(deallocate): New function.
(getmntent): Call allocate_once.
2019-08-28 Florian Weimer <fweimer@redhat.com>
nptl: Move pthread_attr_setdetachstate implementation into libc.

View File

@ -18,36 +18,41 @@
#include <mntent.h>
#include <stdlib.h>
#include <libc-lock.h>
#include <allocate_once.h>
struct mntent_buffer
{
struct mntent m;
char buffer[4096];
};
/* We don't want to allocate the static buffer all the time since it
is not always used (in fact, rather infrequently). Accept the
extra cost of a `malloc'. */
libc_freeres_ptr (static char *getmntent_buffer);
is not always used (in fact, rather infrequently). */
libc_freeres_ptr (static void *mntent_buffer);
/* This is the size of the buffer. This is really big. */
#define BUFFER_SIZE 4096
static void
allocate (void)
static void *
allocate (void *closure)
{
getmntent_buffer = (char *) malloc (BUFFER_SIZE);
return malloc (sizeof (struct mntent_buffer));
}
static void
deallocate (void *closure, void *ptr)
{
free (ptr);
}
struct mntent *
getmntent (FILE *stream)
{
static struct mntent m;
__libc_once_define (static, once);
__libc_once (once, allocate);
if (getmntent_buffer == NULL)
struct mntent_buffer *buffer = allocate_once (&mntent_buffer,
allocate, deallocate, NULL);
if (buffer == NULL)
/* If no core is available we don't have a chance to run the
program successfully and so returning NULL is an acceptable
result. */
return NULL;
return __getmntent_r (stream, &m, getmntent_buffer, BUFFER_SIZE);
return __getmntent_r (stream, &buffer->m,
buffer->buffer, sizeof (buffer->buffer));
}