usr/src/lib/libc/port/threads/assfail.c
author Christopher Siden <chris.siden@delphix.com>
Mon, 21 May 2012 12:11:39 -0700
changeset 13700 2889e2596bd6
parent 11913 283e725df792
child 13764 38b4aca480b3
permissions -rw-r--r--
2619 asynchronous destruction of ZFS file systems 2747 SPA versioning with zfs feature flags Reviewed by: Matt Ahrens <[email protected]> Reviewed by: George Wilson <[email protected]> Reviewed by: Richard Lowe <[email protected]> Reviewed by: Dan Kruchinin <[email protected]> Approved by: Eric Schrock <[email protected]>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
2248
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
2248
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
11913
283e725df792 PSARC 2010/062 increase number of realtime signals
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10629
diff changeset
    23
 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
    26
/*
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
    27
 * Copyright (c) 2012 by Delphix. All rights reserved.
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
    28
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include "lint.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include "thr_uberdata.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
const char *panicstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
ulwp_t *panic_thread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
static mutex_t assert_lock = DEFAULTMUTEX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
static ulwp_t *assert_thread = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 * Called from __assert() to set panicstr and panic_thread.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
__set_panicstr(const char *msg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
	panicstr = msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
	panic_thread = __curthread();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * Called from exit() (atexit function) to give precedence
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 * to assertion failures and a core dump over _exit().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
grab_assert_lock()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
{
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
    56
	(void) _lwp_mutex_lock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
Abort(const char *msg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	ulwp_t *self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	struct sigaction act;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	sigset_t sigmask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	lwpid_t lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	/* to help with core file debugging */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	panicstr = msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	if ((self = __curthread()) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
		panic_thread = self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
		lwpid = self->ul_lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	} else {
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    73
		lwpid = _lwp_self();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	/* set SIGABRT signal handler to SIG_DFL w/o grabbing any locks */
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
    77
	(void) memset(&act, 0, sizeof (act));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	act.sa_sigaction = SIG_DFL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	(void) __sigaction(SIGABRT, &act, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	/* delete SIGABRT from the signal mask */
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
    82
	(void) sigemptyset(&sigmask);
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
    83
	(void) sigaddset(&sigmask, SIGABRT);
11913
283e725df792 PSARC 2010/062 increase number of realtime signals
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 10629
diff changeset
    84
	(void) __lwp_sigmask(SIG_UNBLOCK, &sigmask);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    86
	(void) _lwp_kill(lwpid, SIGABRT);	/* never returns */
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    87
	(void) kill(getpid(), SIGABRT);	/* if it does, try harder */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	_exit(127);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 * Write a panic message w/o grabbing any locks other than assert_lock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 * We have no idea what locks are held at this point.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 */
2248
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
    95
static void
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
    96
common_panic(const char *head, const char *why)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	char msg[400];	/* no panic() message in the library is this long */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	ulwp_t *self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	size_t len1, len2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	if ((self = __curthread()) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		enter_critical(self);
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   104
	(void) _lwp_mutex_lock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   106
	(void) memset(msg, 0, sizeof (msg));
2248
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   107
	(void) strcpy(msg, head);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	len1 = strlen(msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	len2 = strlen(why);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	if (len1 + len2 >= sizeof (msg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		len2 = sizeof (msg) - len1 - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	(void) strncat(msg, why, len2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	len1 = strlen(msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	if (msg[len1 - 1] != '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		msg[len1++] = '\n';
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 4574
diff changeset
   116
	(void) __write(2, msg, len1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	Abort(msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
2248
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   120
void
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   121
thr_panic(const char *why)
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   122
{
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   123
	common_panic("*** libc thread failure: ", why);
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   124
}
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   125
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   126
void
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   127
aio_panic(const char *why)
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   128
{
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   129
	common_panic("*** libc aio system failure: ", why);
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   130
}
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   131
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
 * Utility function for converting a long integer to a string, avoiding stdio.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
 * 'base' must be one of 10 or 16
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
ultos(uint64_t n, int base, char *s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	char lbuf[24];		/* 64 bits fits in 16 hex digits, 20 decimal */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	char *cp = lbuf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		*cp++ = "0123456789abcdef"[n%base];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		n /= base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	} while (n);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	if (base == 16) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
		*s++ = '0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		*s++ = 'x';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		*s++ = *--cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	} while (cp > lbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	*s = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 * Report application lock usage error for mutexes and condvars.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 * Not called if _THREAD_ERROR_DETECTION=0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
 * Continue execution if _THREAD_ERROR_DETECTION=1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
 * Dump core if _THREAD_ERROR_DETECTION=2.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
lock_error(const mutex_t *mp, const char *who, void *cv, const char *msg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
{
10629
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   165
	mutex_t mcopy;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	char buf[800];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	uberdata_t *udp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	ulwp_t *self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	lwpid_t lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	pid_t pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
10629
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   172
	/*
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   173
	 * Take a snapshot of the mutex before it changes (we hope!).
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   174
	 * Use memcpy() rather than 'mcopy = *mp' in case mp is unaligned.
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   175
	 */
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   176
	(void) memcpy(&mcopy, mp, sizeof (mcopy));
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   177
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	/* avoid recursion deadlock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	if ((self = __curthread()) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		if (assert_thread == self)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
			_exit(127);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
		enter_critical(self);
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   183
		(void) _lwp_mutex_lock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
		assert_thread = self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		lwpid = self->ul_lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		udp = self->ul_uberdata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
		pid = udp->pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
		self = NULL;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   190
		(void) _lwp_mutex_lock(&assert_lock);
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
   191
		lwpid = _lwp_self();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		udp = &__uberdata;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   193
		pid = getpid();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	(void) strcpy(buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	    "\n*** _THREAD_ERROR_DETECTION: lock usage error detected ***\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	(void) strcat(buf, who);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	(void) strcat(buf, "(");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	if (cv != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
		ultos((uint64_t)(uintptr_t)cv, 16, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		(void) strcat(buf, ", ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	ultos((uint64_t)(uintptr_t)mp, 16, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	(void) strcat(buf, ")");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	if (msg != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		(void) strcat(buf, ": ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		(void) strcat(buf, msg);
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
   209
	} else if (!mutex_held(&mcopy)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		(void) strcat(buf, ": calling thread does not own the lock");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	} else if (mcopy.mutex_rcount) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		(void) strcat(buf, ": mutex rcount = ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
		ultos((uint64_t)mcopy.mutex_rcount, 10, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
		(void) strcat(buf, ": calling thread already owns the lock");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	(void) strcat(buf, "\ncalling thread is ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	ultos((uint64_t)(uintptr_t)self, 16, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	(void) strcat(buf, " thread-id ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	ultos((uint64_t)lwpid, 10, buf + strlen(buf));
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
   221
	if (msg != NULL || mutex_held(&mcopy))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
		/* EMPTY */;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	else if (mcopy.mutex_lockw == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		(void) strcat(buf, "\nthe lock is unowned");
4574
4e479ec6ce6f PSARC 2007/285 robust locks revisited
raf
parents: 4570
diff changeset
   225
	else if (!(mcopy.mutex_type & USYNC_PROCESS)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		(void) strcat(buf, "\nthe lock owner is ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
		ultos((uint64_t)mcopy.mutex_owner, 16, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		(void) strcat(buf, " in process ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		ultos((uint64_t)pid, 10, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
		(void) strcat(buf, "\nthe lock owner is ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
		ultos((uint64_t)mcopy.mutex_owner, 16, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		(void) strcat(buf, " in process ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
		ultos((uint64_t)mcopy.mutex_ownerpid, 10, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	(void) strcat(buf, "\n\n");
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 4574
diff changeset
   237
	(void) __write(2, buf, strlen(buf));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	if (udp->uberflags.uf_thread_error_detection >= 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
		Abort(buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	assert_thread = NULL;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   241
	(void) _lwp_mutex_unlock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	if (self != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
		exit_critical(self);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
 * Report application lock usage error for rwlocks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
 * Not called if _THREAD_ERROR_DETECTION=0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
 * Continue execution if _THREAD_ERROR_DETECTION=1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
 * Dump core if _THREAD_ERROR_DETECTION=2.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
rwlock_error(const rwlock_t *rp, const char *who, const char *msg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
{
10629
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   255
	rwlock_t rcopy;
4570
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   256
	uint32_t rwstate;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	char buf[800];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	uberdata_t *udp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	ulwp_t *self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	lwpid_t lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	pid_t pid;
4570
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   262
	int process;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
10629
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   264
	/*
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   265
	 * Take a snapshot of the rwlock before it changes (we hope!).
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   266
	 * Use memcpy() rather than 'rcopy = *rp' in case rp is unaligned.
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   267
	 */
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   268
	(void) memcpy(&rcopy, rp, sizeof (rcopy));
12b43beac546 6883880 non-8-byte-aligned mutexes: update needed for solaris_nevada
Roger A. Faulkner <Roger.Faulkner@Sun.COM>
parents: 6812
diff changeset
   269
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	/* avoid recursion deadlock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	if ((self = __curthread()) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		if (assert_thread == self)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
			_exit(127);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
		enter_critical(self);
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   275
		(void) _lwp_mutex_lock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		assert_thread = self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
		lwpid = self->ul_lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
		udp = self->ul_uberdata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		pid = udp->pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		self = NULL;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   282
		(void) _lwp_mutex_lock(&assert_lock);
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
   283
		lwpid = _lwp_self();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		udp = &__uberdata;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   285
		pid = getpid();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
4570
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   288
	rwstate = (uint32_t)rcopy.rwlock_readers;
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   289
	process = (rcopy.rwlock_type & USYNC_PROCESS);
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   290
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	(void) strcpy(buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	    "\n*** _THREAD_ERROR_DETECTION: lock usage error detected ***\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
	(void) strcat(buf, who);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	(void) strcat(buf, "(");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	ultos((uint64_t)(uintptr_t)rp, 16, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	(void) strcat(buf, "): ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	(void) strcat(buf, msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	(void) strcat(buf, "\ncalling thread is ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	ultos((uint64_t)(uintptr_t)self, 16, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	(void) strcat(buf, " thread-id ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	ultos((uint64_t)lwpid, 10, buf + strlen(buf));
4570
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   302
	if (process) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
		(void) strcat(buf, " in process ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		ultos((uint64_t)pid, 10, buf + strlen(buf));
4570
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   305
	}
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   306
	if (rwstate & URW_WRITE_LOCKED) {
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   307
		(void) strcat(buf, "\nthe writer lock owner is ");
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   308
		ultos((uint64_t)rcopy.rwlock_owner, 16,
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   309
		    buf + strlen(buf));
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   310
		if (process) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
			(void) strcat(buf, " in process ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
			ultos((uint64_t)rcopy.rwlock_ownerpid, 10,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
			    buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		}
4570
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   315
	} else if (rwstate & URW_READERS_MASK) {
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   316
		(void) strcat(buf, "\nthe reader lock is held by ");
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   317
		ultos((uint64_t)(rwstate & URW_READERS_MASK), 10,
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   318
		    buf + strlen(buf));
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   319
		(void) strcat(buf, " readers");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
		(void) strcat(buf, "\nthe lock is unowned");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	}
4570
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   323
	if (rwstate & URW_HAS_WAITERS)
f93b74ddbdd5 6559990 user-level read/write locks should be much faster
raf
parents: 2248
diff changeset
   324
		(void) strcat(buf, "\nand the lock appears to have waiters");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	(void) strcat(buf, "\n\n");
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 4574
diff changeset
   326
	(void) __write(2, buf, strlen(buf));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	if (udp->uberflags.uf_thread_error_detection >= 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		Abort(buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
	assert_thread = NULL;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   330
	(void) _lwp_mutex_unlock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	if (self != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		exit_critical(self);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
 * Report a thread usage error.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
 * Not called if _THREAD_ERROR_DETECTION=0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
 * Writes message and continues execution if _THREAD_ERROR_DETECTION=1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
 * Writes message and dumps core if _THREAD_ERROR_DETECTION=2.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
thread_error(const char *msg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	char buf[800];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	uberdata_t *udp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	ulwp_t *self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	lwpid_t lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	/* avoid recursion deadlock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	if ((self = __curthread()) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
		if (assert_thread == self)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
			_exit(127);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
		enter_critical(self);
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   354
		(void) _lwp_mutex_lock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
		assert_thread = self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
		lwpid = self->ul_lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
		udp = self->ul_uberdata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
		self = NULL;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   360
		(void) _lwp_mutex_lock(&assert_lock);
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
   361
		lwpid = _lwp_self();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
		udp = &__uberdata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	(void) strcpy(buf, "\n*** _THREAD_ERROR_DETECTION: "
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 4574
diff changeset
   366
	    "thread usage error detected ***\n*** ");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	(void) strcat(buf, msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	(void) strcat(buf, "\n*** calling thread is ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	ultos((uint64_t)(uintptr_t)self, 16, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	(void) strcat(buf, " thread-id ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	ultos((uint64_t)lwpid, 10, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	(void) strcat(buf, "\n\n");
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 4574
diff changeset
   374
	(void) __write(2, buf, strlen(buf));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	if (udp->uberflags.uf_thread_error_detection >= 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		Abort(buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	assert_thread = NULL;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   378
	(void) _lwp_mutex_unlock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	if (self != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
		exit_critical(self);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
 * We use __assfail() because the libc __assert() calls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
 * gettext() which calls malloc() which grabs a mutex.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
 * We do everything without calling standard i/o.
2248
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   387
 * assfail() and _assfail() are exported functions;
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   388
 * __assfail() is private to libc.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
#pragma weak _assfail = __assfail
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
__assfail(const char *assertion, const char *filename, int line_num)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	char buf[800];	/* no assert() message in the library is this long */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	ulwp_t *self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	lwpid_t lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	/* avoid recursion deadlock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	if ((self = __curthread()) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		if (assert_thread == self)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
			_exit(127);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		enter_critical(self);
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   403
		(void) _lwp_mutex_lock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		assert_thread = self;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		lwpid = self->ul_lwpid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
		self = NULL;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   408
		(void) _lwp_mutex_lock(&assert_lock);
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
   409
		lwpid = _lwp_self();
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	(void) strcpy(buf, "assertion failed for thread ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	ultos((uint64_t)(uintptr_t)self, 16, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	(void) strcat(buf, ", thread-id ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	ultos((uint64_t)lwpid, 10, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	(void) strcat(buf, ": ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	(void) strcat(buf, assertion);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	(void) strcat(buf, ", file ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	(void) strcat(buf, filename);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	(void) strcat(buf, ", line ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	ultos((uint64_t)line_num, 10, buf + strlen(buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	(void) strcat(buf, "\n");
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 4574
diff changeset
   423
	(void) __write(2, buf, strlen(buf));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	 * We could replace the call to Abort() with the following code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	 * if we want just to issue a warning message and not die.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	 *	assert_thread = NULL;
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   428
	 *	_lwp_mutex_unlock(&assert_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	 *	if (self != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	 *		exit_critical(self);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	Abort(buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
}
2248
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   434
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   435
/*
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   436
 * We define and export this version of assfail() just because libaio
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   437
 * used to define and export it, needlessly.  Now that libaio is folded
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   438
 * into libc, we need to continue this for ABI/version reasons.
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   439
 * We don't use "#pragma weak assfail __assfail" in order to avoid
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   440
 * warnings from the check_fnames utility at build time for libraries
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   441
 * that define their own version of assfail().
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   442
 */
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   443
void
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   444
assfail(const char *assertion, const char *filename, int line_num)
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   445
{
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   446
	__assfail(assertion, filename, line_num);
4609e8bb25ad 6416832 libaio and librt can and should be folded into libc
raf
parents: 0
diff changeset
   447
}
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   448
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   449
void
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   450
assfail3(const char *assertion, uintmax_t lv, const char *op, uintmax_t rv,
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   451
    const char *filename, int line_num)
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   452
{
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   453
	char buf[1000];
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   454
	(void) strcpy(buf, assertion);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   455
	(void) strcat(buf, " (0x");
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   456
	ultos((uint64_t)lv, 16, buf + strlen(buf));
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   457
	(void) strcat(buf, " ");
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   458
	(void) strcat(buf, op);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   459
	(void) strcat(buf, " 0x");
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   460
	ultos((uint64_t)rv, 16, buf + strlen(buf));
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   461
	(void) strcat(buf, ")");
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   462
	__assfail(buf, filename, line_num);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 11913
diff changeset
   463
}