~ubuntu-branches/ubuntu/precise/mesa-lts-quantal/precise-updates

« back to all changes in this revision

Viewing changes to src/gallium/state_trackers/wgl/stw_tls.c

  • Committer: Package Import Robot
  • Author(s): Maarten Lankhorst
  • Date: 2012-11-30 20:58:34 UTC
  • Revision ID: package-import@ubuntu.com-20121130205834-gazuvne3fpwlf012
Tags: upstream-9.0
ImportĀ upstreamĀ versionĀ 9.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**************************************************************************
 
2
 *
 
3
 * Copyright 2009 VMware, Inc.
 
4
 * All Rights Reserved.
 
5
 *
 
6
 * Permission is hereby granted, free of charge, to any person obtaining a
 
7
 * copy of this software and associated documentation files (the
 
8
 * "Software"), to deal in the Software without restriction, including
 
9
 * without limitation the rights to use, copy, modify, merge, publish,
 
10
 * distribute, sub license, and/or sell copies of the Software, and to
 
11
 * permit persons to whom the Software is furnished to do so, subject to
 
12
 * the following conditions:
 
13
 *
 
14
 * The above copyright notice and this permission notice (including the
 
15
 * next paragraph) shall be included in all copies or substantial portions
 
16
 * of the Software.
 
17
 *
 
18
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 
19
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 
20
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 
21
 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
 
22
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 
23
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 
24
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
25
 *
 
26
 **************************************************************************/
 
27
 
 
28
#include <windows.h>
 
29
 
 
30
#include "pipe/p_compiler.h"
 
31
#include "util/u_memory.h"
 
32
#include "stw_tls.h"
 
33
 
 
34
static DWORD tlsIndex = TLS_OUT_OF_INDEXES;
 
35
 
 
36
boolean
 
37
stw_tls_init(void)
 
38
{
 
39
   tlsIndex = TlsAlloc();
 
40
   if (tlsIndex == TLS_OUT_OF_INDEXES) {
 
41
      return FALSE;
 
42
   }
 
43
 
 
44
   return TRUE;
 
45
}
 
46
 
 
47
static INLINE struct stw_tls_data *
 
48
stw_tls_data_create()
 
49
{
 
50
   struct stw_tls_data *data;
 
51
 
 
52
   data = CALLOC_STRUCT(stw_tls_data);
 
53
   if (!data)
 
54
      goto no_data;
 
55
 
 
56
   data->hCallWndProcHook = SetWindowsHookEx(WH_CALLWNDPROC,
 
57
                                             stw_call_window_proc,
 
58
                                             NULL,
 
59
                                             GetCurrentThreadId());
 
60
   if(data->hCallWndProcHook == NULL)
 
61
      goto no_hook;
 
62
 
 
63
   TlsSetValue(tlsIndex, data);
 
64
 
 
65
   return data;
 
66
 
 
67
no_hook:
 
68
   FREE(data);
 
69
no_data:
 
70
   return NULL;
 
71
}
 
72
 
 
73
boolean
 
74
stw_tls_init_thread(void)
 
75
{
 
76
   struct stw_tls_data *data;
 
77
 
 
78
   if (tlsIndex == TLS_OUT_OF_INDEXES) {
 
79
      return FALSE;
 
80
   }
 
81
 
 
82
   data = stw_tls_data_create();
 
83
   if(!data)
 
84
      return FALSE;
 
85
 
 
86
   return TRUE;
 
87
}
 
88
 
 
89
void
 
90
stw_tls_cleanup_thread(void)
 
91
{
 
92
   struct stw_tls_data *data;
 
93
 
 
94
   if (tlsIndex == TLS_OUT_OF_INDEXES) {
 
95
      return;
 
96
   }
 
97
 
 
98
   data = (struct stw_tls_data *) TlsGetValue(tlsIndex);
 
99
   if(data) {
 
100
      TlsSetValue(tlsIndex, NULL);
 
101
   
 
102
      if(data->hCallWndProcHook) {
 
103
         UnhookWindowsHookEx(data->hCallWndProcHook);
 
104
         data->hCallWndProcHook = NULL;
 
105
      }
 
106
   
 
107
      FREE(data);
 
108
   }
 
109
}
 
110
 
 
111
void
 
112
stw_tls_cleanup(void)
 
113
{
 
114
   if (tlsIndex != TLS_OUT_OF_INDEXES) {
 
115
      TlsFree(tlsIndex);
 
116
      tlsIndex = TLS_OUT_OF_INDEXES;
 
117
   }
 
118
}
 
119
 
 
120
struct stw_tls_data *
 
121
stw_tls_get_data(void)
 
122
{
 
123
   struct stw_tls_data *data;
 
124
   
 
125
   if (tlsIndex == TLS_OUT_OF_INDEXES) {
 
126
      return NULL;
 
127
   }
 
128
   
 
129
   data = (struct stw_tls_data *) TlsGetValue(tlsIndex);
 
130
   if(!data) {
 
131
      /* DllMain is called with DLL_THREAD_ATTACH only by threads created after 
 
132
       * the DLL is loaded by the process */
 
133
      data = stw_tls_data_create();
 
134
      if(!data)
 
135
         return NULL;
 
136
   }
 
137
 
 
138
   return data;
 
139
}