summaryrefslogtreecommitdiff
path: root/pod
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2005-09-17 17:09:25 +0000
committerNicholas Clark <nick@ccl4.org>2005-09-17 17:09:25 +0000
commitc99e3826c46ffcfffa9fb9cdc6d049c77e4d8112 (patch)
tree314f948ebe207b31c309cdfa2c6aa6e474c8173c /pod
parent62403a3c834f3ce459f6efd4d74fba81521e3342 (diff)
downloadperl-c99e3826c46ffcfffa9fb9cdc6d049c77e4d8112.tar.gz
Add emulate the per-thread memory pool on Unix to the TODO
p4raw-id: //depot/perl@25439
Diffstat (limited to 'pod')
-rw-r--r--pod/perltodo.pod31
1 files changed, 31 insertions, 0 deletions
diff --git a/pod/perltodo.pod b/pod/perltodo.pod
index e315cd3023..0caa728164 100644
--- a/pod/perltodo.pod
+++ b/pod/perltodo.pod
@@ -273,6 +273,37 @@ anyone feeling like exercising their skill with coverage and profiling tools
might want to determine what ops I<really> are the most commonly used. And in
turn suggest evictions and promotions to achieve a better F<pp_hot.c>.
+=head2 emulate the per-thread memory pool on Unix
+
+For Windows, ithreads allocates memory for each thread from a separate pool,
+which it discards at thread exit. It also checks that memory is free()d to
+the correct pool. Neither check is done on Unix, so code developed there won't
+be subject to such strictures, so can harbour bugs that only show up when the
+code reaches Windows.
+
+It would be good to be able to optionally emulate the Window pool system on
+Unix, to let developers who only have access to Unix, or want to use
+Unix-specific debugging tools, check for these problems. To do this would
+involve figuring out how the C<PerlMem_*> macros wrap C<malloc()> access, and
+providing a layer that records/checks the identity of the thread making the
+call, and recording all the memory allocated by each thread via this API so
+that it can be summarily free()d at thread exit. One implementation idea
+would be to increase the size of allocation, and store the C<my_perl> pointer
+(to identify the thread) at the start, along with pointers to make a linked
+list of blocks for this thread. To avoid alignment problems it would be
+necessary to do something like
+
+ union memory_header_padded {
+ struct memory_header {
+ void *thread_id; /* For my_perl */
+ void *next; /* Pointer to next block for this thread */
+ } data;
+ long double padding; /* whatever type has maximal alignment constraint */
+ };
+
+
+although C<long double> might not be the only type to add to the padding
+union.