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