Fix race by using atomic operation, with this change, both libpthread

and libthr now can run profiling on SMP.
This commit is contained in:
David Xu 2005-05-06 07:37:01 +00:00
parent fd94099ec2
commit 0fa2f94316
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=145959

View File

@ -49,6 +49,7 @@ void btrap(void);
void eintr(void);
void user(void);
#endif
#include <machine/atomic.h>
/*
* mcount is called on entry to each function compiled with the profiling
@ -92,7 +93,8 @@ _MCOUNT_DECL(uintfptr_t frompc, uintfptr_t selfpc)
#ifdef _KERNEL
MCOUNT_ENTER(s);
#else
p->state = GMON_PROF_BUSY;
if (!atomic_cmpset_acq_int(&p->state, GMON_PROF_ON, GMON_PROF_BUSY))
return;
#endif
frompci = frompc - p->lowpc;
@ -260,11 +262,11 @@ _MCOUNT_DECL(uintfptr_t frompc, uintfptr_t selfpc)
#ifdef _KERNEL
MCOUNT_EXIT(s);
#else
p->state = GMON_PROF_ON;
atomic_store_rel_int(&p->state, GMON_PROF_ON);
#endif
return;
overflow:
p->state = GMON_PROF_ERROR;
atomic_store_rel_int(&p->state, GMON_PROF_ERROR);
#ifdef _KERNEL
MCOUNT_EXIT(s);
#endif