usr/src/lib/libc/port/gen/mon.c
author raf
Mon, 10 Apr 2006 12:27:38 -0700
changeset 1778 6357a59054f7
parent 0 68f95e015346
child 6812 febeba71273d
permissions -rw-r--r--
6404383 select() behaviour changed in Solaris 10, breaking binary compatibility
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
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
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 * University Copyright- Copyright (c) 1982, 1986, 1988
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * The Regents of the University of California
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * All Rights Reserved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * University Acknowledgment- Portions of this document are derived from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 * software developed by the University of California, Berkeley, and its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * contributors.
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
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 *	Environment variable PROFDIR added such that:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 *		If PROFDIR doesn't exist, "mon.out" is produced as before.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
 *		If PROFDIR = NULL, no profiling output is produced.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
 *		If PROFDIR = string, "string/pid.progname" is produced,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
 *		  where name consists of argv[0] suitably massaged.
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
 *	Routines:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 *		(global) _monitor	init, cleanup for prof(1)iling
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 *		(global) _mcount	function call counter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 *		(global) _mcount_newent	call count entry manager
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 *		(static) _mnewblock	call count block allocator
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 *	Monitor(), coordinating with mcount(), mcount_newent() and mnewblock(),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 *	maintains a series of one or more blocks of prof-profiling
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 *	information.  These blocks are added in response to calls to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 *	monitor() (explicitly or via mcrt[01]'s _start) and, via mcount()'s
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 *	calls to mcount_newent() thence to mnewblock().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 *	The blocks are tracked via a linked list of block anchors,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 *	which each point to a block.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 *	An anchor points forward, backward and 'down' (to a block).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 *	A block has the profiling information, and consists of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 *	three regions: a header, a function call count array region,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 *	and an optional execution histogram region, as illustrated below.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 *		 "anchor"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 *		+========+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 *	prior<--|        |-->next anchor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 *	anchor	|        |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 *		+========+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
 *		 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
 *		 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
 *		 V "block"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
 *		+-----------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
 *		+  header   +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
 *		+-----------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 *		+           +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 *		+ fcn call  +	// data collected by mcount
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 *		+  counts   +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
 *		+  array    +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 *		+           +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 *		+-----------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 *		+           +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 *		+ execution +	// data collected by system call,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 *		+ profile   +	// profil(2) (assumed ALWAYS specified
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 *		+ histogram +	// by monitor()-caller, even if small;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 *		+           +	// never specified by mnewblock()).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 *		+-----------+
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
 *	The first time monitor() is called, it sets up the chain
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
 *	by allocating an anchor and initializing countbase and countlimit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
 *	to zero.  Everyone assumes that they start out zeroed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
 *	When a user (or _start from mcrt[01]) calls monitor(), they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
 *	register a buffer which contains the third region (either with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
 *	a meaningful size, or so short that profil-ing is being shut off).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
 *	For each fcn, the first time it calls mcount(), mcount calls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
 *	mcount_newent(), which parcels out the fcn call count entries
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
 *	from the current block, until they are exausted; then it calls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
 *	mnewblock().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
 *	Mnewbloc() allocates a block Without a third region, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
 *	links in a new associated anchor, adding a new anchor&block pair
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
 *	to the linked list.  Each new mnewblock() block or user block,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
 *	is added to the list as it comes in, FIFO.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
 *	When monitor() is called to close up shop, it writes out
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
 *	a summarizing header, ALL the fcn call counts from ALL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
 *	the blocks, and the Last specified execution histogram
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
 *	(currently there is no neat way to accumulate that info).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
 *	This preserves all call count information, even when
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
 *	new blocks are specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
 *	NOTE - no block passed to monitor() may be freed, until
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
 *	it is called to clean up!!!!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
#pragma weak monitor = _monitor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
#include "mtlib.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
#include "libc.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
#include <mon.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
#include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
#include <thread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
#define	PROFDIR	"PROFDIR"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
static mutex_t mon_lock = DEFAULTMUTEX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
char **___Argv = NULL; /* initialized to argv array by mcrt0 (if loaded) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
 * countbase and countlimit are used to parcel out
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
 * the pc,count cells from the current block one at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
 * a time to each profiled function, the first time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
 * that function is called.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
 * When countbase reaches countlimit, mcount() calls
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
 * mnewblock() to link in a new block.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
 * Only monitor/mcount/mcount_newent/mnewblock() should change these!!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 * Correct that: only these routines are ABLE to change these;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 * countbase/countlimit are now STATIC!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
static char *countbase;		/* addr of next pc,count cell to use in block */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
static char *_countlimit;	/* addr lim for cells (addr after last cell) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
typedef struct anchor	ANCHOR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
struct anchor {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	ANCHOR  *next, *prior;	/* forward, backward ptrs for list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	struct hdr  *monBuffer;	/* 'down' ptr, to block */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	short  flags;		/* indicators - has histogram designation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	int  histSize;		/* if has region3, this is size. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
#define	HAS_HISTOGRAM	0x0001		/* this buffer has a histogram */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
static ANCHOR 	*curAnchor = NULL;	/* addr of anchor for current block */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
static ANCHOR    firstAnchor;		/* the first anchor to use */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
					/* - hopefully the Only one needed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
					/* a speedup for most cases. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
static char *mon_out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
static int writeBlocks(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
static void _mnewblock(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
struct cnt *_mcount_newent(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
 * int (*alowpc)(), (*ahighpc)(); boundaries of text to be monitored
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
 * WORD *buffer;	ptr to space for monitor data(WORDs)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
 * size_t bufsize;	size of above space(in WORDs)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 * size_t nfunc;	max no. of functions whose calls are counted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 *			(default nfunc is 300 on PDP11, 600 on others)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
monitor(int (*alowpc)(void), int (*ahighpc)(void), WORD *buffer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	size_t bufsize, size_t nfunc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	uint_t scale;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	long text;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	char *s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	struct hdr *hdrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	ANCHOR  *newanchp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	size_t	ssiz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	char	*lowpc = (char *)alowpc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	char	*highpc = (char *)ahighpc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	lmutex_lock(&mon_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	if (lowpc == NULL) {		/* true only at the end */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
		error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		if (curAnchor != NULL) { /* if anything was collected!.. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
			profil(NULL, 0, 0, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
			if (writeBlocks() == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
				error = errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
		lmutex_unlock(&mon_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
			errno = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
			perror(mon_out);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	 * Ok - they want to submit a block for immediate use, for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	 *	function call count consumption, and execution profile
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	 *	histogram computation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	 * If the block fails sanity tests, just bag it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	 * Next thing - get name to use. If PROFDIR is NULL, let's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	 *	get out now - they want No Profiling done.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	 * Otherwise:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	 * Set the block hdr cells.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	 * Get an anchor for the block, and link the anchor+block onto
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	 *	the end of the chain.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
	 * Init the grabba-cell externs (countbase/limit) for this block.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	 * Finally, call profil and return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
	ssiz = ((sizeof (struct hdr) + nfunc * sizeof (struct cnt)) /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	    sizeof (WORD));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
	if (ssiz >= bufsize || lowpc >= highpc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
		lmutex_unlock(&mon_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
		return;
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
	if ((s = getenv(PROFDIR)) == NULL) { /* PROFDIR not in environment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
		mon_out = MON_OUT; /* use default "mon.out" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
	} else if (*s == '\0') { /* value of PROFDIR is NULL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		lmutex_unlock(&mon_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		return; /* no profiling on this run */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
	} else { /* construct "PROFDIR/pid.progname" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		int n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		pid_t pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		char *name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		size_t len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
		len = strlen(s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
		/* 15 is space for /pid.mon.out\0, if necessary */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
		if ((mon_out = libc_malloc(len + strlen(___Argv[0]) + 15))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		    == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
			lmutex_unlock(&mon_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
			perror("");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		(void) strcpy(mon_out, s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		name = mon_out + len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
		*name++ = '/'; /* two slashes won't hurt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		if ((pid = getpid()) <= 0) /* extra test just in case */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
			pid = 1; /* getpid returns something inappropriate */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		/* suppress leading zeros */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		for (n = 10000; n > pid; n /= 10)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
			;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
		for (; ; n /= 10) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
			*name++ = pid/n + '0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
			if (n == 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
			    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
			pid %= n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		*name++ = '.';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		if (___Argv != NULL) {	/* mcrt0.s executed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
			if ((s = strrchr(___Argv[0], '/')) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
				(void) strcpy(name, s + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
				(void) strcpy(name, ___Argv[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
			(void) strcpy(name, MON_OUT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	hdrp = (struct hdr *)(uintptr_t)buffer;	/* initialize 1st region */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	hdrp->lpc = lowpc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	hdrp->hpc = highpc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	hdrp->nfns = nfunc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	/* get an anchor for the block */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	newanchp = (curAnchor == NULL) ? &firstAnchor :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	    (ANCHOR *)libc_malloc(sizeof (ANCHOR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	if (newanchp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		lmutex_unlock(&mon_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		perror("monitor");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	/* link anchor+block into chain */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	newanchp->monBuffer = hdrp;		/* new, down. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	newanchp->next  = NULL;			/* new, forward to NULL. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	newanchp->prior = curAnchor;		/* new, backward. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	if (curAnchor != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		curAnchor->next = newanchp;	/* old, forward to new. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	newanchp->flags = HAS_HISTOGRAM;	/* note it has a histgm area */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	/* got it - enable use by mcount() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	countbase  = (char *)buffer + sizeof (struct hdr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	_countlimit = countbase + (nfunc * sizeof (struct cnt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	/* (set size of region 3) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
	newanchp->histSize = (int)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	    (bufsize * sizeof (WORD) - (_countlimit - (char *)buffer));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	/* done w/regions 1 + 2: setup 3  to activate profil processing. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	buffer += ssiz;			/* move ptr past 2'nd region */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	bufsize -= ssiz;		/* no. WORDs in third region */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
					/* no. WORDs of text */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	text = (highpc - lowpc + sizeof (WORD) - 1) / sizeof (WORD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	 * scale is a 16 bit fixed point fraction with the decimal
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	 * point at the left
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	if (bufsize < text) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
		/* make sure cast is done first! */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
		double temp = (double)bufsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		scale = (uint_t)((temp * (long)0200000L) / text);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
		/* scale must be less than 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		scale = 0xffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	bufsize *= sizeof (WORD);	/* bufsize into # bytes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	profil(buffer, bufsize, (ulong_t)lowpc, scale);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	curAnchor = newanchp;	/* make latest addition, the cur anchor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	lmutex_unlock(&mon_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
 * writeBlocks() - write accumulated profiling info, std fmt.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
 * This routine collects the function call counts, and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
 * last specified profil buffer, and writes out one combined
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
 * 'pseudo-block', as expected by current and former versions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
 * of prof.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
writeBlocks(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	int ok;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	ANCHOR *ap;		/* temp anchor ptr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	struct hdr sum;		/* summary header (for 'pseudo' block) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	ANCHOR *histp;		/* anchor with histogram to use */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	if ((fd = creat(mon_out, 0666)) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	 * this loop (1) computes # funct cts total
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	 *  (2) finds anchor of last block w / hist(histp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	histp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	for (sum.nfns = 0, ap = &firstAnchor; ap != NULL; ap = ap->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
		sum.nfns += ap->monBuffer->nfns; /* accum num of cells */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
		if (ap->flags & HAS_HISTOGRAM)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
			histp = ap;	 /* remember lastone with a histgm */
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
	/* copy pc range from effective histgm */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	sum.lpc = histp->monBuffer->lpc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	sum.hpc = histp->monBuffer->hpc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	ok = (write(fd, (char *)&sum, sizeof (sum)) == sizeof (sum));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	if (ok) {		/* if the hdr went out ok.. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		size_t amt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
		char *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
		/* write out the count arrays (region 2's) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
		for (ap = &firstAnchor; ok && ap != NULL; ap = ap->next) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
			amt = ap->monBuffer->nfns * sizeof (struct cnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
			p = (char *)ap->monBuffer + sizeof (struct hdr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
			ok = (write(fd, p, amt) == amt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		/* count arrays out; write out histgm area */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
		if (ok) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
			p = (char *)histp->monBuffer + sizeof (struct hdr) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
			    (histp->monBuffer->nfns * sizeof (struct cnt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
			amt = histp->histSize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
			ok = (write(fd, p, amt) == amt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
	(void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	return (ok);	/* indicate success */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
 * mnewblock()-allocate and link in a new region1&2 block.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
 * This routine, called by mcount_newent(), allocates a new block
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
 * containing only regions 1 & 2 (hdr and fcn call count array),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
 * and an associated anchor (see header comments), inits the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
 * header (region 1) of the block, links the anchor into the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
 * list, and resets the countbase/limit pointers.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
 * This routine cannot be called recursively, since (each) mcount
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
 * has a local lock which prevents recursive calls to mcount_newent.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
 * See mcount_newent for more details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
#define	THISMANYFCNS	(MPROGS0*2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
 * call libc_malloc() to get an anchor & a regn1&2 block, together
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
#define	GETTHISMUCH	(sizeof (ANCHOR) + 	/* get an ANCHOR */  \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
			(sizeof (struct hdr) +	/* get Region 1 */   \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
			THISMANYFCNS * sizeof (struct cnt))) /* Region 2 */  \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
						/* but No region 3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
_mnewblock(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	struct hdr *hdrp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	ANCHOR	*newanchp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
	ANCHOR	*p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
					/* get anchor And block, together */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	p = libc_malloc(GETTHISMUCH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	if (p == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		perror("mcount(mnewblock)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	newanchp = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	hdrp = (struct hdr *)(p + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
					/* initialize 1st region to dflts */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	hdrp->lpc = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	hdrp->hpc = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	hdrp->nfns = THISMANYFCNS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
					/* link anchor+block into chain */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	newanchp->monBuffer = hdrp;		/* new, down. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	newanchp->next  = NULL;			/* new, forward to NULL. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	newanchp->prior = curAnchor;		/* new, backward. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	if (curAnchor != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
		curAnchor->next = newanchp;	/* old, forward to new. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	newanchp->flags = 0;		/* note that it has NO histgm area */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
					/* got it - enable use by mcount() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	countbase  = (char *)hdrp + sizeof (struct hdr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	_countlimit = countbase + (THISMANYFCNS * sizeof (struct cnt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	newanchp->histSize = 0;	/* (set size of region 3.. to 0) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	curAnchor = newanchp;		/* make latest addition, cur anchor */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
 * mcount_newent() -- call to get a new mcount call count entry.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
 * this function is called by _mcount to get a new call count entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
 * (struct cnt, in the region allocated by _monitor()), or to return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
 * zero if profiling is off.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
 * This function acts as a funnel, an access function to make sure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
 * that all instances of mcount (the one in the a.out, and any in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
 * any shared objects) all get entries from the same array, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
 * all know when profiling is off.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
 * NOTE: when mcount calls this function, it sets a private flag
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
 * so that it does not call again until this function returns,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
 * thus preventing recursion.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
 * At Worst, the mcount in either a shared object or the a.out
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
 * could call once, and then the mcount living in the shared object
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
 * with monitor could call a second time (i.e. libc.so.1, although
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
 * presently it does not have mcount in it).  This worst case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
 * would involve Two active calls to mcount_newent, which it can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
 * handle, since the second one would find a already-set value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
 * in countbase.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
 * The only unfortunate result is that No new call counts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
 * will be handed out until this function returns.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
 * Thus if libc_malloc or other routines called inductively by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
 * this routine have not yet been provided with a call count entry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
 * they will not get one until this function call is completed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
 * Thus a few calls to library routines during the course of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
 * profiling setup, may not be counted.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
 * NOTE: countbase points at the next available entry, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
 * countlimit points past the last valid entry, in the current
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
 * function call counts array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
 * if profiling is off		// countbase==0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
 *   just return 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
 * else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
 *   if need more entries	// because countbase points last valid entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
 *     link in a new block, resetting countbase and countlimit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
 *   endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
 *   if Got more entries
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
 *     return pointer to the next available entry, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
 *     update pointer-to-next-slot before you return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
 *   else			// failed to get more entries
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
 *     just return 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
 *   endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
 * endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
struct cnt *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
_mcount_newent(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	if (countbase == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	if (countbase >= _countlimit)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
		_mnewblock();		/* get a new block; set countbase */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	if (countbase != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		struct cnt *cur_countbase = (struct cnt *)(uintptr_t)countbase;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
		countbase += sizeof (struct cnt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
		return (cur_countbase);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
}