*** empty log message ***
Thu Sep 5 13:18:25 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu> * sysdeps/mach/hurd/i386/init-first.c (__libc_argc, __libc_argv): New variables. (init1): Initialize them. * hurd/hurdinit.c (_hurd_setproc): Now that happens to be available, pass __libc_argv in call to __proc_set_arg_locations. * gmon/gmon.c (write_hist): Call __profile_frequency instead of hertz. (hertz): Delete function. * gmon/Makefile (routines): Add `prof-freq'. * sysdeps/generic/prof-freq.c: New file. * sysdeps/mach/hurd/prof-freq.c: New (stubby) file. * sysdeps/mach/hurd/profil.c (profile_tick): New variable. (update_waiter): Store frequency in profile_tick. (__profile_frequency): New function. * sysdeps/mach/hurd/sendto.c (sendto): Use prototype definition syntax. * Rules (generated): Restore reference to $(generated). * mach/Machrules (mig.uh, mig.__h): Don't include $(user-MIGFLAGS) here. * malloc/free.c (free): __lib_malloc_lock -> __libc_malloc_lock. * malloc/free.c: Provide extern decl of __libc_malloc_lock. * malloc/realloc.c: Likewise. * malloc/malloc-find.c: Likewise. * malloc/malloc-size.c: Likewise. * malloc/malloc-walk.c: Likewise. * malloc/memalign.c: Likewise. * mach/Machrules (mig.uh, mig.__h): Include $(user-MIGFLAGS) and
This commit is contained in:
parent
57ba7bb471
commit
acf51e0261
37
ChangeLog
37
ChangeLog
|
@ -1,3 +1,38 @@
|
|||
Thu Sep 5 13:18:25 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
|
||||
|
||||
* sysdeps/mach/hurd/i386/init-first.c (__libc_argc, __libc_argv):
|
||||
New variables.
|
||||
(init1): Initialize them.
|
||||
* hurd/hurdinit.c (_hurd_setproc): Now that happens to be
|
||||
available, pass __libc_argv in call to __proc_set_arg_locations.
|
||||
|
||||
* gmon/gmon.c (write_hist): Call __profile_frequency instead of
|
||||
hertz.
|
||||
(hertz): Delete function.
|
||||
* gmon/Makefile (routines): Add `prof-freq'.
|
||||
* sysdeps/generic/prof-freq.c: New file.
|
||||
* sysdeps/mach/hurd/prof-freq.c: New (stubby) file.
|
||||
* sysdeps/mach/hurd/profil.c (profile_tick): New variable.
|
||||
(update_waiter): Store frequency in profile_tick.
|
||||
(__profile_frequency): New function.
|
||||
|
||||
* sysdeps/mach/hurd/sendto.c (sendto): Use prototype definition
|
||||
syntax.
|
||||
|
||||
* Rules (generated): Restore reference to $(generated).
|
||||
|
||||
* mach/Machrules (mig.uh, mig.__h): Don't include $(user-MIGFLAGS)
|
||||
here.
|
||||
|
||||
* malloc/free.c (free): __lib_malloc_lock -> __libc_malloc_lock.
|
||||
|
||||
* malloc/free.c: Provide extern decl of __libc_malloc_lock.
|
||||
* malloc/realloc.c: Likewise.
|
||||
* malloc/malloc-find.c: Likewise.
|
||||
* malloc/malloc-size.c: Likewise.
|
||||
* malloc/malloc-walk.c: Likewise.
|
||||
* malloc/memalign.c: Likewise.
|
||||
|
||||
Thu Sep 5 03:20:42 1996 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
Change configuration and Makefiles to allow add-ons to have a
|
||||
|
@ -276,7 +311,7 @@ Thu Aug 29 12:00:30 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
|
|||
spelling error of _hurd_itimerval.
|
||||
|
||||
* mach/Makefile (MIGFLAGS-mach/mach4): Define variable.
|
||||
mach/Machrules (mig.uh, mig.__h): Include $(user-MIGFLAGS) and
|
||||
* mach/Machrules (mig.uh, mig.__h): Include $(user-MIGFLAGS) and
|
||||
$(MIGFLAGS-$*) here too, as well as in the code-generating MiG calls.
|
||||
|
||||
* hurd/hurdinline.c: Include "hurd.h" for function definitions too.
|
||||
|
|
3
Rules
3
Rules
|
@ -136,7 +136,8 @@ subdir_dist: dist
|
|||
|
||||
# Convenient target to update all the generated source files.
|
||||
.PHONY: generated
|
||||
generated: $(addprefix $(common-objpfx),$(common-generated))
|
||||
generated: $(addprefix $(common-objpfx),$(common-generated)) \
|
||||
$(addprefix $(objpfx),$(generated))
|
||||
|
||||
ifndef libc.so-version
|
||||
# Undefine this because it can't work when we libc.so is unversioned.
|
||||
|
|
|
@ -23,7 +23,7 @@ subdir := gmon
|
|||
|
||||
headers := sys/gmon.h sys/gmon_out.h
|
||||
distribute := machine-gmon.h profil-counter.h
|
||||
routines := gmon mcount profil bb_init_func bb_exit_func
|
||||
routines := gmon mcount profil bb_init_func bb_exit_func prof-freq
|
||||
|
||||
include ../Rules
|
||||
|
||||
|
|
23
gmon/gmon.c
23
gmon/gmon.c
|
@ -57,27 +57,6 @@ static int s_scale;
|
|||
|
||||
#define ERR(s) write(2, s, sizeof(s) - 1)
|
||||
|
||||
/*
|
||||
* Discover the tick frequency of the machine if something goes wrong,
|
||||
* we return 0, an impossible hertz.
|
||||
*/
|
||||
static int
|
||||
DEFUN_VOID(hertz)
|
||||
{
|
||||
struct itimerval tim;
|
||||
|
||||
tim.it_interval.tv_sec = 0;
|
||||
tim.it_interval.tv_usec = 1;
|
||||
tim.it_value.tv_sec = 0;
|
||||
tim.it_value.tv_usec = 0;
|
||||
setitimer(ITIMER_REAL, &tim, 0);
|
||||
setitimer(ITIMER_REAL, 0, &tim);
|
||||
if (tim.it_interval.tv_usec < 2)
|
||||
return 0;
|
||||
return (1000000 / tim.it_interval.tv_usec);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Control profiling
|
||||
* profiling is what mcount checks to see if
|
||||
|
@ -183,7 +162,7 @@ DEFUN(write_hist, (fd), int fd)
|
|||
if (_gmonparam.kcountsize > 0)
|
||||
{
|
||||
size = _gmonparam.kcountsize / sizeof(HISTCOUNTER);
|
||||
rate = hertz();
|
||||
rate = __profile_frequency();
|
||||
bcopy(&_gmonparam.lowpc, &thdr.low_pc, sizeof(thdr.low_pc));
|
||||
bcopy(&_gmonparam.highpc, &thdr.high_pc, sizeof(thdr.high_pc));
|
||||
bcopy(&size, &thdr.hist_size, sizeof(thdr.hist_size));
|
||||
|
|
|
@ -165,6 +165,7 @@ _hurd_setproc (process_t procserver)
|
|||
{
|
||||
error_t err;
|
||||
mach_port_t oldmsg;
|
||||
extern char **__libc_argv;
|
||||
|
||||
/* Give the proc server our message port. */
|
||||
if (err = __proc_setmsgport (procserver, _hurd_msgport, &oldmsg))
|
||||
|
@ -175,8 +176,8 @@ _hurd_setproc (process_t procserver)
|
|||
|
||||
/* Tell the proc server where our args and environment are. */
|
||||
if (err = __proc_set_arg_locations (procserver,
|
||||
/* We don't know the ARGV location. */
|
||||
(vm_address_t) 0,
|
||||
_hide_arguments ? 0 :
|
||||
(vm_address_t) __libc_argv,
|
||||
_hide_environment ? 0 :
|
||||
(vm_address_t) __environ))
|
||||
return err;
|
||||
|
|
|
@ -149,14 +149,14 @@ $(objpfx)%.uh:; $(mig.uh)
|
|||
define mig.uh
|
||||
$(make-target-directory)
|
||||
$(include-%.defs) | \
|
||||
$(MIG) - /dev/null $(MIGFLAGS) $(user-MIGFLAGS) $(MIGFLAGS-$*) \
|
||||
$(MIG) - /dev/null $(MIGFLAGS) $(MIGFLAGS-$*) \
|
||||
-header $@ -server /dev/null -user /dev/null
|
||||
endef
|
||||
$(objpfx)%.__h:; $(mig.__h)
|
||||
define mig.__h
|
||||
$(make-target-directory)
|
||||
$(include-%.defs) | \
|
||||
$(MIG) - /dev/null $(MIGFLAGS) $(user-MIGFLAGS) $(MIGFLAGS-$*) -prefix __ \
|
||||
$(MIG) - /dev/null $(MIGFLAGS) $(MIGFLAGS-$*) -prefix __ \
|
||||
-header $@ -server /dev/null -user /dev/null
|
||||
endef
|
||||
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
/* Return frequency of ticks reported by profil. Generic version. */
|
||||
/*-
|
||||
* Copyright (c) 1983, 1992, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
int
|
||||
__profile_frequency ()
|
||||
{
|
||||
/*
|
||||
* Discover the tick frequency of the machine if something goes wrong,
|
||||
* we return 0, an impossible hertz.
|
||||
*/
|
||||
struct itimerval tim;
|
||||
|
||||
tim.it_interval.tv_sec = 0;
|
||||
tim.it_interval.tv_usec = 1;
|
||||
tim.it_value.tv_sec = 0;
|
||||
tim.it_value.tv_usec = 0;
|
||||
setitimer(ITIMER_REAL, &tim, 0);
|
||||
setitimer(ITIMER_REAL, 0, &tim);
|
||||
if (tim.it_interval.tv_usec < 2)
|
||||
return 0;
|
||||
return (1000000 / tim.it_interval.tv_usec);
|
||||
}
|
||||
|
||||
|
|
@ -31,15 +31,16 @@ extern void __libc_global_ctors (void);
|
|||
|
||||
int __libc_multiple_libcs = 1;
|
||||
|
||||
int __libc_argc;
|
||||
char **__libc_argv;
|
||||
|
||||
void *(*_cthread_init_routine) (void); /* Returns new SP to use. */
|
||||
void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
|
||||
|
||||
|
||||
/* Things that want to be run before _hurd_init or much anything else.
|
||||
Importantly, these are called before anything tries to use malloc. */
|
||||
DEFINE_HOOK (_hurd_preinit_hook, (void));
|
||||
|
||||
|
||||
static void
|
||||
init1 (int argc, char *arg0, ...)
|
||||
{
|
||||
|
@ -47,6 +48,8 @@ init1 (int argc, char *arg0, ...)
|
|||
char **envp = &argv[argc + 1];
|
||||
struct hurd_startup_data *d;
|
||||
|
||||
__libc_argc = argc;
|
||||
__libc_argv = argv;
|
||||
__environ = envp;
|
||||
while (*envp)
|
||||
++envp;
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
/* __profile_frequency is in sysdeps/mach/hurd/profil.c. This file
|
||||
is here as a place-holder to prevent the use of sysdeps/generic/prof-freq.c. */
|
|
@ -36,6 +36,7 @@ static size_t sample_scale;
|
|||
static sampled_pc_seqno_t seqno;
|
||||
static struct mutex lock = MUTEX_INITIALIZER;
|
||||
static mach_msg_timeout_t collector_timeout; /* ms between collections. */
|
||||
static int profile_tick;
|
||||
|
||||
/* Enable statistical profiling, writing samples of the PC into at most
|
||||
SIZE bytes of SAMPLE_BUFFER; every processor clock tick while profiling
|
||||
|
@ -62,8 +63,7 @@ update_waiter (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
|
|||
|
||||
if (! err)
|
||||
{
|
||||
int tick; /* Microseconds per sample. */
|
||||
err = __task_enable_pc_sampling (__mach_task_self (), &tick,
|
||||
err = __task_enable_pc_sampling (__mach_task_self (), &profile_tick,
|
||||
SAMPLED_PC_PERIODIC);
|
||||
if (!err && sample_scale == 0)
|
||||
/* Profiling was not turned on, so the collector thread was
|
||||
|
@ -79,13 +79,19 @@ update_waiter (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
|
|||
and the kernel buffer size we get the length of time it takes
|
||||
to fill the buffer; translate that to milliseconds for
|
||||
mach_msg, and chop it in half for general lag factor. */
|
||||
collector_timeout = MAX_PC_SAMPLES * tick / 1000 / 2;
|
||||
collector_timeout = MAX_PC_SAMPLES * profile_tick / 1000 / 2;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
__profile_frequency ()
|
||||
{
|
||||
return profile_tick;
|
||||
}
|
||||
|
||||
int
|
||||
profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
|
||||
{
|
||||
|
|
|
@ -27,13 +27,12 @@ Cambridge, MA 02139, USA. */
|
|||
/* Send N bytes of BUF on socket FD to peer at address ADDR (which is
|
||||
ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */
|
||||
int
|
||||
sendto (fd, buf, n, flags, addr, addr_len)
|
||||
int fd;
|
||||
const void *buf;
|
||||
size_t n;
|
||||
int flags;
|
||||
const struct sockaddr_un *addr;
|
||||
size_t addr_len;
|
||||
sendto (int fd,
|
||||
const void *buf,
|
||||
size_t n,
|
||||
int flags,
|
||||
const struct sockaddr_un *addr,
|
||||
size_t addr_len)
|
||||
{
|
||||
addr_port_t aport;
|
||||
error_t err;
|
||||
|
|
Loading…
Reference in New Issue