source: rtems/doc/posix_users/thread.texi @ 1e524995

4.104.114.84.95
Last change on this file since 1e524995 was 1e524995, checked in by Joel Sherrill <joel.sherrill@…>, on Feb 6, 1998 at 2:14:30 PM

Updated copyrights

  • Property mode set to 100644
File size: 19.8 KB
Line 
1@c
2@c  COPYRIGHT (c) 1988-1998.
3@c  On-Line Applications Research Corporation (OAR).
4@c  All rights reserved.
5@c
6@c  $Id$
7@c
8
9@ifinfo
10@node Thread Manager, Thread Manager Introduction, Preface, Top
11@end ifinfo
12@chapter Thread Manager
13@ifinfo
14@menu
15* Thread Manager Introduction::
16* Thread Manager Background::
17* Thread Manager Operations::
18* Thread Manager Directives::
19@end menu
20@end ifinfo
21
22@ifinfo
23@node Thread Manager Introduction, Thread Manager Background, Thread Manager, Thread Manager
24@end ifinfo
25@section Introduction
26
27The thread manager ...
28
29The directives provided by the thread manager are:
30
31@itemize @bullet
32@item @code{pthread_attr_init} -
33@item @code{pthread_attr_destroy} -
34@item @code{pthread_attr_setdetachstate} -
35@item @code{pthread_attr_getdetachstate} -
36@item @code{pthread_attr_setstacksize} -
37@item @code{pthread_attr_getstacksize} -
38@item @code{pthread_attr_setstackaddr} -
39@item @code{pthread_attr_getstackaddr} -
40@item @code{pthread_attr_setscope} -
41@item @code{pthread_attr_getscope} -
42@item @code{pthread_attr_setinheritsched} -
43@item @code{pthread_attr_getinheritsched} -
44@item @code{pthread_attr_setschedpolicy} -
45@item @code{pthread_attr_getschedpolicy} -
46@item @code{pthread_attr_setschedparam} -
47@item @code{pthread_attr_getschedparam} -
48@item @code{pthread_create} -
49@item @code{pthread_exit} -
50@item @code{pthread_detach} -
51@item @code{pthread_join} -
52@item @code{pthread_self} -
53@item @code{pthread_equal} -
54@item @code{pthread_once} -
55@item @code{pthread_setschedparam} -
56@item @code{pthread_getschedparam} -
57@end itemize
58
59@ifinfo
60@node Thread Manager Background, Thread Attributes, Thread Manager Introduction, Thread Manager
61@end ifinfo
62@section Background
63@ifinfo
64@menu
65* Thread Attributes::
66@end menu
67@end ifinfo
68
69@ifinfo
70@node Thread Attributes, Thread Manager Operations, Thread Manager Background, Thread Manager Background
71@end ifinfo
72@subsection Thread Attributes
73
74Thread attributes are utilized only at thread creation time.
75
76@table @b
77@item stack address
78is the address of the optionally user specified stack area for this thread.
79If this value is NULL, then RTEMS allocates the memory for the thread stack
80from the RTEMS Workspace Area.  Otherwise, this is the user specified
81address for the memory to be used for the thread's stack.  Each thread must
82have a distinct stack area.  Each processor family has different alignment
83rules which should be followed.
84
85@item stack size
86is the minimum desired size for this thread's stack area.
87If the size of this area as specified by the stack size attribute
88is smaller than the minimum for this processor family and the stack
89is not user specified, then RTEMS will automatically allocate a
90stack of the minimum size for this processor family.
91
92@item contention scope
93specifies the scheduling contention scope.  RTEMS only supports the
94PTHREAD_SCOPE_PROCESS scheduling contention scope.
95
96@item scheduling inheritance
97specifies whether a user specified or the scheduling policy and
98parameters of the currently executing thread are to be used.  When
99this is PTHREAD_INHERIT_SCHED, then the scheduling policy and
100parameters of the currently executing thread are inherited by
101the newly created thread.
102
103@item scheduling policy and parameters
104specify the manner in which the thread will contend for the processor.
105The scheduling parameters are interpreted based on the specified policy.
106All policies utilize the thread priority parameter.
107
108@end table
109
110@ifinfo
111@node Thread Manager Operations, Thread Manager Directives, Thread Attributes, Thread Manager
112@end ifinfo
113@section Operations
114
115@ifinfo
116@node Thread Manager Directives, pthread_attr_init, Thread Manager Operations, Thread Manager
117@end ifinfo
118@section Directives
119@ifinfo
120@menu
121* pthread_attr_init::
122* pthread_attr_destroy::
123* pthread_attr_setdetachstate::
124* pthread_attr_getdetachstate::
125* pthread_attr_setstacksize::
126* pthread_attr_getstacksize::
127* pthread_attr_setstackaddr::
128* pthread_attr_getstackaddr::
129* pthread_attr_setscope::
130* pthread_attr_getscope::
131* pthread_attr_setinheritsched::
132* pthread_attr_getinheritsched::
133* pthread_attr_setschedpolicy::
134* pthread_attr_getschedpolicy::
135* pthread_attr_setschedparam::
136* pthread_attr_getschedparam::
137* pthread_create::
138* pthread_exit::
139* pthread_detach::
140* pthread_join::
141* pthread_self::
142* pthread_equal::
143* pthread_once::
144* pthread_setschedparam::
145* pthread_getschedparam::
146@end menu
147@end ifinfo
148
149This section details the thread manager's directives.
150A subsection is dedicated to each of this manager's directives
151and describes the calling sequence, related constants, usage,
152and status codes.
153
154@page
155@ifinfo
156@node pthread_attr_init, pthread_attr_destroy, Thread Manager Directives, Thread Manager Directives
157@end ifinfo
158@subsection pthread_attr_init
159
160@subheading CALLING SEQUENCE:
161
162
163@example
164#include <pthread.h>
165
166int pthread_attr_init(
167  pthread_attr_t  *attr
168);
169@end example
170
171@subheading STATUS CODES:
172
173@table @b
174@item EINVAL
175The attribute pointer argument is invalid.
176
177@end table
178
179@subheading DESCRIPTION:
180
181@subheading NOTES:
182
183@page
184@ifinfo
185@node pthread_attr_destroy, pthread_attr_setdetachstate, pthread_attr_init, Thread Manager Directives
186@end ifinfo
187@subsection pthread_attr_destroy
188
189@subheading CALLING SEQUENCE:
190
191@example
192#include <pthread.h>
193 
194int pthread_attr_destroy(
195  pthread_attr_t  *attr
196);
197@end example
198
199@subheading STATUS CODES:
200 
201@table @b
202@item EINVAL
203The attribute pointer argument is invalid.
204
205@item EINVAL
206The attribute set is not initialized.
207 
208@end table
209 
210@subheading DESCRIPTION:
211
212@subheading NOTES:
213
214@page
215@ifinfo
216@node pthread_attr_setdetachstate, pthread_attr_getdetachstate, pthread_attr_destroy, Thread Manager Directives
217@end ifinfo
218@subsection pthread_attr_setdetachstate
219
220@subheading CALLING SEQUENCE:
221
222@example
223#include <pthread.h>
224 
225int pthread_attr_setdetachstate(
226  pthread_attr_t  *attr,
227  int              detachstate
228);
229@end example
230
231@subheading STATUS CODES:
232 
233@table @b
234@item EINVAL
235The attribute pointer argument is invalid.
236
237@item EINVAL
238The attribute set is not initialized.
239 
240@item EINVAL
241The detachstate argument is invalid.
242 
243@end table
244
245@subheading DESCRIPTION:
246
247@subheading NOTES:
248
249@page
250@ifinfo
251@node pthread_attr_getdetachstate, pthread_attr_setstacksize, pthread_attr_setdetachstate, Thread Manager Directives
252@end ifinfo
253@subsection pthread_attr_getdetachstate
254
255@subheading CALLING SEQUENCE:
256
257@example
258#include <pthread.h>
259 
260int pthread_attr_getdetachstate(
261  const pthread_attr_t  *attr,
262  int                   *detachstate
263);
264@end example
265
266@subheading STATUS CODES:
267 
268@table @b
269@item EINVAL
270The attribute pointer argument is invalid.
271
272@item EINVAL
273The attribute set is not initialized.
274 
275@item EINVAL
276The detatchstate pointer argument is invalid.
277
278@end table
279 
280@subheading DESCRIPTION:
281
282@subheading NOTES:
283
284@page
285@ifinfo
286@node pthread_attr_setstacksize, pthread_attr_getstacksize, pthread_attr_getdetachstate, Thread Manager Directives
287@end ifinfo
288@subsection pthread_attr_setstacksize
289
290@subheading CALLING SEQUENCE:
291
292@example
293#include <pthread.h>
294 
295int pthread_attr_setstacksize(
296  pthread_attr_t  *attr,
297  size_t           stacksize
298);
299@end example
300
301@subheading STATUS CODES:
302 
303@table @b
304@item EINVAL
305The attribute pointer argument is invalid.
306
307@item EINVAL
308The attribute set is not initialized.
309 
310@end table
311 
312@subheading DESCRIPTION:
313
314@subheading NOTES:
315
316If the specified stacksize is below the minimum required for this CPU, then
317the stacksize will be set to the minimum for this CPU.
318
319@page
320@ifinfo
321@node pthread_attr_getstacksize, pthread_attr_setstackaddr, pthread_attr_setstacksize, Thread Manager Directives
322@end ifinfo
323@subsection pthread_attr_getstacksize
324
325@subheading CALLING SEQUENCE:
326
327@example
328#include <pthread.h>
329
330int pthread_attr_getstacksize(
331  const pthread_attr_t  *attr,
332  size_t                *stacksize
333);
334@end example
335
336@subheading STATUS CODES:
337 
338@table @b
339@item EINVAL
340The attribute pointer argument is invalid.
341
342@item EINVAL
343The attribute set is not initialized.
344 
345@item EINVAL
346The stacksize pointer argument is invalid.
347
348@end table
349 
350@subheading DESCRIPTION:
351
352@subheading NOTES:
353
354@page
355@ifinfo
356@node pthread_attr_setstackaddr, pthread_attr_getstackaddr, pthread_attr_getstacksize, Thread Manager Directives
357@end ifinfo
358@subsection pthread_attr_setstackaddr
359
360@subheading CALLING SEQUENCE:
361
362@example
363#include <pthread.h>
364 
365int pthread_attr_setstackaddr(
366  pthread_attr_t  *attr,
367  void            *stackaddr
368);
369@end example
370
371@subheading STATUS CODES:
372 
373@table @b
374@item EINVAL
375The attribute pointer argument is invalid.
376
377@item EINVAL
378The attribute set is not initialized.
379
380@end table
381 
382@subheading DESCRIPTION:
383
384@subheading NOTES:
385
386@page
387@ifinfo
388@node pthread_attr_getstackaddr, pthread_attr_setscope, pthread_attr_setstackaddr, Thread Manager Directives
389@end ifinfo
390@subsection pthread_attr_getstackaddr
391
392@subheading CALLING SEQUENCE:
393
394@example
395#include <pthread.h>
396
397int pthread_attr_getstackaddr(
398  const pthread_attr_t  *attr,
399  void                 **stackaddr
400);
401@end example
402
403@subheading STATUS CODES:
404 
405@table @b
406@item EINVAL
407The attribute pointer argument is invalid.
408
409@item EINVAL
410The attribute set is not initialized.
411 
412@item EINVAL
413The stackaddr pointer argument is invalid.
414
415@end table
416 
417@subheading DESCRIPTION:
418
419@subheading NOTES:
420
421@page
422@ifinfo
423@node pthread_attr_setscope, pthread_attr_getscope, pthread_attr_getstackaddr, Thread Manager Directives
424@end ifinfo
425@subsection pthread_attr_setscope
426
427@subheading CALLING SEQUENCE:
428
429@example
430#include <pthread.h>
431
432int pthread_attr_setscope(
433  pthread_attr_t  *attr,
434  int              contentionscope
435);
436@end example
437
438@subheading STATUS CODES:
439
440@table @b
441@item EINVAL
442The attribute pointer argument is invalid.
443
444@item EINVAL
445The attribute set is not initialized.
446
447@item EINVAL
448The contention scope specified is not valid.
449
450@item ENOTSUP
451The contention scope specified (PTHREAD_SCOPE_SYSTEM) is not supported.
452
453@end table
454
455@subheading DESCRIPTION:
456
457@subheading NOTES:
458
459@page
460@ifinfo
461@node pthread_attr_getscope, pthread_attr_setinheritsched, pthread_attr_setscope, Thread Manager Directives
462@end ifinfo
463@subsection pthread_attr_getscope
464
465@subheading CALLING SEQUENCE:
466
467@example
468#include <pthread.h>
469
470int pthread_attr_getscope(
471  const pthread_attr_t  *attr,
472  int                   *contentionscope
473);
474@end example
475
476@subheading STATUS CODES:
477
478@table @b
479@item EINVAL
480The attribute pointer argument is invalid.
481
482@item EINVAL
483The attribute set is not initialized.
484
485@item EINVAL
486The contentionscope pointer argument is invalid.
487
488@end table
489
490@subheading DESCRIPTION:
491
492@subheading NOTES:
493
494@page
495@ifinfo
496@node pthread_attr_setinheritsched, pthread_attr_getinheritsched, pthread_attr_getscope, Thread Manager Directives
497@end ifinfo
498@subsection pthread_attr_setinheritsched
499
500@subheading CALLING SEQUENCE:
501
502@example
503#include <pthread.h>
504
505int pthread_attr_setinheritsched(
506  pthread_attr_t  *attr,
507  int              inheritsched
508);
509@end example
510
511@subheading STATUS CODES:
512
513@table @b
514@item EINVAL
515The attribute pointer argument is invalid.
516
517@item EINVAL
518The attribute set is not initialized.
519
520@item EINVAL
521The specified scheduler inheritance argument is invalid.
522
523@end table
524
525@subheading DESCRIPTION:
526
527@subheading NOTES:
528
529@page
530@ifinfo
531@node pthread_attr_getinheritsched, pthread_attr_setschedpolicy, pthread_attr_setinheritsched, Thread Manager Directives
532@end ifinfo
533@subsection pthread_attr_getinheritsched
534
535@subheading CALLING SEQUENCE:
536
537@example
538#include <pthread.h>
539
540int pthread_attr_getinheritsched(
541  const pthread_attr_t  *attr,
542  int                   *inheritsched
543);
544@end example
545
546@subheading STATUS CODES:
547@table @b
548@item EINVAL
549The attribute pointer argument is invalid.
550
551@item EINVAL
552The attribute set is not initialized.
553
554@item EINVAL
555The inheritsched pointer argument is invalid.
556
557@end table
558
559@subheading DESCRIPTION:
560
561@subheading NOTES:
562
563@page
564@ifinfo
565@node pthread_attr_setschedpolicy, pthread_attr_getschedpolicy, pthread_attr_getinheritsched, Thread Manager Directives
566@end ifinfo
567@subsection pthread_attr_setschedpolicy
568
569@subheading CALLING SEQUENCE:
570
571@example
572#include <pthread.h>
573
574int pthread_attr_setschedpolicy(
575  pthread_attr_t  *attr,
576  int              policy
577);
578@end example
579
580@subheading STATUS CODES:
581@table @b
582@item EINVAL
583The attribute pointer argument is invalid.
584
585@item EINVAL
586The attribute set is not initialized.
587 
588@item ENOTSUP
589The specified scheduler policy argument is invalid.
590
591@end table
592
593@subheading DESCRIPTION:
594
595@subheading NOTES:
596
597@page
598@ifinfo
599@node pthread_attr_getschedpolicy, pthread_attr_setschedparam, pthread_attr_setschedpolicy, Thread Manager Directives
600@end ifinfo
601@subsection pthread_attr_getschedpolicy
602
603@subheading CALLING SEQUENCE:
604
605@example
606#include <pthread.h>
607
608int pthread_attr_getschedpolicy(
609  const pthread_attr_t  *attr,
610  int                   *policy
611);
612@end example
613
614@subheading STATUS CODES:
615@table @b
616@item EINVAL
617The attribute pointer argument is invalid.
618
619@item EINVAL
620The attribute set is not initialized.
621
622@item EINVAL
623The specified scheduler policy argument pointer is invalid.
624
625@end table
626
627@subheading DESCRIPTION:
628
629@subheading NOTES:
630
631@page
632@ifinfo
633@node pthread_attr_setschedparam, pthread_attr_getschedparam, pthread_attr_getschedpolicy, Thread Manager Directives
634@end ifinfo
635@subsection pthread_attr_setschedparam
636
637@subheading CALLING SEQUENCE:
638
639@example
640#include <pthread.h>
641
642int pthread_attr_setschedparam(
643  pthread_attr_t            *attr,
644  const struct sched_param   param
645);
646@end example
647
648@subheading STATUS CODES:
649@table @b
650@item EINVAL
651The attribute pointer argument is invalid.
652
653@item EINVAL
654The attribute set is not initialized.
655 
656@item EINVAL
657The specified scheduler parameter argument is invalid.
658
659@end table
660
661@subheading DESCRIPTION:
662
663@subheading NOTES:
664
665@page
666@ifinfo
667@node pthread_attr_getschedparam, pthread_create, pthread_attr_setschedparam, Thread Manager Directives
668@end ifinfo
669@subsection pthread_attr_getschedparam
670
671@subheading CALLING SEQUENCE:
672
673@example
674#include <pthread.h>
675
676int pthread_attr_getschedparam(
677  const pthread_attr_t  *attr,
678  struct sched_param    *param
679);
680@end example
681
682@subheading STATUS CODES:
683@table @b
684@item EINVAL
685The attribute pointer argument is invalid.
686
687@item EINVAL
688The attribute set is not initialized.
689
690@item EINVAL
691The specified scheduler parameter argument pointer is invalid.
692
693@end table
694
695@subheading DESCRIPTION:
696
697@subheading NOTES:
698
699@page
700@ifinfo
701@node pthread_create, pthread_exit, pthread_attr_getschedparam, Thread Manager Directives
702@end ifinfo
703@subsection pthread_create
704
705@subheading CALLING SEQUENCE:
706
707@example
708#include <pthread.h>
709
710int pthread_create(
711  pthread_t             *thread,
712  const pthread_attr_t  *attr,
713  void                 (*start_routine)( void * ),
714  void                  *arg
715);
716@end example
717
718@subheading STATUS CODES:
719
720@table @b
721
722@item EINVAL
723The attribute set is not initialized.
724
725@item EINVAL
726The user specified a stack address and the size of the area was not
727large enough to meet this processor's minimum stack requirements.
728
729@item EINVAL
730The specified scheduler inheritance policy was invalid.
731
732@item ENOTSUP
733The specified contention scope was PTHREAD_SCOPE_PROCESS.
734
735@item EINVAL
736The specified thread priority was invalid.
737
738@item EINVAL
739The specified scheduling policy was invalid.
740
741@item EINVAL
742The scheduling policy was SCHED_SPORADIC and the specified replenishment
743period is less than the initial budget.
744
745@item EINVAL
746The scheduling policy was SCHED_SPORADIC and the specified low priority
747is invalid.
748
749@item EAGAIN
750The system lacked the necessary resources to create another thread, or the
751self imposed limit on the total number of threads in a process
752PTHREAD_THREAD_MAX would be exceeded.
753 
754@item EINVAL
755Invalid argument passed.
756
757@end table
758 
759@subheading DESCRIPTION:
760
761@subheading NOTES:
762
763@page
764@ifinfo
765@node pthread_exit, pthread_detach, pthread_create, Thread Manager Directives
766@end ifinfo
767@subsection pthread_exit
768
769@subheading CALLING SEQUENCE:
770
771@example
772#include <pthread.h>
773
774void pthread_exit(
775  void   *status
776);
777@end example
778
779@subheading STATUS CODES:
780@table @b
781@item NONE
782 
783@end table
784
785@subheading DESCRIPTION:
786
787@subheading NOTES:
788
789@page
790@ifinfo
791@node pthread_detach, pthread_join, pthread_exit, Thread Manager Directives
792@end ifinfo
793@subsection pthread_detach
794
795@subheading CALLING SEQUENCE:
796
797@example
798#include <pthread.h>
799
800int pthread_detach(
801  pthread_t   thread
802);
803@end example
804
805@subheading STATUS CODES:
806@table @b
807@item ESRCH
808The thread specified is invalid.
809 
810@item EINVAL
811The thread specified is not a joinable thread.
812 
813@end table
814
815@subheading DESCRIPTION:
816
817@subheading NOTES:
818
819If any threads have previously joined with the specified thread, then they
820will remain joined with that thread.  Any subsequent calls to pthread_join
821on the specified thread will fail.
822
823@page
824@ifinfo
825@node pthread_join, pthread_self, pthread_detach, Thread Manager Directives
826@end ifinfo
827@subsection pthread_join
828
829@subheading CALLING SEQUENCE:
830
831@example
832#include <pthread.h>
833
834int pthread_join(
835  pthread_t   thread,
836  void      **value_ptr
837);
838@end example
839
840@subheading STATUS CODES:
841@table @b
842@item ESRCH
843The thread specified is invalid.
844 
845@item EINVAL
846The thread specified is not a joinable thread.
847 
848@item EDEADLK
849A deadlock was detected or thread is the calling thread.
850 
851@end table
852
853@subheading DESCRIPTION:
854
855@subheading NOTES:
856
857If any threads have previously joined with the specified thread, then they
858will remain joined with that thread.  Any subsequent calls to pthread_join
859on the specified thread will fail.
860
861If value_ptr is NULL, then no value is returned.
862
863@page
864@ifinfo
865@node pthread_self, pthread_equal, pthread_join, Thread Manager Directives
866@end ifinfo
867@subsection pthread_self
868
869@subheading CALLING SEQUENCE:
870
871@example
872#include <pthread.h>
873
874pthread_t pthread_self( void );
875@end example
876
877@subheading STATUS CODES:
878
879This routine returns the id of the calling thread.
880
881@subheading DESCRIPTION:
882
883@subheading NOTES:
884
885@page
886@ifinfo
887@node pthread_equal, pthread_once, pthread_self, Thread Manager Directives
888@end ifinfo
889@subsection pthread_equal
890
891@subheading CALLING SEQUENCE:
892
893@example
894#include <pthread.h>
895
896int pthread_equal(
897  pthread_t  t1,
898  pthread_t  t2
899);
900@end example
901
902@subheading STATUS CODES:
903
904@table @b
905@item zero
906The thread ids are not equal.
907 
908@item non-zero
909The thread ids are equal.
910 
911@end table
912
913@subheading DESCRIPTION:
914
915@subheading NOTES:
916
917The behavior is undefined if the thread IDs are not valid.
918
919@page
920@ifinfo
921@node pthread_once, pthread_setschedparam, pthread_equal, Thread Manager Directives
922@end ifinfo
923@subsection pthread_once
924
925@subheading CALLING SEQUENCE:
926
927@example
928#include <pthread.h>
929
930pthread_once_t once_control = PTHREAD_ONCE_INIT;
931
932int pthread_once(
933  pthread_once_t  *once_control,
934  void           (*init_routine)(void)
935);
936@end example
937
938@subheading STATUS CODES:
939
940NONE
941
942@subheading DESCRIPTION:
943
944@subheading NOTES:
945
946@page
947@ifinfo
948@node pthread_setschedparam, pthread_getschedparam, pthread_once, Thread Manager Directives
949@end ifinfo
950@subsection pthread_setschedparam
951
952@subheading CALLING SEQUENCE:
953
954@example
955#include <pthread.h>
956
957int pthread_setschedparam(
958  pthread_t           thread,
959  int                 policy,
960  struct sched_param *param
961);
962@end example
963
964@subheading STATUS CODES:
965
966@table @b
967@item EINVAL
968The scheduling parameters indicated by the parameter param is invalid.
969
970@item EINVAL
971The value specified by policy is invalid.
972
973@item EINVAL
974The scheduling policy was SCHED_SPORADIC and the specified replenishment
975period is less than the initial budget.
976
977@item EINVAL
978The scheduling policy was SCHED_SPORADIC and the specified low priority
979is invalid.
980
981@item ESRCH
982The thread indicated was invalid.
983
984@end table
985
986@subheading DESCRIPTION:
987
988@subheading NOTES:
989
990@page
991@ifinfo
992@node pthread_getschedparam, Signal Manager, pthread_setschedparam, Thread Manager Directives
993@end ifinfo
994@subsection pthread_getschedparam
995
996@subheading CALLING SEQUENCE:
997
998@example
999#include <pthread.h>
1000
1001int pthread_getschedparam(
1002  pthread_t           thread,
1003  int                *policy,
1004  struct sched_param *param
1005);
1006@end example
1007
1008@subheading STATUS CODES:
1009 
1010@table @b
1011@item EINVAL
1012The policy pointer argument is invalid.
1013
1014@item EINVAL
1015The scheduling parameters pointer argument is invalid.
1016
1017@item ESRCH
1018The thread indicated by the parameter thread is invalid.
1019 
1020@end table
1021
1022@subheading DESCRIPTION:
1023
1024@subheading NOTES:
1025
Note: See TracBrowser for help on using the repository browser.