Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / devtools / amd64 / man / man3 / Tcl_ConditionWait.3
CommitLineData
920dae64
AT
1'\"
2'\" Copyright (c) 1999 Scriptics Corporation
3'\" Copyright (c) 1998 Sun Microsystems, Inc.
4'\"
5'\" See the file "license.terms" for information on usage and redistribution
6'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
7'\"
8'\" RCS: @(#) $Id: Thread.3,v 1.14.2.2 2004/11/25 15:48:52 vasiljevic Exp $
9'\"
10'\" The definitions below are for supplemental macros used in Tcl/Tk
11'\" manual entries.
12'\"
13'\" .AP type name in/out ?indent?
14'\" Start paragraph describing an argument to a library procedure.
15'\" type is type of argument (int, etc.), in/out is either "in", "out",
16'\" or "in/out" to describe whether procedure reads or modifies arg,
17'\" and indent is equivalent to second arg of .IP (shouldn't ever be
18'\" needed; use .AS below instead)
19'\"
20'\" .AS ?type? ?name?
21'\" Give maximum sizes of arguments for setting tab stops. Type and
22'\" name are examples of largest possible arguments that will be passed
23'\" to .AP later. If args are omitted, default tab stops are used.
24'\"
25'\" .BS
26'\" Start box enclosure. From here until next .BE, everything will be
27'\" enclosed in one large box.
28'\"
29'\" .BE
30'\" End of box enclosure.
31'\"
32'\" .CS
33'\" Begin code excerpt.
34'\"
35'\" .CE
36'\" End code excerpt.
37'\"
38'\" .VS ?version? ?br?
39'\" Begin vertical sidebar, for use in marking newly-changed parts
40'\" of man pages. The first argument is ignored and used for recording
41'\" the version when the .VS was added, so that the sidebars can be
42'\" found and removed when they reach a certain age. If another argument
43'\" is present, then a line break is forced before starting the sidebar.
44'\"
45'\" .VE
46'\" End of vertical sidebar.
47'\"
48'\" .DS
49'\" Begin an indented unfilled display.
50'\"
51'\" .DE
52'\" End of indented unfilled display.
53'\"
54'\" .SO
55'\" Start of list of standard options for a Tk widget. The
56'\" options follow on successive lines, in four columns separated
57'\" by tabs.
58'\"
59'\" .SE
60'\" End of list of standard options for a Tk widget.
61'\"
62'\" .OP cmdName dbName dbClass
63'\" Start of description of a specific option. cmdName gives the
64'\" option's name as specified in the class command, dbName gives
65'\" the option's name in the option database, and dbClass gives
66'\" the option's class in the option database.
67'\"
68'\" .UL arg1 arg2
69'\" Print arg1 underlined, then print arg2 normally.
70'\"
71'\" RCS: @(#) $Id: man.macros,v 1.4 2000/08/25 06:18:32 ericm Exp $
72'\"
73'\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages.
74.if t .wh -1.3i ^B
75.nr ^l \n(.l
76.ad b
77'\" # Start an argument description
78.de AP
79.ie !"\\$4"" .TP \\$4
80.el \{\
81. ie !"\\$2"" .TP \\n()Cu
82. el .TP 15
83.\}
84.ta \\n()Au \\n()Bu
85.ie !"\\$3"" \{\
86\&\\$1 \\fI\\$2\\fP (\\$3)
87.\".b
88.\}
89.el \{\
90.br
91.ie !"\\$2"" \{\
92\&\\$1 \\fI\\$2\\fP
93.\}
94.el \{\
95\&\\fI\\$1\\fP
96.\}
97.\}
98..
99'\" # define tabbing values for .AP
100.de AS
101.nr )A 10n
102.if !"\\$1"" .nr )A \\w'\\$1'u+3n
103.nr )B \\n()Au+15n
104.\"
105.if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n
106.nr )C \\n()Bu+\\w'(in/out)'u+2n
107..
108.AS Tcl_Interp Tcl_CreateInterp in/out
109'\" # BS - start boxed text
110'\" # ^y = starting y location
111'\" # ^b = 1
112.de BS
113.br
114.mk ^y
115.nr ^b 1u
116.if n .nf
117.if n .ti 0
118.if n \l'\\n(.lu\(ul'
119.if n .fi
120..
121'\" # BE - end boxed text (draw box now)
122.de BE
123.nf
124.ti 0
125.mk ^t
126.ie n \l'\\n(^lu\(ul'
127.el \{\
128.\" Draw four-sided box normally, but don't draw top of
129.\" box if the box started on an earlier page.
130.ie !\\n(^b-1 \{\
131\h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
132.\}
133.el \}\
134\h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
135.\}
136.\}
137.fi
138.br
139.nr ^b 0
140..
141'\" # VS - start vertical sidebar
142'\" # ^Y = starting y location
143'\" # ^v = 1 (for troff; for nroff this doesn't matter)
144.de VS
145.if !"\\$2"" .br
146.mk ^Y
147.ie n 'mc \s12\(br\s0
148.el .nr ^v 1u
149..
150'\" # VE - end of vertical sidebar
151.de VE
152.ie n 'mc
153.el \{\
154.ev 2
155.nf
156.ti 0
157.mk ^t
158\h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n'
159.sp -1
160.fi
161.ev
162.\}
163.nr ^v 0
164..
165'\" # Special macro to handle page bottom: finish off current
166'\" # box/sidebar if in box/sidebar mode, then invoked standard
167'\" # page bottom macro.
168.de ^B
169.ev 2
170'ti 0
171'nf
172.mk ^t
173.if \\n(^b \{\
174.\" Draw three-sided box if this is the box's first page,
175.\" draw two sides but no top otherwise.
176.ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
177.el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
178.\}
179.if \\n(^v \{\
180.nr ^x \\n(^tu+1v-\\n(^Yu
181\kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c
182.\}
183.bp
184'fi
185.ev
186.if \\n(^b \{\
187.mk ^y
188.nr ^b 2
189.\}
190.if \\n(^v \{\
191.mk ^Y
192.\}
193..
194'\" # DS - begin display
195.de DS
196.RS
197.nf
198.sp
199..
200'\" # DE - end display
201.de DE
202.fi
203.RE
204.sp
205..
206'\" # SO - start of list of standard options
207.de SO
208.SH "STANDARD OPTIONS"
209.LP
210.nf
211.ta 5.5c 11c
212.ft B
213..
214'\" # SE - end of list of standard options
215.de SE
216.fi
217.ft R
218.LP
219See the \\fBoptions\\fR manual entry for details on the standard options.
220..
221'\" # OP - start of full description for a single option
222.de OP
223.LP
224.nf
225.ta 4c
226Command-Line Name: \\fB\\$1\\fR
227Database Name: \\fB\\$2\\fR
228Database Class: \\fB\\$3\\fR
229.fi
230.IP
231..
232'\" # CS - begin code excerpt
233.de CS
234.RS
235.nf
236.ta .25i .5i .75i 1i
237..
238'\" # CE - end code excerpt
239.de CE
240.fi
241.RE
242..
243.de UL
244\\$1\l'|0\(ul'\\$2
245..
246.TH Threads 3 "8.1" Tcl "Tcl Library Procedures"
247.BS
248.SH NAME
249Tcl_ConditionNotify, Tcl_ConditionWait, Tcl_ConditionFinalize, Tcl_GetThreadData, Tcl_MutexLock, Tcl_MutexUnlock, Tcl_MutexFinalize, Tcl_CreateThread, Tcl_JoinThread \- Tcl thread support.
250.SH SYNOPSIS
251.nf
252\fB#include <tcl.h>\fR
253.sp
254void
255\fBTcl_ConditionNotify\fR(\fIcondPtr\fR)
256.sp
257void
258\fBTcl_ConditionWait\fR(\fIcondPtr, mutexPtr, timePtr\fR)
259.sp
260void
261\fBTcl_ConditionFinalize\fR(\fIcondPtr\fR)
262.sp
263Void *
264\fBTcl_GetThreadData\fR(\fIkeyPtr, size\fR)
265.sp
266void
267\fBTcl_MutexLock\fR(\fImutexPtr\fR)
268.sp
269void
270\fBTcl_MutexUnlock\fR(\fImutexPtr\fR)
271.sp
272void
273\fBTcl_MutexFinalize\fR(\fImutexPtr\fR)
274.sp
275int
276\fBTcl_CreateThread\fR(\fIidPtr, threadProc, clientData, stackSize, flags\fR)
277.sp
278int
279\fBTcl_JoinThread\fR(\fIid, result\fR)
280.SH ARGUMENTS
281.AS Tcl_ThreadDataKey *keyPtr
282.AP Tcl_Condition *condPtr in
283A condition variable, which must be associated with a mutex lock.
284.AP Tcl_Mutex *mutexPtr in
285A mutex lock.
286.AP Tcl_Time *timePtr in
287A time limit on the condition wait. NULL to wait forever.
288Note that a polling value of 0 seconds doesn't make much sense.
289.AP Tcl_ThreadDataKey *keyPtr in
290This identifies a block of thread local storage. The key should be
291static and process-wide, yet each thread will end up associating
292a different block of storage with this key.
293.AP int *size in
294The size of the thread local storage block. This amount of data
295is allocated and initialized to zero the first time each thread
296calls \fBTcl_GetThreadData\fR.
297.AP Tcl_ThreadId *idPtr out
298The referred storage will contain the id of the newly created thread as
299returned by the operating system.
300.AP Tcl_ThreadId id in
301Id of the thread waited upon.
302.AP Tcl_ThreadCreateProc threadProc in
303This procedure will act as the \fBmain()\fR of the newly created
304thread. The specified \fIclientData\fR will be its sole argument.
305.AP ClientData clientData in
306Arbitrary information. Passed as sole argument to the \fIthreadProc\fR.
307.AP int stackSize in
308The size of the stack given to the new thread.
309.AP int flags in
310Bitmask containing flags allowing the caller to modify behaviour of
311the new thread.
312.AP int *result out
313The referred storage is used to place the exit code of the thread
314waited upon into it.
315.BE
316.SH INTRODUCTION
317Beginning with the 8.1 release, the Tcl core is thread safe, which
318allows you to incorporate Tcl into multithreaded applications without
319customizing the Tcl core. To enable Tcl multithreading support,
320you must include the \fB--enable-threads\fR option to \fBconfigure\fR
321when you configure and compile your Tcl core.
322.PP
323An important constraint of the Tcl threads implementation is that
324\fIonly the thread that created a Tcl interpreter can use that
325interpreter\fR. In other words, multiple threads can not access
326the same Tcl interpreter. (However, as was the case in previous
327releases, a single thread can safely create and use multiple
328interpreters.)
329.PP
330.VS 8.3.1
331Tcl does provide \fBTcl_CreateThread\fR for creating threads. The
332caller can determine the size of the stack given to the new thread and
333modify the behaviour through the supplied \fIflags\fR. The value
334\fBTCL_THREAD_STACK_DEFAULT\fR for the \fIstackSize\fR indicates that
335the default size as specified by the operating system is to be used
336for the new thread. As for the flags, currently are only the values
337\fBTCL_THREAD_NOFLAGS\fR and \fBTCL_THREAD_JOINABLE\fR defined. The
338first of them invokes the default behaviour with no
339specialties. Using the second value marks the new thread as
340\fIjoinable\fR. This means that another thread can wait for the such
341marked thread to exit and join it.
342.PP
343Restrictions: On some unix systems the pthread-library does not
344contain the functionality to specify the stacksize of a thread. The
345specified value for the stacksize is ignored on these systems. Both
346Windows and Macintosh currently do not support joinable threads. This
347flag value is therefore ignored on these platforms.
348.VE
349.PP
350Tcl does provide \fBTcl_ExitThread\fR and \fBTcl_FinalizeThread\fR
351for terminating threads and invoking optional per-thread exit
352handlers. See the \fBTcl_Exit\fR page for more information on these
353procedures.
354.PP
355.VS
356The \fBTcl_JoinThread\fR function is provided to allow threads to wait
357upon the exit of another thread, which must have been marked as
358joinable through usage of the \fBTCL_THREAD_JOINABLE\fR-flag during
359its creation via \fBTcl_CreateThread\fR.
360.PP
361Trying to wait for the exit of a non-joinable thread or a thread which
362is already waited upon will result in an error. Waiting for a joinable
363thread which already exited is possible, the system will retain the
364necessary information until after the call to \fBTcl_JoinThread\fR.
365This means that not calling \fBTcl_JoinThread\fR for a joinable thread
366will cause a memory leak.
367.VE
368.PP
369Tcl provides \fBTcl_ThreadQueueEvent\fR and \fBTcl_ThreadAlert\fR
370for handling event queueing in multithreaded applications. See
371the \fBNotifier\fR manual page for more information on these procedures.
372.PP
373In this release, the Tcl language itself provides no support for
374creating multithreaded scripts (for example, scripts that could spawn
375a Tcl interpreter in a separate thread). If you need to add this
376feature at this time, see the \fItclThreadTest.c\fR
377file in the Tcl source distribution for an experimental implementation
378or use the Tcl "Threading Extension" package implementing thread creation
379and management commands at the script level.
380
381
382.SH DESCRIPTION
383A mutex is a lock that is used to serialize all threads through a piece
384of code by calling \fBTcl_MutexLock\fR and \fBTcl_MutexUnlock\fR.
385If one thread holds a mutex, any other thread calling \fBTcl_MutexLock\fR will
386block until \fBTcl_MutexUnlock\fR is called.
387.VS
388A mutex can be destroyed after its use by calling \fBTcl_MutexFinalize\fR.
389The result of locking a mutex twice from the same thread is undefined.
390On some platforms it will result in a deadlock.
391.VE
392The \fBTcl_MutexLock\fR, \fBTcl_MutexUnlock\fR and \fBTcl_MutexFinalize\fR
393procedures are defined as empty macros if not compiling with threads enabled.
394For declaration of mutexes the \fBTCL_DECLARE_MUTEX\fR macro should be used.
395This macro assures correct mutex handling even when the core is compiled
396without threads enabled.
397.PP
398A condition variable is used as a signaling mechanism:
399a thread can lock a mutex and then wait on a condition variable
400with \fBTcl_ConditionWait\fR. This atomically releases the mutex lock
401and blocks the waiting thread until another thread calls
402\fBTcl_ConditionNotify\fR. The caller of \fBTcl_ConditionNotify\fR should
403have the associated mutex held by previously calling \fBTcl_MutexLock\fR,
404but this is not enforced. Notifying the
405condition variable unblocks all threads waiting on the condition variable,
406but they do not proceed until the mutex is released with \fBTcl_MutexUnlock\fR.
407The implementation of \fBTcl_ConditionWait\fR automatically locks
408the mutex before returning.
409.PP
410The caller of \fBTcl_ConditionWait\fR should be prepared for spurious
411notifications by calling \fBTcl_ConditionWait\fR within a while loop
412that tests some invariant.
413.PP
414.VS
415A condition variable can be destroyed after its use by calling
416\fBTcl_ConditionFinalize\fR.
417.PP
418The \fBTcl_ConditionNotify\fR, \fBTcl_ConditionWait\fR and
419\fBTcl_ConditionFinalize\fR procedures are defined as empty macros if
420not compiling with threads enabled.
421.VE
422.PP
423The \fBTcl_GetThreadData\fR call returns a pointer to a block of
424thread-private data. Its argument is a key that is shared by all threads
425and a size for the block of storage. The storage is automatically
426allocated and initialized to all zeros the first time each thread asks for it.
427The storage is automatically deallocated by \fBTcl_FinalizeThread\fR.
428.SH INITIALIZATION
429.PP
430All of these synchronization objects are self initializing.
431They are implemented as opaque pointers that should be NULL
432upon first use.
433The mutexes and condition variables are
434.VS
435either cleaned up by process exit handlers (if living that long) or
436explicitly by calls to \fBTcl_MutexFinalize\fR or
437\fBTcl_ConditionFinalize\fR.
438.VE
439Thread local storage is reclaimed during \fBTcl_FinalizeThread\fR.
440.SH "CREATING THREADS"
441The API to create threads is not finalized at this time.
442There are private facilities to create threads that contain a new
443Tcl interpreter, and to send scripts among threads.
444Dive into tclThreadTest.c and tclThread.c for examples.
445.SH "SEE ALSO"
446Tcl_GetCurrentThread, Tcl_ThreadQueueEvent, Tcl_ThreadAlert,
447Tcl_ExitThread, Tcl_FinalizeThread,
448Tcl_CreateThreadExitHandler, Tcl_DeleteThreadExitHandler
449.SH KEYWORDS
450thread, mutex, condition variable, thread local storage