Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: About zmodload test segfaults
- X-seq: zsh-workers 14504
- From: Sven Wischnowsky <wischnow@xxxxxxxxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxx
- Subject: Re: About zmodload test segfaults
- Date: Mon, 28 May 2001 11:21:30 +0200 (MET DST)
- In-reply-to: <1010523165140.ZM9483@xxxxxxxxxxxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
Bart Schaefer wrote:
> ...
>
> Please check whether this takes care of the zmodload test segfaults on
> various architectures.
That patch took care of the chatty loader under Tru64 Unix, of course.
The patch below takes care of the floating point exception I was seeing
when trying to unload the zprof module. It makes the wrapper function
zprof registers be more careful, effectively avoiding most of the code
if the zprof module is currently being unloaded. Which is a good thing
to do anyway.
Now I get a `all tests successful' for V01 here, too.
Bye
Sven
Index: Src/Modules/zprof.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/zprof.c,v
retrieving revision 1.2
diff -u -r1.2 zprof.c
--- Src/Modules/zprof.c 2001/03/20 09:35:48 1.2
+++ Src/Modules/zprof.c 2001/05/28 09:17:54
@@ -68,6 +68,7 @@
static Parc arcs;
static int narcs;
static Sfunc stack;
+static Module zprof_module;
static void
freepfuncs(Pfunc f)
@@ -216,6 +217,7 @@
static int
zprof_wrapper(Eprog prog, FuncWrap w, char *name)
{
+ int active = 0;
struct sfunc sf, *sp;
Pfunc f;
Parc a = NULL;
@@ -223,56 +225,64 @@
struct timezone dummy;
double prev, now;
- if (!(f = findpfunc(name))) {
- f = (Pfunc) zalloc(sizeof(*f));
- f->name = ztrdup(name);
- f->calls = 0;
- f->time = f->self = 0.0;
- f->next = calls;
- calls = f;
- ncalls++;
+ if (zprof_module && !(zprof_module->flags & MOD_UNLOAD)) {
+ active = 1;
+ if (!(f = findpfunc(name))) {
+ f = (Pfunc) zalloc(sizeof(*f));
+ f->name = ztrdup(name);
+ f->calls = 0;
+ f->time = f->self = 0.0;
+ f->next = calls;
+ calls = f;
+ ncalls++;
+ }
+ if (stack) {
+ if (!(a = findparc(stack->p, f))) {
+ a = (Parc) zalloc(sizeof(*a));
+ a->from = stack->p;
+ a->to = f;
+ a->calls = 0;
+ a->time = a->self = 0.0;
+ a->next = arcs;
+ arcs = a;
+ narcs++;
+ }
+ }
+ sf.prev = stack;
+ sf.p = f;
+ stack = &sf;
+
+ f->calls++;
+ tv.tv_sec = tv.tv_usec = 0;
+ gettimeofday(&tv, &dummy);
+ sf.beg = prev = ((((double) tv.tv_sec) * 1000.0) +
+ (((double) tv.tv_usec) / 1000.0));
}
- if (stack) {
- if (!(a = findparc(stack->p, f))) {
- a = (Parc) zalloc(sizeof(*a));
- a->from = stack->p;
- a->to = f;
- a->calls = 0;
- a->time = a->self = 0.0;
- a->next = arcs;
- arcs = a;
- narcs++;
- }
- }
- sf.prev = stack;
- sf.p = f;
- stack = &sf;
-
- f->calls++;
- tv.tv_sec = tv.tv_usec = 0;
- gettimeofday(&tv, &dummy);
- sf.beg = prev = ((((double) tv.tv_sec) * 1000.0) +
- (((double) tv.tv_usec) / 1000.0));
runshfunc(prog, w, name);
- tv.tv_sec = tv.tv_usec = 0;
- gettimeofday(&tv, &dummy);
-
- now = ((((double) tv.tv_sec) * 1000.0) +
- (((double) tv.tv_usec) / 1000.0));
- f->self += now - sf.beg;
- for (sp = sf.prev; sp && sp->p != f; sp = sp->prev);
- if (!sp)
- f->time += now - prev;
- if (a) {
- a->calls++;
- a->self += now - sf.beg;
- }
- stack = sf.prev;
-
- if (stack) {
- stack->beg += now - prev;
- if (a)
- a->time += now - prev;
+ if (active) {
+ if (zprof_module && !(zprof_module->flags & MOD_UNLOAD)) {
+ tv.tv_sec = tv.tv_usec = 0;
+ gettimeofday(&tv, &dummy);
+
+ now = ((((double) tv.tv_sec) * 1000.0) +
+ (((double) tv.tv_usec) / 1000.0));
+ f->self += now - sf.beg;
+ for (sp = sf.prev; sp && sp->p != f; sp = sp->prev);
+ if (!sp)
+ f->time += now - prev;
+ if (a) {
+ a->calls++;
+ a->self += now - sf.beg;
+ }
+ stack = sf.prev;
+
+ if (stack) {
+ stack->beg += now - prev;
+ if (a)
+ a->time += now - prev;
+ }
+ } else
+ stack = sf.prev;
}
return 0;
}
@@ -289,6 +299,7 @@
int
setup_(Module m)
{
+ zprof_module = m;
return 0;
}
--
Sven Wischnowsky wischnow@xxxxxxxxxxxxxxxxxxxxxxx
Messages sorted by:
Reverse Date,
Date,
Thread,
Author