1 /*
2 * pte_threadDestroy.c
3 *
4 * Description:
5 * This translation unit implements routines which are private to
6 * the implementation and may be used throughout it.
7 *
8 * --------------------------------------------------------------------------
9 *
10 * Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
11 * Copyright(C) 2008 Jason Schmidlapp
12 *
13 * Contact Email: jschmidlapp@users.sourceforge.net
14 *
15 *
16 * Based upon Pthreads-win32 - POSIX Threads Library for Win32
17 * Copyright(C) 1998 John E. Bossom
18 * Copyright(C) 1999,2005 Pthreads-win32 contributors
19 *
20 * Contact Email: rpj@callisto.canberra.edu.au
21 *
22 * The original list of contributors to the Pthreads-win32 project
23 * is contained in the file CONTRIBUTORS.ptw32 included with the
24 * source code distribution. The list can also be seen at the
25 * following World Wide Web location:
26 * http://sources.redhat.com/pthreads-win32/contributors.html
27 *
28 * This library is free software; you can redistribute it and/or
29 * modify it under the terms of the GNU Lesser General Public
30 * License as published by the Free Software Foundation; either
31 * version 2 of the License, or (at your option) any later version.
32 *
33 * This library is distributed in the hope that it will be useful,
34 * but WITHOUT ANY WARRANTY; without even the implied warranty of
35 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
36 * Lesser General Public License for more details.
37 *
38 * You should have received a copy of the GNU Lesser General Public
39 * License along with this library in the file COPYING.LIB;
40 * if not, write to the Free Software Foundation, Inc.,
41 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
42 */
43
44 #include <stdio.h>
45 #include <stdlib.h>
46 #include <string.h>
47
48 #include "pthread.h"
49 #include "implement.h"
50
51
52
53 static void
pte_threadDestroyCommon(pthread_t thread,unsigned char shouldThreadExit)54 pte_threadDestroyCommon (pthread_t thread, unsigned char shouldThreadExit)
55 {
56 pte_thread_t * tp = (pte_thread_t *) thread;
57 pte_thread_t threadCopy;
58
59 if (tp != NULL)
60 {
61 /*
62 * Copy thread state so that the thread can be atomically NULLed.
63 */
64 memcpy (&threadCopy, tp, sizeof (threadCopy));
65
66 /*
67 * Thread ID structs are never freed. They're NULLed and reused.
68 * This also sets the thread to PThreadStateInitial (invalid).
69 */
70 pte_threadReusePush (thread);
71
72 (void) pthread_mutex_destroy(&threadCopy.cancelLock);
73 (void) pthread_mutex_destroy(&threadCopy.threadLock);
74
75 if (threadCopy.threadId != 0)
76 {
77 if (shouldThreadExit)
78 {
79 pte_osThreadExitAndDelete(threadCopy.threadId);
80 }
81 else
82 {
83 pte_osThreadDelete(threadCopy.threadId);
84 }
85 }
86
87
88
89 }
90 } /* pte_threadDestroy */
91
pte_threadDestroy(pthread_t thread)92 void pte_threadDestroy (pthread_t thread)
93 {
94 pte_threadDestroyCommon(thread,0);
95 }
96
pte_threadExitAndDestroy(pthread_t thread)97 void pte_threadExitAndDestroy (pthread_t thread)
98 {
99 pte_threadDestroyCommon(thread,1);
100 }
101