-------------------------------------------------------------------
thread: Windows CD _threadex handling code breaks mingw w64
compilation.
This should be a better way to accomplish the same code, and
make it only applicable when targeting Windows CE.
-------------------------------------------------------------------
|
|
|
110 | 110 | } |
111 | 111 | namespace |
112 | 112 | { |
113 | | #ifndef BOOST_HAS_THREADEX |
114 | | // Windows CE doesn't define _beginthreadex |
115 | | |
116 | | struct ThreadProxyData |
117 | | { |
118 | | typedef unsigned (__stdcall* func)(void*); |
119 | | func start_address_; |
120 | | void* arglist_; |
121 | | ThreadProxyData(func start_address,void* arglist) : start_address_(start_address), arglist_(arglist) {} |
122 | | }; |
123 | | |
124 | | DWORD WINAPI ThreadProxy(LPVOID args) |
125 | | { |
126 | | std::auto_ptr<ThreadProxyData> data(reinterpret_cast<ThreadProxyData*>(args)); |
127 | | DWORD ret=data->start_address_(data->arglist_); |
128 | | return ret; |
| 113 | #if defined (_WIN32_WCE) |
| 114 | #define _beginthreadex(security, \ |
| 115 | stack_size, \ |
| 116 | start_proc, \ |
| 117 | arg, \ |
| 118 | flags, \ |
| 119 | pid) \ |
| 120 | CreateThread(security, \ |
| 121 | stack_size, \ |
| 122 | (LPTHREAD_START_ROUTINE) start_proc, \ |
| 123 | arg, \ |
| 124 | flags, \ |
| 125 | pid) |
| 126 | #endif //!(_WIN32_WCE) |
129 | 127 | } |
130 | 128 | |
131 | | typedef void* uintptr_t; |
132 | | |
133 | | inline uintptr_t _beginthreadex(void* security, unsigned stack_size, unsigned (__stdcall* start_address)(void*), |
134 | | void* arglist, unsigned initflag, unsigned* thrdaddr) |
135 | | { |
136 | | DWORD threadID; |
137 | | ThreadProxyData* data = new ThreadProxyData(start_address,arglist); |
138 | | HANDLE hthread=CreateThread(static_cast<LPSECURITY_ATTRIBUTES>(security),stack_size,ThreadProxy, |
139 | | data,initflag,&threadID); |
140 | | if (hthread==0) { |
141 | | delete data; |
142 | | return 0; |
143 | | } |
144 | | *thrdaddr=threadID; |
145 | | return reinterpret_cast<uintptr_t const>(hthread); |
146 | | } |
147 | | |
148 | | #endif |
149 | | |
150 | | } |
151 | | |
152 | 129 | namespace detail |
153 | 130 | { |
154 | 131 | struct thread_exit_callback_node |