[project @ 2005-05-10 10:27:20 by simonmar]
[ghc-hetmet.git] / ghc / rts / Capability.h
index e615035..21d4ce4 100644 (file)
@@ -23,6 +23,9 @@
 #ifndef __CAPABILITY_H__
 #define __CAPABILITY_H__
 
+// All the capabilities
+extern Capability *capabilities;
+
 // Initialised the available capabilities.
 //
 extern void initCapabilities( void );
@@ -35,6 +38,8 @@ extern void releaseCapability( Capability* cap );
 //
 extern void threadRunnable ( void );
 
+extern void prodWorker ( void );
+
 #ifdef RTS_SUPPORTS_THREADS
 // Gives up the current capability IFF there is a higher-priority
 // thread waiting for it.  This happens in one of two ways:
@@ -80,6 +85,9 @@ extern void passCapability(Condition *pTargetThreadCond);
 extern void passCapabilityToWorker( void );
 
 extern nat rts_n_free_capabilities;  
+
+extern Capability *free_capabilities;
+
 /* number of worker threads waiting for a return capability
  */
 extern nat rts_n_waiting_workers;
@@ -101,7 +109,11 @@ static inline rtsBool noCapabilities (void)
 
 static inline rtsBool allFreeCapabilities (void)
 {
+#if defined(SMP)
+  return (rts_n_free_capabilities == RTS_DEREF(RtsFlags).ParFlags.nNodes);
+#else
   return (rts_n_free_capabilities == 1);
+#endif
 }
 
 #else // !RTS_SUPPORTS_THREADS
@@ -111,6 +123,6 @@ static inline rtsBool allFreeCapabilities (void)
 //
 extern void grabCapability( Capability **pCap );
 
-#endif // !RTS_SUPPORTS_THREADS
+#endif /* !RTS_SUPPORTS_THREADS */
 
 #endif /* __CAPABILITY_H__ */