diff options
author | Simon Marlow <marlowsd@gmail.com> | 2010-07-20 15:37:46 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2010-07-20 15:37:46 +0000 |
commit | 971c88597b0972053975c9c99aa51764ab75b143 (patch) | |
tree | 30061a5305f6d7b490345ea5ce4b99b14bf5810d /rts | |
parent | 726cab79226c45945eb6e7f6ae9597a4e4f90f37 (diff) | |
download | haskell-971c88597b0972053975c9c99aa51764ab75b143.tar.gz |
add numSparks# primop (#4167)
Diffstat (limited to 'rts')
-rw-r--r-- | rts/Inlines.c | 1 | ||||
-rw-r--r-- | rts/Linker.c | 1 | ||||
-rw-r--r-- | rts/PrimOps.cmm | 11 | ||||
-rw-r--r-- | rts/WSDeque.h | 12 |
4 files changed, 19 insertions, 6 deletions
diff --git a/rts/Inlines.c b/rts/Inlines.c index ccb30bf76d..e6f29b6e1b 100644 --- a/rts/Inlines.c +++ b/rts/Inlines.c @@ -6,3 +6,4 @@ #include "Rts.h" #include "Schedule.h" #include "Capability.h" +#include "WSDeque.h" diff --git a/rts/Linker.c b/rts/Linker.c index 78bdc8f81b..3618fd481e 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -789,6 +789,7 @@ typedef struct _RtsSymbolVal { SymI_HasProto(stg_unpackClosurezh) \ SymI_HasProto(stg_getApStackValzh) \ SymI_HasProto(stg_getSparkzh) \ + SymI_HasProto(stg_numSparkszh) \ SymI_HasProto(stg_isCurrentThreadBoundzh) \ SymI_HasProto(stg_isEmptyMVarzh) \ SymI_HasProto(stg_killThreadzh) \ diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm index 029b2b751a..3c7dbdd0cc 100644 --- a/rts/PrimOps.cmm +++ b/rts/PrimOps.cmm @@ -2020,6 +2020,17 @@ stg_getSparkzh #endif } +stg_numSparkszh +{ + W_ n; +#ifdef THREADED_RTS + (n) = foreign "C" dequeElements(Capability_sparks(MyCapability())); +#else + n = 0; +#endif + RET_N(n); +} + stg_traceEventzh { W_ msg; diff --git a/rts/WSDeque.h b/rts/WSDeque.h index d85567c38a..9c62478113 100644 --- a/rts/WSDeque.h +++ b/rts/WSDeque.h @@ -79,7 +79,7 @@ void* popWSDeque (WSDeque *q); rtsBool pushWSDeque (WSDeque *q, void *elem); // Removes all elements from the deque -INLINE_HEADER void discardElements (WSDeque *q); +EXTERN_INLINE void discardElements (WSDeque *q); // Removes an element of the deque from the "read" end, or returns // NULL if the pool is empty, or if there was a collision with another @@ -93,15 +93,15 @@ void * stealWSDeque (WSDeque *q); // "guesses" whether a deque is empty. Can return false negatives in // presence of concurrent steal() calls, and false positives in // presence of a concurrent pushBottom(). -INLINE_HEADER rtsBool looksEmptyWSDeque (WSDeque* q); +EXTERN_INLINE rtsBool looksEmptyWSDeque (WSDeque* q); -INLINE_HEADER long dequeElements (WSDeque *q); +EXTERN_INLINE long dequeElements (WSDeque *q); /* ----------------------------------------------------------------------------- * PRIVATE below here * -------------------------------------------------------------------------- */ -INLINE_HEADER long +EXTERN_INLINE long dequeElements (WSDeque *q) { StgWord t = q->top; @@ -110,13 +110,13 @@ dequeElements (WSDeque *q) return ((long)b - (long)t); } -INLINE_HEADER rtsBool +EXTERN_INLINE rtsBool looksEmptyWSDeque (WSDeque *q) { return (dequeElements(q) <= 0); } -INLINE_HEADER void +EXTERN_INLINE void discardElements (WSDeque *q) { q->top = q->bottom; |