Update.
2000-04-25 Ulrich Drepper <drepper@redhat.com> * elf/dl-profile.c (_dl_mcount): Try to be thread-safe while not setting the state to GMON_PROF_BUSY.
This commit is contained in:
parent
128e2b0f0e
commit
d472655c75
@ -1,3 +1,8 @@
|
||||
2000-04-25 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* elf/dl-profile.c (_dl_mcount): Try to be thread-safe while not
|
||||
setting the state to GMON_PROF_BUSY.
|
||||
|
||||
2000-04-24 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* elf/dl-profile.c (_dl_start_profile): define all variables which
|
||||
|
@ -154,11 +154,11 @@ struct here_fromstruct
|
||||
uint16_t link;
|
||||
};
|
||||
|
||||
static uint16_t *tos;
|
||||
static volatile uint16_t *tos;
|
||||
|
||||
static struct here_fromstruct *froms;
|
||||
static size_t fromlimit;
|
||||
static size_t fromidx;
|
||||
static uint32_t fromlimit;
|
||||
static volatile uint32_t fromidx;
|
||||
|
||||
static uintptr_t lowpc;
|
||||
static size_t textsize;
|
||||
@ -431,12 +431,15 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
|
||||
void
|
||||
_dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
|
||||
{
|
||||
uint16_t *topcindex;
|
||||
volatile uint16_t *topcindex;
|
||||
size_t i, fromindex;
|
||||
struct here_fromstruct *fromp;
|
||||
|
||||
#if 0
|
||||
/* XXX I think this is now not necessary anymore. */
|
||||
if (! compare_and_swap (&state, GMON_PROF_ON, GMON_PROF_BUSY))
|
||||
return;
|
||||
#endif
|
||||
|
||||
/* Compute relative addresses. The shared object can be loaded at
|
||||
any address. The value of frompc could be anything. We cannot
|
||||
@ -491,31 +494,32 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
|
||||
size_t newfromidx;
|
||||
to_index = (data[narcs].self_pc
|
||||
/ (hashfraction * sizeof (*tos)));
|
||||
newfromidx = fromidx++;
|
||||
newfromidx = exchange_and_add (&fromidx, 1) + 1;
|
||||
froms[newfromidx].here = &data[narcs];
|
||||
froms[newfromidx].link = tos[to_index];
|
||||
tos[to_index] = newfromidx;
|
||||
++narcs;
|
||||
atomic_add (&narcs, 1);
|
||||
}
|
||||
|
||||
/* If we still have no entry stop searching and insert. */
|
||||
if (*topcindex == 0)
|
||||
{
|
||||
size_t newarc = 1 + exchange_and_add (narcsp, 1);
|
||||
uint_fast32_t newarc = 1 + exchange_and_add (narcsp, 1);
|
||||
|
||||
/* In rare cases it could happen that all entries in FROMS are
|
||||
occupied. So we cannot count this anymore. */
|
||||
if (newarc >= fromlimit)
|
||||
goto done;
|
||||
|
||||
fromp = &froms[*topcindex = fromidx++];
|
||||
*topcindex = exchange_and_add (&fromidx, 1) + 1;
|
||||
fromp = &froms[*topcindex];
|
||||
|
||||
fromp->here = &data[newarc];
|
||||
data[newarc].from_pc = frompc;
|
||||
data[newarc].self_pc = selfpc;
|
||||
data[newarc].count = 0;
|
||||
fromp->link = 0;
|
||||
++narcs;
|
||||
atomic_add (&narcs, 1);
|
||||
|
||||
break;
|
||||
}
|
||||
@ -531,5 +535,8 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
|
||||
atomic_add (&fromp->here->count, 1);
|
||||
|
||||
done:
|
||||
#if 0
|
||||
/* XXX See above, Shouldn't be necessary anymore. */
|
||||
state = GMON_PROF_ON;
|
||||
#endif
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
2000-04-25 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/i386/i686/pt-machine.h: Do not use "../useldt.h" for
|
||||
now. First gcc must be fixed (more concrete: libgcc).
|
||||
|
||||
2000-04-24 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* pthread.c: Remove special treatement for interrupt handlers on x86.
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Machine-dependent pthreads configuration and inline functions.
|
||||
i686 version.
|
||||
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Richard Henderson <rth@tamu.edu>.
|
||||
|
||||
@ -64,4 +64,4 @@ __compare_and_swap (long int *p, long int oldval, long int newval)
|
||||
|
||||
|
||||
/* Use the LDT implementation only if the kernel is fixed. */
|
||||
#include "../useldt.h"
|
||||
//#include "../useldt.h"
|
||||
|
Loading…
x
Reference in New Issue
Block a user