Skip to content

Commit

Permalink
Update.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Ulrich Drepper committed Apr 25, 2000
1 parent 128e2b0 commit d472655
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 11 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
25 changes: 16 additions & 9 deletions elf/dl-profile.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
Expand All @@ -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
}
5 changes: 5 additions & 0 deletions linuxthreads/ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
4 changes: 2 additions & 2 deletions linuxthreads/sysdeps/i386/i686/pt-machine.h
Original file line number Diff line number Diff line change
@@ -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>.
Expand Down Expand Up @@ -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"

0 comments on commit d472655

Please sign in to comment.