From 0fa2f943161d778564757470e050259c66cd256c Mon Sep 17 00:00:00 2001 From: David Xu Date: Fri, 6 May 2005 07:37:01 +0000 Subject: [PATCH] Fix race by using atomic operation, with this change, both libpthread and libthr now can run profiling on SMP. --- lib/libc/gmon/mcount.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/libc/gmon/mcount.c b/lib/libc/gmon/mcount.c index d4faba21788..b3b561c285e 100644 --- a/lib/libc/gmon/mcount.c +++ b/lib/libc/gmon/mcount.c @@ -49,6 +49,7 @@ void btrap(void); void eintr(void); void user(void); #endif +#include /* * 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 @@ done: #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