OLD | NEW |
1 Index: mozilla/nsprpub/pr/include/prtypes.h | 1 Index: mozilla/nsprpub/pr/include/prtypes.h |
2 =================================================================== | 2 =================================================================== |
3 RCS file: /cvsroot/mozilla/nsprpub/pr/include/prtypes.h,v | 3 RCS file: /cvsroot/mozilla/nsprpub/pr/include/prtypes.h,v |
4 retrieving revision 3.41 | 4 retrieving revision 3.43 |
5 diff -p -u -8 -r3.41 prtypes.h | 5 diff -p -u -8 -r3.43 prtypes.h |
6 --- mozilla/nsprpub/pr/include/prtypes.h» 6 May 2009 05:40:35 -0000»
3.41 | 6 --- mozilla/nsprpub/pr/include/prtypes.h» 11 Jun 2010 01:34:54 -0000»
3.43 |
7 +++ mozilla/nsprpub/pr/include/prtypes.h» 15 Jan 2010 01:23:40 -0000 | 7 +++ mozilla/nsprpub/pr/include/prtypes.h» 10 Aug 2010 01:06:02 -0000 |
8 @@ -75,17 +75,33 @@ | 8 @@ -75,17 +75,33 @@ |
9 ** Example: | 9 ** Example: |
10 ** in dowhim.h | 10 ** in dowhim.h |
11 ** PR_EXTERN( void ) DoWhatIMean( void ); | 11 ** PR_EXTERN( void ) DoWhatIMean( void ); |
12 ** in dowhim.c | 12 ** in dowhim.c |
13 ** PR_IMPLEMENT( void ) DoWhatIMean( void ) { return; } | 13 ** PR_IMPLEMENT( void ) DoWhatIMean( void ) { return; } |
14 ** | 14 ** |
15 ** | 15 ** |
16 ***********************************************************************/ | 16 ***********************************************************************/ |
17 -#if defined(WIN32) | 17 -#if defined(WIN32) |
(...skipping 21 matching lines...) Expand all Loading... |
39 #define PR_IMPORT_DATA(__type) __declspec(dllimport) __type | 39 #define PR_IMPORT_DATA(__type) __declspec(dllimport) __type |
40 | 40 |
41 #define PR_EXTERN(__type) extern __declspec(dllexport) __type | 41 #define PR_EXTERN(__type) extern __declspec(dllexport) __type |
42 #define PR_IMPLEMENT(__type) __declspec(dllexport) __type | 42 #define PR_IMPLEMENT(__type) __declspec(dllexport) __type |
43 Index: mozilla/nsprpub/pr/src/md/windows/w95dllmain.c | 43 Index: mozilla/nsprpub/pr/src/md/windows/w95dllmain.c |
44 =================================================================== | 44 =================================================================== |
45 RCS file: /cvsroot/mozilla/nsprpub/pr/src/md/windows/w95dllmain.c,v | 45 RCS file: /cvsroot/mozilla/nsprpub/pr/src/md/windows/w95dllmain.c,v |
46 retrieving revision 3.8 | 46 retrieving revision 3.8 |
47 diff -p -u -8 -r3.8 w95dllmain.c | 47 diff -p -u -8 -r3.8 w95dllmain.c |
48 --- mozilla/nsprpub/pr/src/md/windows/w95dllmain.c 25 Apr 2004 15:01:00 -00
00 3.8 | 48 --- mozilla/nsprpub/pr/src/md/windows/w95dllmain.c 25 Apr 2004 15:01:00 -00
00 3.8 |
49 +++ mozilla/nsprpub/pr/src/md/windows/w95dllmain.c» 15 Jan 2010 01:23:40 -00
00 | 49 +++ mozilla/nsprpub/pr/src/md/windows/w95dllmain.c» 10 Aug 2010 01:06:02 -00
00 |
50 @@ -30,16 +30,18 @@ | 50 @@ -30,16 +30,18 @@ |
51 * use your version of this file under the terms of the MPL, indicate your | 51 * use your version of this file under the terms of the MPL, indicate your |
52 * decision by deleting the provisions above and replace them with the notice | 52 * decision by deleting the provisions above and replace them with the notice |
53 * and other provisions required by the GPL or the LGPL. If you do not delete | 53 * and other provisions required by the GPL or the LGPL. If you do not delete |
54 * the provisions above, a recipient may use your version of this file under | 54 * the provisions above, a recipient may use your version of this file under |
55 * the terms of any one of the MPL, the GPL or the LGPL. | 55 * the terms of any one of the MPL, the GPL or the LGPL. |
56 * | 56 * |
57 * ***** END LICENSE BLOCK ***** */ | 57 * ***** END LICENSE BLOCK ***** */ |
58 | 58 |
59 +#if 0 /* STATIC LIBRARIES. See the end of w95thred.c. */ | 59 +#if 0 /* STATIC LIBRARIES. See the end of w95thred.c. */ |
(...skipping 13 matching lines...) Expand all Loading... |
73 case DLL_PROCESS_DETACH: | 73 case DLL_PROCESS_DETACH: |
74 break; | 74 break; |
75 } | 75 } |
76 return TRUE; | 76 return TRUE; |
77 } | 77 } |
78 + | 78 + |
79 +#endif | 79 +#endif |
80 Index: mozilla/nsprpub/pr/src/md/windows/w95thred.c | 80 Index: mozilla/nsprpub/pr/src/md/windows/w95thred.c |
81 =================================================================== | 81 =================================================================== |
82 RCS file: /cvsroot/mozilla/nsprpub/pr/src/md/windows/w95thred.c,v | 82 RCS file: /cvsroot/mozilla/nsprpub/pr/src/md/windows/w95thred.c,v |
83 retrieving revision 3.18 | 83 retrieving revision 3.19 |
84 diff -p -u -8 -r3.18 w95thred.c | 84 diff -p -u -8 -r3.19 w95thred.c |
85 --- mozilla/nsprpub/pr/src/md/windows/w95thred.c» 4 Feb 2009 23:44:01 -000
0» 3.18 | 85 --- mozilla/nsprpub/pr/src/md/windows/w95thred.c» 11 Jun 2010 01:34:54 -00
00» 3.19 |
86 +++ mozilla/nsprpub/pr/src/md/windows/w95thred.c» 15 Jan 2010 01:23:40 -00
00 | 86 +++ mozilla/nsprpub/pr/src/md/windows/w95thred.c» 10 Aug 2010 01:06:02 -00
00 |
87 @@ -309,8 +309,115 @@ PRThread *thread; | 87 @@ -309,8 +309,121 @@ PRThread *thread; |
88 | 88 |
89 if (NULL == thread) { | 89 if (NULL == thread) { |
90 thread = _PRI_AttachThread( | 90 thread = _PRI_AttachThread( |
91 PR_USER_THREAD, PR_PRIORITY_NORMAL, NULL, 0); | 91 PR_USER_THREAD, PR_PRIORITY_NORMAL, NULL, 0); |
92 } | 92 } |
93 PR_ASSERT(thread != NULL); | 93 PR_ASSERT(thread != NULL); |
94 return thread; | 94 return thread; |
95 } | 95 } |
96 + | 96 + |
97 +// The following code is from Chromium src/base/thread_local_storage_win.cc, | 97 +// The following code is from Chromium src/base/thread_local_storage_win.cc, |
(...skipping 27 matching lines...) Expand all Loading... |
125 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 125 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
126 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 126 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
127 + | 127 + |
128 +// Thread Termination Callbacks. | 128 +// Thread Termination Callbacks. |
129 +// Windows doesn't support a per-thread destructor with its | 129 +// Windows doesn't support a per-thread destructor with its |
130 +// TLS primitives. So, we build it manually by inserting a | 130 +// TLS primitives. So, we build it manually by inserting a |
131 +// function to be called on each thread's exit. | 131 +// function to be called on each thread's exit. |
132 +// This magic is from http://www.codeproject.com/threads/tls.asp | 132 +// This magic is from http://www.codeproject.com/threads/tls.asp |
133 +// and it works for VC++ 7.0 and later. | 133 +// and it works for VC++ 7.0 and later. |
134 + | 134 + |
| 135 +// Force a reference to _tls_used to make the linker create the TLS directory |
| 136 +// if it's not already there. (e.g. if __declspec(thread) is not used). |
| 137 +// Force a reference to p_thread_callback_nspr to prevent whole program |
| 138 +// optimization from discarding the variable. |
135 +#ifdef _WIN64 | 139 +#ifdef _WIN64 |
136 + | 140 + |
137 +// This makes the linker create the TLS directory if it's not already | |
138 +// there. (e.g. if __declspec(thread) is not used). | |
139 +#pragma comment(linker, "/INCLUDE:_tls_used") | 141 +#pragma comment(linker, "/INCLUDE:_tls_used") |
| 142 +#pragma comment(linker, "/INCLUDE:p_thread_callback_nspr") |
140 + | 143 + |
141 +#else // _WIN64 | 144 +#else // _WIN64 |
142 + | 145 + |
143 +// This makes the linker create the TLS directory if it's not already | |
144 +// there. (e.g. if __declspec(thread) is not used). | |
145 +#pragma comment(linker, "/INCLUDE:__tls_used") | 146 +#pragma comment(linker, "/INCLUDE:__tls_used") |
| 147 +#pragma comment(linker, "/INCLUDE:_p_thread_callback_nspr") |
146 + | 148 + |
147 +#endif // _WIN64 | 149 +#endif // _WIN64 |
148 + | 150 + |
149 +// Static callback function to call with each thread termination. | 151 +// Static callback function to call with each thread termination. |
150 +static void NTAPI PR_OnThreadExit(PVOID module, DWORD reason, PVOID reserved) | 152 +static void NTAPI PR_OnThreadExit(PVOID module, DWORD reason, PVOID reserved) |
151 +{ | 153 +{ |
152 +PRThread *me; | 154 +PRThread *me; |
153 + | 155 + |
154 + switch (reason) { | 156 + switch (reason) { |
155 + case DLL_PROCESS_ATTACH: | 157 + case DLL_PROCESS_ATTACH: |
(...skipping 15 matching lines...) Expand all Loading... |
171 +// .CRT$XLA to .CRT$XLZ is an array of PIMAGE_TLS_CALLBACK pointers that are | 173 +// .CRT$XLA to .CRT$XLZ is an array of PIMAGE_TLS_CALLBACK pointers that are |
172 +// called automatically by the OS loader code (not the CRT) when the module is | 174 +// called automatically by the OS loader code (not the CRT) when the module is |
173 +// loaded and on thread creation. They are NOT called if the module has been | 175 +// loaded and on thread creation. They are NOT called if the module has been |
174 +// loaded by a LoadLibrary() call. It must have implicitly been loaded at | 176 +// loaded by a LoadLibrary() call. It must have implicitly been loaded at |
175 +// process startup. | 177 +// process startup. |
176 +// By implicitly loaded, I mean that it is directly referenced by the main EXE | 178 +// By implicitly loaded, I mean that it is directly referenced by the main EXE |
177 +// or by one of its dependent DLLs. Delay-loaded DLL doesn't count as being | 179 +// or by one of its dependent DLLs. Delay-loaded DLL doesn't count as being |
178 +// implicitly loaded. | 180 +// implicitly loaded. |
179 +// | 181 +// |
180 +// See VC\crt\src\tlssup.c for reference. | 182 +// See VC\crt\src\tlssup.c for reference. |
| 183 + |
| 184 +// The linker must not discard p_thread_callback_nspr. (We force a reference |
| 185 +// to this variable with a linker /INCLUDE:symbol pragma to ensure that.) If |
| 186 +// this variable is discarded, the PR_OnThreadExit function will never be |
| 187 +// called. |
181 +#ifdef _WIN64 | 188 +#ifdef _WIN64 |
182 + | 189 + |
183 +// .CRT section is merged with .rdata on x64 so it must be constant data. | 190 +// .CRT section is merged with .rdata on x64 so it must be constant data. |
184 +#pragma const_seg(".CRT$XLB") | 191 +#pragma const_seg(".CRT$XLB") |
185 +// When defining a const variable, it must have external linkage to be sure the | 192 +// When defining a const variable, it must have external linkage to be sure the |
186 +// linker doesn't discard it. If this value is discarded, the PR_OnThreadExit | 193 +// linker doesn't discard it. |
187 +// function will never be called. | 194 +extern const PIMAGE_TLS_CALLBACK p_thread_callback_nspr; |
188 +extern const PIMAGE_TLS_CALLBACK p_thread_callback; | 195 +const PIMAGE_TLS_CALLBACK p_thread_callback_nspr = PR_OnThreadExit; |
189 +const PIMAGE_TLS_CALLBACK p_thread_callback = PR_OnThreadExit; | |
190 + | 196 + |
191 +// Reset the default section. | 197 +// Reset the default section. |
192 +#pragma const_seg() | 198 +#pragma const_seg() |
193 + | 199 + |
194 +#else // _WIN64 | 200 +#else // _WIN64 |
195 + | 201 + |
196 +#pragma data_seg(".CRT$XLB") | 202 +#pragma data_seg(".CRT$XLB") |
197 +PIMAGE_TLS_CALLBACK p_thread_callback = PR_OnThreadExit; | 203 +PIMAGE_TLS_CALLBACK p_thread_callback_nspr = PR_OnThreadExit; |
198 + | 204 + |
199 +// Reset the default section. | 205 +// Reset the default section. |
200 +#pragma data_seg() | 206 +#pragma data_seg() |
201 + | 207 + |
202 +#endif // _WIN64 | 208 +#endif // _WIN64 |
OLD | NEW |