Re: [PATCH 5.004_60] Fix goto-in-eval segfault (unwrapped!)
[p5sagit/p5-mst-13.2.git] / README.threads
CommitLineData
72aaf631 1Building
2
d81a1b93 3If you want to build with multi-threading support and you are
69ce17de 4running one of the following:
5 * Linux 2.x (with the LinuxThreads library installed: that's
6 the linuxthreads and linuxthreads-devel RPMs for RedHat)
7
8 * Digital UNIX 4.x
9
10 * Solaris 2.x for recentish x (2.5 is OK)
11
12 * IRIX 6.2 or newer. 6.2 will require a few os patches.
13 IMPORTANT: Without patch 2401, a kernel bug in IRIX 6.2 will
14 cause your machine to panic and crash when running threaded perl.
15 IRIX 6.3 and up should be OK. See lower down for patch details.
16
d81a1b93 17then you should be able to use
18 ./Configure -Dusethreads -Doptimize=-g -ders
19 make
20and ignore the rest of this "Building" section. If it doesn't
21work or you are using another platform which you believe supports
22POSIX.1c threads then read on.
23
72aaf631 24Omit the -e from your ./Configure arguments. For example, use
25 ./Configure -drs
26When it offers to let you change config.sh, do so. If you already
27have a config.sh then you can edit it and do
28 ./Configure -S
29to propagate the required changes.
30In ccflags, insert -DUSE_THREADS (and probably -DDEBUGGING since
31that's what I've been building with). Also insert any other
32arguments in there that your compiler needs to use POSIX threads.
33Change optimize to -g to give you better debugging information.
34Include any necessary explicit libraries in libs and change
35ldflags if you need any linker flags instead or as well.
36
37More explicitly, for Linux (when using the standard kernel-threads
38based LinuxThreads library):
39 Add -DUSE_THREADS -D_REENTRANT -DDEBUGGING to ccflags and cppflags
40 Add -lpthread to libs
41 Change optimize to -g
42For Digital Unix 4.x:
43 Add -pthread -DUSE_THREADS -DDEBUGGING to ccflags
44 Add -DUSE_THREADS -DDEBUGGING to cppflags
45 Add -pthread to ldflags
46 Change optimize to -g
d81a1b93 47 Add -lpthread -lc_r to lddlflags
72aaf631 48 For some reason, the extra includes for pthreads make Digital UNIX
49 complain fatally about the sbrk() delcaration in perl's malloc.c
50 so use the native malloc as follows:
51 Change usemymalloc to n
52 Zap mallocobj and mallocsrc (foo='')
53 Change d_mymalloc to undef
d81a1b93 54For Solaris, do the same as for Linux above.
eb1cfdd6 55For IRIX:
56 Add -DUSE_THREADS -DDEBUGGING to ccflags
57 Add -DUSE_THREADS -DDEBUGGING to cppflags
58 Add -lpthread to libs
59 Change optimize to -g
60 For IRIX 6.2, you have to have the following patches installed:
61 1404 Irix 6.2 Posix 1003.1b man pages
62 1645 IRIX 6.2 & 6.3 POSIX header file updates
63 2000 Irix 6.2 Posix 1003.1b support modules
64 2254 Pthread library fixes
69ce17de 65 2401 6.2 all platform kernel rollup
66 IMPORTANT: Without patch 2401, a kernel bug in IRIX 6.2 will
67 cause your machine to panic and crash when running threaded perl.
68 IRIX 6.3 and up should be OK.
69
eb1cfdd6 70 For IRIX 6.3 and 6.4 the pthreads should work out of the box.
71 Thanks to Hannu Napari <Hannu.Napari@hut.fi> for the IRIX
72 pthreads patches information.
ce637636 73For AIX:
74 Change cc to xlc_r or cc_r.
75 Add -DUSE_THREADS -DNEED_PTHREAD_INIT -DDEBUGGING to ccflags and cppflags
76 Change optimize to -g
77 Add -lc_r to libswanted
78 Change -lc in lddflags to be -lpthread -lc_r -lc
72aaf631 79
80Now you can do a
d81a1b93 81 make
82
72aaf631 83
5756a3ac 84O/S specific bugs
85
86Solaris qsort uses a hidden mutex for synchronisation. If you die()
87while doing a sort() then the resulting longjmp() leaves the mutex
88locked so you get a deadlock the next time you try to sort().
89
90LinuxThreads 0.5 has a bug which can cause file descriptor 0 to be
69ce17de 91closed after a fork() leading to many strange symptoms. Version 0.6
92has this fixed but the following patch can be applied to 0.5 for now:
5756a3ac 93
94----------------------------- cut here -----------------------------
95--- linuxthreads-0.5/pthread.c.ORI Mon Oct 6 13:55:50 1997
96+++ linuxthreads-0.5/pthread.c Mon Oct 6 13:57:24 1997
97@@ -312,8 +312,10 @@
98 free(pthread_manager_thread_bos);
99 pthread_manager_thread_bos = pthread_manager_thread_tos = NULL;
100 /* Close the two ends of the pipe */
101- close(pthread_manager_request);
102- close(pthread_manager_reader);
103+ if (pthread_manager_request >= 0) {
104+ close(pthread_manager_request);
105+ close(pthread_manager_reader);
106+ }
107 pthread_manager_request = pthread_manager_reader = -1;
108 /* Update the pid of the main thread */
109 self->p_pid = getpid();
110----------------------------- cut here -----------------------------
111
112
72aaf631 113Building the Thread extension
114
5756a3ac 115The Thread extension is now part of the main perl distribution tree.
116If you did Configure -Dusethreads then it will have been added to
117the list of extensions automatically.
72aaf631 118
5756a3ac 119You can try some of the tests with
120 cd ext/Thread
69ce17de 121 perl create.t
122 perl join.t
123 perl lock.t
124 perl io.t
125etc.
72aaf631 126The io one leaves a thread reading from the keyboard on stdin so
127as the ping messages appear you can type lines and see them echoed.
128
129Try running the main perl test suite too. There are known
69ce17de 130failures for some of the DBM/DB extensions (if their underlying
131libraries were not compiled to be thread-aware).
72aaf631 132
133
134Bugs
135
72aaf631 136* FAKE_THREADS should produce a working perl but the Thread
137extension won't build with it yet.
138
139* There's a known memory leak (curstack isn't freed at the end
140of each thread because it causes refcount problems that I
141haven't tracked down yet) and there are very probably others too.
142
5756a3ac 143* There may still be races where bugs show up under contention.
72aaf631 144
43fe56be 145* Need to document "lock", Thread.pm, Queue.pm, ...
146
72aaf631 147
1304aa9d 148Debugging
149
150Use the -DL command-line option to turn on debugging of the
151multi-threading code. Under Linux, that also turns on a quick
152hack I did to grab a bit of extra information from segfaults.
153If you have a fancier gdb/threads setup than I do then you'll
154have to delete the lines in perl.c which say
155 #if defined(DEBUGGING) && defined(USE_THREADS) && defined(__linux__)
156 DEBUG_L(signal(SIGSEGV, (void(*)(int))catch_sigsegv););
157 #endif
158
159
43fe56be 160Background
161
162Some old globals (e.g. stack_sp, op) and some old per-interpreter
163variables (e.g. tmps_stack, cxstack) move into struct thread.
5756a3ac 164All fields of struct thread which derived from original perl
165variables have names of the form Tfoo. For example, stack_sp becomes
43fe56be 166the field Tstack_sp of struct thread. For those fields which moved
167from original perl, thread.h does
168 #define foo (thr->Tfoo)
169This means that all functions in perl which need to use one of these
170fields need an (automatic) variable thr which points at the current
171thread's struct thread. For pp_foo functions, it is passed around as
172an argument, for other functions they do
173 dTHR;
174which declares and initialises thr from thread-specific data
175via pthread_getspecific. If a function fails to compile with an
176error about "no such variable thr", it probably just needs a dTHR
177at the top.
178
179
180Fake threads
181
182For FAKE_THREADS, thr is a global variable and perl schedules threads
183by altering thr in between appropriate ops. The next and prev fields
184of struct thread keep all fake threads on a doubly linked list and
185the next_run and prev_run fields keep all runnable threads on a
186doubly linked list. Mutexes are stubs for FAKE_THREADS. Condition
187variables are implemented as a list of waiting threads.
188
189
190Mutexes and condition variables
191
192The API is via macros MUTEX_{INIT,LOCK,UNLOCK,DESTROY} and
5756a3ac 193COND_{INIT,WAIT,SIGNAL,BROADCAST,DESTROY}.
194
195A mutex is only required to be a simple, fast mutex (e.g. it does not
196have to be recursive). It is only ever held across very short pieces
197of code. Condition variables are only ever signalled/broadcast while
198their associated mutex is held. (This constraint simplifies the
199implementation of condition variables in certain porting situations.)
200For POSIX threads, perl mutexes and condition variables correspond to
201POSIX ones. For FAKE_THREADS, mutexes are stubs and condition variables
202are implmented as lists of waiting threads. For FAKE_THREADS, a thread
43fe56be 203waits on a condition variable by removing itself from the runnable
204list, calling SCHEDULE to change thr to the next appropriate
205runnable thread and returning op (i.e. the new threads next op).
206This means that fake threads can only block while in PP code.
207A PP function which contains a COND_WAIT must be prepared to
208handle such restarts and can use the field "private" of struct
209thread to record its state. For fake threads, COND_SIGNAL and
210COND_BROADCAST work by putting back all the threads on the
211condition variables list into the run queue. Note that a mutex
212must *not* be held while returning from a PP function.
213
c7848ba1 214Perl locks and condition variables are both implemented as a
215condpair_t structure, containing a mutex, an "owner" condition
216variable, an owner thread field and another condition variable).
217The structure is attached by 'm' magic to any SV. pp_lock locks
218such an object by waiting on the ownercond condition variable until
219the owner field is zero and then setting the owner field to its own
220thread pointer. The lock is semantically recursive so if the owner
221field already matches the current thread then pp_lock returns
222straight away. If the owner field has to be filled in then
223unlock_condpair is queued as an end-of-block destructor and
224that function zeroes out the owner field and signals the ownercond
225condition variable, thus waking up any other thread that wants to
226lock it. When used as a condition variable, the condpair is locked
227(involving the above wait-for-ownership and setting the owner field)
228and the spare condition variable field is used for waiting on.
229
230
231Thread states
232
233
234 $t->join
235R_JOINABLE ---------------------> R_JOINED >----\
236 | \ pthread_join(t) | ^ |
237 | \ | | join | pthread_join
238 | \ | | |
239 | \ | \------/
240 | \ |
241 | \ |
242 | $t->detach\ pthread_detach |
243 | _\| |
244ends| R_DETACHED ends | unlink
245 | \ |
246 | ends \ unlink |
247 | \ |
248 | \ |
249 | \ |
250 | \ |
251 | \ |
252 V join detach _\| V
253ZOMBIE ----------------------------> DEAD
254 pthread_join pthread_detach
255 and unlink and unlink
256
43fe56be 257
258
72aaf631 259Malcolm Beattie
260mbeattie@sable.ox.ac.uk
69ce17de 261Last updated: 27 November 1997