summaryrefslogtreecommitdiff
path: root/ghc/rts/Task.h
Commit message (Collapse)AuthorAgeFilesLines
* Reorganisation of the source treeSimon Marlow2006-04-071-271/+0
| | | | | | | | | | | | | | | Most of the other users of the fptools build system have migrated to Cabal, and with the move to darcs we can now flatten the source tree without losing history, so here goes. The main change is that the ghc/ subdir is gone, and most of what it contained is now at the top level. The build system now makes no pretense at being multi-project, it is just the GHC build system. No doubt this will break many things, and there will be a period of instability while we fix the dependencies. A straightforward build should work, but I haven't yet fixed binary/source distributions. Changes to the Building Guide will follow, too.
* Merge the smp and threaded RTS waysSimon Marlow2006-02-091-10/+4
| | | | | | | Now, the threaded RTS also includes SMP support. The -smp flag is a synonym for -threaded. The performance implications of this are small to negligible, and it results in a code cleanup and reduces the number of combinations we have to test.
* [project @ 2005-11-03 11:05:38 by simonmar]simonmar2005-11-031-6/+8
| | | | | | | | | | | | | | | | | | | Improvments to time-measurement and stats: - move all the platform-dependent timing related stuff into posix/GetTime.c and win32/GetTime.c, with the machine-indepent interface specified in GetTime.h. This is now used by Stats.c. - On Unix, use gettimeofday() and getrusage() by default, falling back to time() if one of these isn't available. - try to implement thread-specfic CPU-time measurement using clock_gettime() on Unix. Doesn't work reliably on Linux, because the implemenation tries to use the processor TSC, which on an SMP machine goes wrong when the thread moves between CPUs. However, it's slightly less bogus that before, and hopefully will improve in the future.
* [project @ 2005-10-21 14:02:17 by simonmar]simonmar2005-10-211-97/+265
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Big re-hash of the threaded/SMP runtime This is a significant reworking of the threaded and SMP parts of the runtime. There are two overall goals here: - To push down the scheduler lock, reducing contention and allowing more parts of the system to run without locks. In particular, the scheduler does not require a lock any more in the common case. - To improve affinity, so that running Haskell threads stick to the same OS threads as much as possible. At this point we have the basic structure working, but there are some pieces missing. I believe it's reasonably stable - the important parts of the testsuite pass in all the (normal,threaded,SMP) ways. In more detail: - Each capability now has a run queue, instead of one global run queue. The Capability and Task APIs have been completely rewritten; see Capability.h and Task.h for the details. - Each capability has its own pool of worker Tasks. Hence, Haskell threads on a Capability's run queue will run on the same worker Task(s). As long as the OS is doing something reasonable, this should mean they usually stick to the same CPU. Another way to look at this is that we're assuming each Capability is associated with a fixed CPU. - What used to be StgMainThread is now part of the Task structure. Every OS thread in the runtime has an associated Task, and it can ask for its current Task at any time with myTask(). - removed RTS_SUPPORTS_THREADS symbol, use THREADED_RTS instead (it is now defined for SMP too). - The RtsAPI has had to change; we must explicitly pass a Capability around now. The previous interface assumed some global state. SchedAPI has also changed a lot. - The OSThreads API now supports thread-local storage, used to implement myTask(), although it could be done more efficiently using gcc's __thread extension when available. - I've moved some POSIX-specific stuff into the posix subdirectory, moving in the direction of separating out platform-specific implementations. - lots of lock-debugging and assertions in the runtime. In particular, when DEBUG is on, we catch multiple ACQUIRE_LOCK()s, and there is also an ASSERT_LOCK_HELD() call. What's missing so far: - I have almost certainly broken the Win32 build, will fix soon. - any kind of thread migration or load balancing. This is high up the agenda, though. - various performance tweaks to do - throwTo and forkProcess still do not work in SMP mode
* [project @ 2005-04-06 15:27:06 by simonmar]simonmar2005-04-061-15/+86
| | | | | | Revamp the Task API: now we use the same implementation for threaded and SMP. We also keep per-task timing stats in the threaded RTS now, which makes the output of +RTS -sstderr more useful.
* [project @ 2005-04-05 12:19:54 by simonmar]simonmar2005-04-051-1/+1
| | | | | | | | | | | | | | | | | | | | | | Some multi-processor hackery, including - Don't hang blocked threads off BLACKHOLEs any more, instead keep them all on a separate queue which is checked periodically for threads to wake up. This is good because (a) we don't have to worry about locking the closure in SMP mode when we want to block on it, and (b) it means the standard update code doesn't need to wake up any threads or check for a BLACKHOLE_BQ, simplifying the update code. The downside is that if there are lots of threads blocked on BLACKHOLEs, we might have to do a lot of repeated list traversal. We don't expect this to be common, though. conc023 goes slower with this change, but we expect most programs to benefit from the shorter update code. - Fixing up the Capability code to handle multiple capabilities (SMP mode), and related changes to get the SMP mode at least building.
* [project @ 2004-05-06 12:20:04 by wolfgang]wolfgang2004-05-061-1/+1
| | | | | | | | | | | | Threaded RTS: Fix a deadlock situation The flag startingWorkerThread that is used by startSchedulerTaskIfNecessary (in Schedule.c) has to be reset if startTask (in Task.c) decides not to start another task after all (if a task is already waiting). When the flag isn't reset, this leads to a deadlock the next time a new worker thread is actually needed. MERGE TO STABLE
* [project @ 2003-12-16 13:19:01 by simonmar]simonmar2003-12-161-2/+2
| | | | ANSIfy
* [project @ 2003-10-01 10:49:07 by wolfgang]wolfgang2003-10-011-0/+1
| | | | | | | | | | | | | | | | Threaded RTS: Don't start new worker threads earlier than necessary. After this commit, a Haskell program that uses neither forkOS nor forkIO is really single-threaded (rather than using two OS threads internally). Some details: Worker threads are now only created when a capability is released, and only when (there are no worker threads) && (there are runnable Haskell threads || there are Haskell threads blocked on IO or threadDelay) awaitEvent can now be called from bound thread scheduling loops (so that we don't have to create a worker thread just to run awaitEvent)
* [project @ 2002-02-13 07:51:01 by sof]sof2002-02-131-6/+0
| | | | removed taskNotAvailable(), taskAvailable() and getTaskCount() - simplified away
* [project @ 2002-02-12 04:49:13 by sof]sof2002-02-121-2/+2
| | | | comment wibble
* [project @ 2002-02-06 01:26:14 by sof]sof2002-02-061-0/+5
| | | | | | | | | | - in the threaded case, keep track of the number of tasks/threads that are currently waiting to enter the RTS. - taskStart(): + only start up a new thread/task if there aren't any already waiting to gain RTS access. + honour thread/task limits (if any).
* [project @ 2002-02-04 20:24:14 by sof]sof2002-02-041-0/+36
Factor out the task handling into separate 'module'. [Tasks represent native threads that execute STG code, with this module providing the API which the Scheduler uses to control their creation and destruction.]