components/llvm/cxa_finalize/cxa_finalize.c
author Stefan Teleman <stefan.teleman@oracle.com>
Wed, 10 Feb 2016 11:54:12 -0800
changeset 5434 9f55c805ce9d
permissions -rw-r--r--
PSARC/2013/188 Clang/LLVM 15777690 clang/llvm compiler infrastructure in Solaris 21851513 severe memory corruption in the LLVM command-line parsing module 22031298 toxic bugs in LLVM ilist/plist end up eliminating entire MachineBasicBlocks 22065707 LLVM SPARC assembler generator emits wrong ELF Section flags 22346218 LLVM's assembler printer on SPARC needs a lot of work 21870061 partial template specializations in CommandLine.h are buggy 21874261 the Google Test Harness doesn't know how to count threads in Solaris 21697459 memory corruption in LLVM IR Code Generator 21341968 llc on SPARC should not need to be passed -march=sparc or -march=sparcv9 21870103 TableGen makes incorrect assumptions about anonymous namespace instantiation 21870087 naming convention for the InputFile key is inconsistent across LLVM utilities 21870099 128 bytes for a filesystem path is definitely not enough 21870067 lli makes incorrect assumptions about anonymous namespace instantiation order 21870065 llc makes incorrect assumptions about anonymous namespace instantiation order 21870283 llvm::sys::Process::GetArgumentVector should overload for std::vector 21874221 clang C++ does not properly initialize the C++ Standard Library's iostreams
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5434
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     1
/*
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     2
 * CDDL HEADER START
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     3
 *
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     7
 *
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    11
 * and limitations under the License.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    12
 *
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    18
 *
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    19
 * CDDL HEADER END
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    20
 *
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    21
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    22
 */
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    23
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    24
/* A Solaris implementation of the Itanium C++ ABI __cxa_atexit
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    25
 * and __cxa_finalize functions.
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    26
 */
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    27
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    28
#include <stdlib.h>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    29
#include <pthread.h>
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    30
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    31
#include "cxa_finalize.h"
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    32
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    33
#define __CXA_FUNC_CALLBACK 0
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    34
#define __CXA_FUNC_DONE     1
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    35
#define __CXA_ATEXIT_CHUNK  64
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    36
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    37
#define __DSO_TYPE_DESTRUCTOR 1
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    38
#define __DSO_TYPE_DLCLOSE    2
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    39
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    40
#define __DSO_SCOPE_LOCAL  4
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    41
#define __DSO_SCOPE_GLOBAL 8
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    42
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    43
#ifdef __cplusplus
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    44
extern "C" {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    45
#endif
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    46
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    47
typedef struct __cxxabi_atexit {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    48
  void (*cxa_func)(void*);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    49
  uint32_t type;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    50
  uint32_t dso_type;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    51
  uint32_t dso_scope;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    52
  void* arg;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    53
  void* dso;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    54
} cxxabi_atexit;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    55
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    56
typedef struct __cxxabi_atexit_list {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    57
  uint32_t size;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    58
  uint32_t nelem;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    59
  cxxabi_atexit* list;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    60
} cxxabi_atexit_list;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    61
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    62
__attribute__((__visibility__("hidden")))
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    63
extern void* __dso_handle;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    64
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    65
static cxxabi_atexit_list _list;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    66
static pthread_mutex_t _mtx = PTHREAD_MUTEX_INITIALIZER;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    67
static uint32_t _registered = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    68
static uint32_t _initialized = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    69
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    70
static int __register_with_atexit(const cxxabi_atexit* cxa);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    71
static int __init_cxxabi_list(cxxabi_atexit** list);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    72
static int __resize_cxxabi_list(const cxxabi_atexit* oldlist, uint32_t nelem,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    73
                                cxxabi_atexit** newlist, uint32_t newsize);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    74
void __cxa_atexit_callback(void);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    75
static void __attribute__((destructor)) __do_cleanup(void);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    76
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    77
int __init_cxxabi_list(cxxabi_atexit** list) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    78
  cxxabi_atexit* __p =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    79
    (cxxabi_atexit *) malloc (__CXA_ATEXIT_CHUNK * sizeof(cxxabi_atexit));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    80
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    81
  if (__p == NULL)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    82
    return -1;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    83
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    84
  *list = __p;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    85
  return 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    86
}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    87
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    88
int __resize_cxxabi_list(const cxxabi_atexit* oldlist, uint32_t nelem,
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    89
                         cxxabi_atexit** newlist, uint32_t newsize) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    90
  register cxxabi_atexit* __p =
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    91
    (cxxabi_atexit *) malloc (newsize * sizeof(cxxabi_atexit));
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    92
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    93
  if (__p == NULL)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    94
    return -1;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    95
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    96
  const cxxabi_atexit* __l = oldlist;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    97
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    98
  for (uint32_t i = 0; i < nelem; ++i)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    99
    *(__p + i) = *(__l + i);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   100
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   101
  *newlist = __p;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   102
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   103
  return 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   104
}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   105
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   106
int __register_with_atexit(const cxxabi_atexit* cxa) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   107
  int ret = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   108
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   109
  if (cxa == NULL)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   110
    return -1;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   111
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   112
  pthread_mutex_lock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   113
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   114
  if (_initialized == 0) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   115
    _list.nelem = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   116
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   117
    ret = __init_cxxabi_list(&_list.list);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   118
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   119
    if (ret == -1) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   120
      pthread_mutex_unlock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   121
      return ret;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   122
    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   123
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   124
    _list.size = __CXA_ATEXIT_CHUNK;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   125
    _initialized = 1;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   126
  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   127
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   128
  if (_list.nelem == _list.size) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   129
    uint32_t newsize = _list.size * 2;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   130
    cxxabi_atexit* __p;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   131
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   132
    ret = __resize_cxxabi_list(_list.list, _list.nelem, &__p, newsize);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   133
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   134
    if (ret == -1) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   135
      free (_list.list);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   136
      _list.list = NULL;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   137
      _list.size = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   138
      _list.nelem = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   139
      pthread_mutex_unlock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   140
      return ret;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   141
    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   142
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   143
    _list.list = __p;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   144
    _list.size = newsize;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   145
  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   146
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   147
  if (_registered == 0) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   148
    ret = atexit(__cxa_atexit_callback);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   149
    _registered = (ret == 0);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   150
  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   151
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   152
  if (_registered != 1) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   153
    free (_list.list);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   154
    _list.list = NULL;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   155
    _list.size = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   156
    _list.nelem = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   157
    pthread_mutex_unlock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   158
    return ret;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   159
  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   160
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   161
  register cxxabi_atexit* __p = _list.list + _list.nelem;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   162
  *__p = *cxa;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   163
  ++_list.nelem;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   164
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   165
  pthread_mutex_unlock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   166
  return ret;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   167
}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   168
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   169
void __cxa_atexit_callback(void) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   170
  cxxabi_atexit* __e = _list.list + (_list.nelem - 1);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   171
  cxxabi_atexit* __p = __e;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   172
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   173
  if (__p == NULL)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   174
    return;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   175
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   176
  /* destroy local scope objects first */
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   177
  for (int i = _list.nelem; i > 0; --i) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   178
    if ((__p->type == __CXA_FUNC_CALLBACK) && 
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   179
        (__p->dso_scope == __DSO_SCOPE_LOCAL)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   180
      __p->type = __CXA_FUNC_DONE;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   181
      __p->cxa_func(__p->arg);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   182
    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   183
    --__p;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   184
  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   185
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   186
  __p = __e;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   187
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   188
  /* destroy global scope objects last */
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   189
  for (int i = _list.nelem; i > 0; --i) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   190
    if ((__p->type == __CXA_FUNC_CALLBACK) &&
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   191
        (__p->dso_scope == __DSO_SCOPE_GLOBAL)) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   192
      __p->type = __CXA_FUNC_DONE;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   193
      __p->cxa_func(__p->arg);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   194
    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   195
    --__p;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   196
  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   197
}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   198
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   199
int __cxa_atexit(void (*destructor)(void*), void* arg, void* dso) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   200
  cxxabi_atexit cxa;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   201
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   202
  cxa.type = __CXA_FUNC_CALLBACK;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   203
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   204
  /* get dso_type from dso object itself */
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   205
  cxa.dso_type = __DSO_TYPE_DESTRUCTOR;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   206
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   207
  /* get dso scope from dso object */
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   208
  cxa.dso_scope = __DSO_SCOPE_GLOBAL;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   209
  cxa.cxa_func = destructor;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   210
  cxa.arg = arg;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   211
  cxa.dso = dso;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   212
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   213
  return __register_with_atexit(&cxa);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   214
}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   215
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   216
int __cxa_finalize(void* dso) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   217
  uint32_t i;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   218
  pthread_mutex_lock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   219
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   220
  if (_initialized == 0) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   221
    pthread_mutex_unlock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   222
    return -1;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   223
  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   224
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   225
  cxxabi_atexit* __p = _list.list;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   226
  pthread_mutex_unlock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   227
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   228
  if (__p == NULL)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   229
    return -1;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   230
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   231
  if (dso == NULL) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   232
    __p = _list.list + (_list.nelem - 1);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   233
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   234
    pthread_mutex_lock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   235
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   236
    for (i = _list.nelem; i > 0; --i) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   237
      if (__p->type == __CXA_FUNC_DONE) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   238
        --__p;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   239
        continue;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   240
      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   241
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   242
      uint32_t __type = __p->type;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   243
      __p->type = __CXA_FUNC_DONE;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   244
      pthread_mutex_unlock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   245
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   246
      if (__type == __CXA_FUNC_CALLBACK)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   247
        __p->cxa_func(__p->arg);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   248
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   249
      --__p;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   250
      pthread_mutex_lock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   251
    }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   252
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   253
    pthread_mutex_unlock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   254
  } else {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   255
    i = 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   256
    do {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   257
      if (__p->dso == dso) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   258
        pthread_mutex_lock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   259
        uint32_t __type = __p->type;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   260
        __p->type = __CXA_FUNC_DONE;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   261
        pthread_mutex_unlock(&_mtx);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   262
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   263
        if (__type == __CXA_FUNC_CALLBACK)
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   264
          __p->cxa_func(__p->arg);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   265
      }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   266
      ++__p; ++i;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   267
    } while (i < _list.nelem);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   268
  }
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   269
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   270
  return 0;
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   271
}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   272
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   273
void __attribute__((destructor)) __do_cleanup(void) {
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   274
  __cxa_finalize(__dso_handle);
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   275
}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   276
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   277
#ifdef __cplusplus
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   278
}
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   279
#endif
9f55c805ce9d PSARC/2013/188 Clang/LLVM
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
   280