Blame locale/freelocale.c

Packit 6c4009
/* Free data allocated by a call to setlocale_r
Packit 6c4009
   Copyright (C) 1996-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <locale.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <libc-lock.h>
Packit 6c4009
Packit 6c4009
#include "localeinfo.h"
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* Lock for protecting global data.  */
Packit 6c4009
__libc_rwlock_define (extern , __libc_setlocale_lock attribute_hidden)
Packit 6c4009
Packit 6c4009
Packit 6c4009
void
Packit 6c4009
__freelocale (locale_t dataset)
Packit 6c4009
{
Packit 6c4009
  int cnt;
Packit 6c4009
Packit 6c4009
  /* This static object is returned for newlocale (LC_ALL_MASK, "C").  */
Packit 6c4009
  if (dataset == _nl_C_locobj_ptr)
Packit 6c4009
    return;
Packit 6c4009
Packit 6c4009
  /* We modify global data (the usage counts).  */
Packit 6c4009
  __libc_rwlock_wrlock (__libc_setlocale_lock);
Packit 6c4009
Packit 6c4009
  for (cnt = 0; cnt < __LC_LAST; ++cnt)
Packit 6c4009
    if (cnt != LC_ALL && dataset->__locales[cnt]->usage_count != UNDELETABLE)
Packit 6c4009
      /* We can remove the data.  */
Packit 6c4009
      _nl_remove_locale (cnt, dataset->__locales[cnt]);
Packit 6c4009
Packit 6c4009
  /* It's done.  */
Packit 6c4009
  __libc_rwlock_unlock (__libc_setlocale_lock);
Packit 6c4009
Packit 6c4009
  /* Free the locale_t handle itself.  */
Packit 6c4009
  free (dataset);
Packit 6c4009
}
Packit 6c4009
weak_alias (__freelocale, freelocale)