diff options
author | Simon Marlow <marlowsd@gmail.com> | 2014-10-15 00:03:15 +0100 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2014-11-12 15:11:10 +0000 |
commit | d70b19bfb5ed79b22c2ac31e22f46782fc47a117 (patch) | |
tree | d7bc2ad5a6d50bf351dfd97779030dae63e5d7cf /includes | |
parent | c774b28f76ee4c220f7c1c9fd81585e0e3af0e8a (diff) | |
download | haskell-d70b19bfb5ed79b22c2ac31e22f46782fc47a117.tar.gz |
Per-thread allocation counters and limits
This reverts commit f0fcc41d755876a1b02d1c7c79f57515059f6417.
New changes: now works on 32-bit platforms too. I added some basic
support for 64-bit subtraction and comparison operations to the x86
NCG.
Diffstat (limited to 'includes')
-rw-r--r-- | includes/rts/Constants.h | 6 | ||||
-rw-r--r-- | includes/rts/Flags.h | 8 | ||||
-rw-r--r-- | includes/rts/Threads.h | 8 | ||||
-rw-r--r-- | includes/rts/storage/TSO.h | 31 |
4 files changed, 42 insertions, 11 deletions
diff --git a/includes/rts/Constants.h b/includes/rts/Constants.h index 6fd0dc0dfc..02cb63210d 100644 --- a/includes/rts/Constants.h +++ b/includes/rts/Constants.h @@ -277,6 +277,12 @@ #define TSO_SQUEEZED 128 /* + * Enables the AllocationLimitExceeded exception when the thread's + * allocation limit goes negative. + */ +#define TSO_ALLOC_LIMIT 256 + +/* * The number of times we spin in a spin lock before yielding (see * #3758). To tune this value, use the benchmark in #3758: run the * server with -N2 and the client both on a dual-core. Also make sure diff --git a/includes/rts/Flags.h b/includes/rts/Flags.h index bf6a7f3c5c..ec542701df 100644 --- a/includes/rts/Flags.h +++ b/includes/rts/Flags.h @@ -56,6 +56,14 @@ struct GC_FLAGS { rtsBool doIdleGC; StgWord heapBase; /* address to ask the OS for memory */ + + StgWord allocLimitGrace; /* units: *blocks* + * After an AllocationLimitExceeded + * exception has been raised, how much + * extra space is given to the thread + * to handle the exception before we + * raise it again. + */ }; struct DEBUG_FLAGS { diff --git a/includes/rts/Threads.h b/includes/rts/Threads.h index 941f6daf65..fc8ae6e089 100644 --- a/includes/rts/Threads.h +++ b/includes/rts/Threads.h @@ -42,8 +42,12 @@ StgRegTable * resumeThread (void *); // // Thread operations from Threads.c // -int cmp_thread (StgPtr tso1, StgPtr tso2); -int rts_getThreadId (StgPtr tso); +int cmp_thread (StgPtr tso1, StgPtr tso2); +int rts_getThreadId (StgPtr tso); +HsInt64 rts_getThreadAllocationCounter (StgPtr tso); +void rts_setThreadAllocationCounter (StgPtr tso, HsInt64 i); +void rts_enableThreadAllocationLimit (StgPtr tso); +void rts_disableThreadAllocationLimit (StgPtr tso); #if !defined(mingw32_HOST_OS) pid_t forkProcess (HsStablePtr *entry); diff --git a/includes/rts/storage/TSO.h b/includes/rts/storage/TSO.h index 6dbcec2595..06056fe716 100644 --- a/includes/rts/storage/TSO.h +++ b/includes/rts/storage/TSO.h @@ -145,15 +145,18 @@ typedef struct StgTSO_ { */ struct StgBlockingQueue_ *bq; -#ifdef TICKY_TICKY - /* TICKY-specific stuff would go here. */ -#endif -#ifdef PROFILING - StgTSOProfInfo prof; -#endif -#ifdef mingw32_HOST_OS - StgWord32 saved_winerror; -#endif + /* + * The allocation limit for this thread, which is updated as the + * thread allocates. If the value drops below zero, and + * TSO_ALLOC_LIMIT is set in flags, we raise an exception in the + * thread, and give the thread a little more space to handle the + * exception before we raise the exception again. + * + * This is an integer, because we might update it in a place where + * it isn't convenient to raise the exception, so we want it to + * stay negative until we get around to checking it. + */ + StgInt64 alloc_limit; /* in bytes */ /* * sum of the sizes of all stack chunks (in words), used to decide @@ -168,6 +171,16 @@ typedef struct StgTSO_ { */ StgWord32 tot_stack_size; +#ifdef TICKY_TICKY + /* TICKY-specific stuff would go here. */ +#endif +#ifdef PROFILING + StgTSOProfInfo prof; +#endif +#ifdef mingw32_HOST_OS + StgWord32 saved_winerror; +#endif + } *StgTSOPtr; typedef struct StgStack_ { |