Cleanup the TLS implementation:
[dragonfly.git] / lib / libthread_xu / arch / amd64 / amd64 / pthread_md.c
CommitLineData
71b3fa15
DX
1/*
2 * Copyright (c) 2003 Daniel Eischen <deischen@freebsd.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Neither the name of the author nor the names of its contributors
12 * may be used to endorse or promote products derived from this software
13 * without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 *
26 * $FreeBSD: src/lib/libpthread/arch/amd64/amd64/pthread_md.c,v 1.4 2004/11/06 03:33:19 peter Exp $
9e2ee207 27 * $DragonFly: src/lib/libthread_xu/arch/amd64/amd64/pthread_md.c,v 1.3 2005/03/29 19:26:20 joerg Exp $
71b3fa15
DX
28 */
29
30#include <stdlib.h>
31#include <strings.h>
32#include "rtld_tls.h"
33#include "pthread_md.h"
34
35/*
36 * The constructors.
37 */
9e2ee207 38struct tls_tcb *
71b3fa15
DX
39_tcb_ctor(struct pthread *thread, int initial)
40{
9e2ee207 41 struct tls_tcb *old_tcb, *tcb;
bc633d63
MD
42 int flags;
43
44 old_tcb = NULL;
45 flags = 0;
71b3fa15
DX
46
47 if (initial) {
bc633d63
MD
48 /*
49 * We may have to replace a TLS already created by the low
50 * level libc startup code
51 */
52 struct tls_info info;
53 if (sys_get_tls_area(0, &info, sizeof(info)) == 0) {
54 old_tcb = info.base;
55 flags = RTLD_ALLOC_TLS_FREE_OLD;
56 }
71b3fa15 57 }
bc633d63 58 tcb = _rtld_allocate_tls(old_tcb, sizeof(struct tcb), flags);
9e2ee207
JS
59 if (tcb)
60 tcb->tcb_pthread = thread;
71b3fa15
DX
61
62 return (tcb);
63}
64
65void
9e2ee207 66_tcb_dtor(struct tls_tcb *tcb)
71b3fa15 67{
9e2ee207 68 _rtld_free_tls(tcb, sizeof(struct tcb));
71b3fa15 69}