/* * 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 (c) 1994, by Sun Microsytems, Inc. */ #pragma ident "%Z%%M% %I% %E% SMI" /* * Includes */ #include #include #include #include "queue.h" #include "set.h" #include "fcn.h" #include "new.h" #include "source.h" /* * Globals */ static queue_node_t g_fcnlist = { &g_fcnlist, &g_fcnlist}; /* * Forward Declarations */ static void fcn_destroy(fcn_t * fcn_p); static void fcn_print(FILE * stream, fcn_t * fcn_p); /* * fcn() - builds a function block and inserts it on the global list. */ #define NSYMS 1 void fcn(char *name_p, char *entry_name_p) { fcn_t *new_p; fcn_t *old_p; /* does this setname exist already? */ old_p = fcn_find(name_p); if (old_p) fcn_destroy(old_p); /* create a new set */ new_p = new(fcn_t); queue_init(&new_p->qn); new_p->name_p = name_p; new_p->entry_name_p = entry_name_p; #ifdef OLD /* * allocate a target function block, and stuff the init and fini * addrs */ prbstat = prb_targmem_alloc(g_procfd, sizeof (probe_funcs_t), &new_p->funcs_p); if (prbstat) { semantic_err(gettext("problem allocating target memory")); goto Error; } prbstat = prb_proc_write(g_procfd, new_p->funcs_p, &new_p->funcs, sizeof (probe_funcs_t)); if (prbstat) { semantic_err(gettext( "setup problem, initial/final " "funcs in target memory")); goto Error; } #endif /* append the new set to the global list */ (void) queue_append(&g_fcnlist, &new_p->qn); return; Error: if (new_p) free(new_p); return; } /* end fcn */ /* * fcn_destroy() - destroys a fcn and related resources */ static void fcn_destroy(fcn_t * fcn_p) { if (!fcn_p) return; /* remove ourselves from any list */ if (!queue_isempty(&fcn_p->qn)) (void) queue_remove(&fcn_p->qn); if (fcn_p->name_p) free(fcn_p->name_p); if (fcn_p->entry_name_p) free(fcn_p->entry_name_p); free(fcn_p); } /* end fcn_destroy */ /* * fcn_list() - pretty prints the global fcnlist */ void fcn_list(void) { fcn_t *fcn_p; fcn_p = (fcn_t *) & g_fcnlist; while ((fcn_p = (fcn_t *) queue_next(&g_fcnlist, &fcn_p->qn))) { fcn_print(stdout, fcn_p); } } /* end fcn_list */ /* * fcn_print() - pretty prints a fcn */ static void fcn_print(FILE * stream, fcn_t * fcn_p) { if (!fcn_p) return; (void) fprintf(stream, "&%-8s %-24s\n", fcn_p->name_p, fcn_p->entry_name_p); } /* end fcn_print */ /* * fcn_findname() - find the created name, given an entry name */ char * fcn_findname(const char * const entry_p) { fcn_t *fcn_p; if (!entry_p) return (NULL); fcn_p = (fcn_t *) & g_fcnlist; while ((fcn_p = (fcn_t *) queue_next(&g_fcnlist, &fcn_p->qn))) if (strcmp(entry_p, fcn_p->entry_name_p) == 0) return (fcn_p->name_p); return (NULL); } /* end fcn_findname */ /* * fcn_find() - finds a fcn by name */ fcn_t * fcn_find(char *fcnname_p) { fcn_t *fcn_p; if (!fcnname_p) return (NULL); fcn_p = (fcn_t *) & g_fcnlist; while ((fcn_p = (fcn_t *) queue_next(&g_fcnlist, &fcn_p->qn))) if (strcmp(fcnname_p, fcn_p->name_p) == 0) return (fcn_p); return (NULL); } /* end set_find */