diff options
Diffstat (limited to 'usr/src/lib/libbc/csu/common/mon.c')
| -rw-r--r-- | usr/src/lib/libbc/csu/common/mon.c | 217 |
1 files changed, 0 insertions, 217 deletions
diff --git a/usr/src/lib/libbc/csu/common/mon.c b/usr/src/lib/libbc/csu/common/mon.c deleted file mode 100644 index 2a144f9ad5..0000000000 --- a/usr/src/lib/libbc/csu/common/mon.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 1989 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#pragma ident "%Z%%M% %I% %E% SMI" - -/* - * Environment variable PROFDIR added such that: - * If PROFDIR doesn't exist, "mon.out" is produced as before. - * If PROFDIR = NULL, no profiling output is produced. - * If PROFDIR = string, "string/pid.progname" is produced, - * where name consists of argv[0] suitably massaged. - */ -#include <sys/param.h> -#include <sys/dir.h> -#include "mon.h" -#include <sys/fcntl.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> - -#define PROFDIR "PROFDIR" - -extern void profil(), perror(); - -void monitor(char *, char *, char *, int, int); -void moncontrol(int); - -char **___Argv = NULL; /* initialized to argv array by mcrt0 (if loaded) */ - -struct cnt *countbase; -int numctrs; -int profiling; - -static struct mondata { - char *s_sbuf; - int s_bufsiz; - int s_scale; - int s_lowpc; - char mon_out[MAXPATHLEN]; - char progname[MAXNAMLEN]; -} *mondata, *_mondata(); - -#define MSG "No space for monitor buffer(s)\n" - -static struct mondata * -_mondata(void) -{ - struct mondata *d = mondata; - - if (d == 0) { - if ((d = (struct mondata *) - calloc(1, sizeof(struct mondata))) == NULL) { - return (NULL); - } - mondata = d; - } - return (d); -} - -void -monstartup(char *lowpc, char *highpc) -{ - int monsize; - char *buffer; - int cntsiz; - char *_alloc_profil_buf(); - - cntsiz = (highpc - lowpc) * ARCDENSITY / 100; - if (cntsiz < MINARCS) - cntsiz = MINARCS; - monsize = (highpc - lowpc + HISTFRACTION - 1) / HISTFRACTION - + sizeof(struct phdr) + cntsiz * sizeof(struct cnt); - buffer = _alloc_profil_buf(monsize); - if (buffer == (char *)-1) { - write(2, MSG, sizeof(MSG)); - return; - } - monitor(lowpc, highpc, buffer, monsize, cntsiz); -} - -/* - * Arguments - * lowpc, hightpc: boundaries of text to be monitored - * buf: ptr to space for monitor data (WORDs) - * bufsiz: size of above space (in WORDs) - * cntsiz: max no. of functions whose calls are counted - */ -void -monitor(char *lowpc, char *highpc, char *buf, int bufsiz, int cntsiz) -{ - struct mondata *d = _mondata(); - int o; - struct phdr *php; - static int ssiz; - static char *sbuf; - char *s, *name; - - name = d->mon_out; - - if (lowpc == NULL) { /* true only at the end */ - moncontrol(0); - if (sbuf != NULL) { - int pid, n; - - if (d->progname[0] != '\0') { /* finish constructing - "PROFDIR/pid.progname" */ - /* set name to end of PROFDIR */ - name = strrchr(d->mon_out, '\0'); - if ((pid = getpid()) <= 0) /* extra test just in case */ - pid = 1; /* getpid returns something inappropriate */ - for (n = 10000; n > pid; n /= 10) - ; /* suppress leading zeros */ - for ( ; ; n /= 10) { - *name++ = pid/n + '0'; - if (n == 1) - break; - pid %= n; - } - *name++ = '.'; - (void)strcpy(name, d->progname); - } - - if ((o = creat(d->mon_out, 0666)) < 0 || - write(o, sbuf, (unsigned)ssiz) == -1) - perror(d->mon_out); - if (o >= 0) - close(o); - } - return; - } - countbase = (struct cnt *)(buf + sizeof(struct phdr)); - sbuf = NULL; - o = sizeof(struct phdr) + cntsiz * sizeof(struct cnt); - if (ssiz >= bufsiz || lowpc >= highpc) - return; /* buffer too small or PC range bad */ - if ((s = getenv(PROFDIR)) == NULL) /* PROFDIR not in environment */ - (void)strcpy(name, MON_OUT); /* use default "mon.out" */ - else if (*s == '\0') /* value of PROFDIR is NULL */ - return; /* no profiling on this run */ - else { /* set up mon_out and progname to construct - "PROFDIR/pid.progname" when done profiling */ - - while (*s != '\0') /* copy PROFDIR value (path-prefix) */ - *name++ = *s++; - *name++ = '/'; /* two slashes won't hurt */ - if (___Argv != NULL) /* mcrt0.s executed */ - if ((s = strrchr(___Argv[0], '/')) != NULL) - strcpy(d->progname, s + 1); - else - strcpy(d->progname, ___Argv[0]); - } - sbuf = buf; /* for writing buffer at the wrapup */ - ssiz = bufsiz; - php = (struct phdr *)&buf[0]; - php->lpc = (char *)lowpc; /* initialize the first */ - php->hpc = (char *)highpc; /* region of the buffer */ - php->ncnt = cntsiz; - numctrs = cntsiz; - buf += o; - bufsiz -= o; - if (bufsiz <= 0) - return; - o = (highpc - lowpc); - if(bufsiz < o) - o = ((float) bufsiz / o) * 65536; - else - o = 65536; - d->s_scale = o; - d->s_sbuf = buf; - d->s_bufsiz = bufsiz; - d->s_lowpc = (int) lowpc; - moncontrol(1); -} - -/* - * Control profiling - * profiling is what mcount checks to see if - * all the data structures are ready. - */ -void -moncontrol(int mode) -{ - struct mondata *d = _mondata(); - - if (mode) { - /* start */ - profil(d->s_sbuf, d->s_bufsiz, d->s_lowpc, d->s_scale); - profiling = 0; - } else { - /* stop */ - profil((char *)0, 0, 0, 0); - profiling = 3; - } -} |
