00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00048 #ifndef WINSTL_INCL_WINSTL_SYNCH_HPP_WAIT_FUNCTIONS
00049 #define WINSTL_INCL_WINSTL_SYNCH_HPP_WAIT_FUNCTIONS
00050
00051 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00052 # define WINSTL_VER_WINSTL_SYNCH_HPP_WAIT_FUNCTIONS_MAJOR 2
00053 # define WINSTL_VER_WINSTL_SYNCH_HPP_WAIT_FUNCTIONS_MINOR 0
00054 # define WINSTL_VER_WINSTL_SYNCH_HPP_WAIT_FUNCTIONS_REVISION 3
00055 # define WINSTL_VER_WINSTL_SYNCH_HPP_WAIT_FUNCTIONS_EDIT 12
00056 #endif
00057
00058
00059
00060
00061
00062 #ifndef WINSTL_INCL_WINSTL_H_WINSTL
00063 # include <winstl/winstl.h>
00064 #endif
00065 #ifndef STLSOFT_INCL_STLSOFT_SYNCH_HPP_CONCEPTS
00066 # include <stlsoft/synch/concepts.hpp>
00067 #endif
00068 #ifndef WINSTL_INCL_WINSTL_SHIMS_ATTRIBUTE_HPP_GET_SYNCH_HANDLE
00069 # include <winstl/shims/attribute/get_synch_handle.hpp>
00070 #endif
00071
00072
00073
00074
00075
00076 #ifndef _WINSTL_NO_NAMESPACE
00077 # if defined(_STLSOFT_NO_NAMESPACE) || \
00078 defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00079
00080 namespace winstl
00081 {
00082 # else
00083
00084
00085 namespace stlsoft
00086 {
00087
00088 namespace winstl_project
00089 {
00090
00091 # endif
00092 #endif
00093
00094
00095
00096
00097
00098 #ifndef WINSTL_WAIT_FUNCTIONS_NO_USE_SHIM_VERIFIER
00099
00100 # ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00101
00102 template <ss_typename_param_k H>
00103 inline HANDLE w4mo_verify_and_get_discriminator(H &h, H const*)
00104 {
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 HANDLE (*pfn)(H &) = &winstl_ns_qual(get_synch_handle);
00118
00119 return (*pfn)(h);
00120 }
00121
00122 inline HANDLE w4mo_verify_and_get_discriminator(HANDLE h, HANDLE const*)
00123 {
00124 return h;
00125 }
00126
00127 template <ss_typename_param_k H>
00128 inline HANDLE w4mo_verify_and_get(H &h)
00129 {
00130 return w4mo_verify_and_get_discriminator(h, &h);
00131 }
00132
00133 # endif
00134
00135 #else
00136
00137 template <ss_typename_param_k H>
00138 inline HANDLE w4mo_verify_and_get(H &h)
00139 {
00140 return winstl_ns_qual(get_synch_handle)(h);
00141 }
00142
00143 #endif
00144
00145
00146
00151 inline DWORD w4mo_helper_8( HANDLE h0
00152 , HANDLE h1
00153 , HANDLE h2
00154 , HANDLE h3
00155 , HANDLE h4
00156 , HANDLE h5
00157 , HANDLE h6
00158 , HANDLE h7
00159 , ws_bool_t bWaitAll
00160 , ws_dword_t timeout)
00161 {
00162 HANDLE handles[8];
00163 DWORD numHandles = 2;
00164
00165 WINSTL_ASSERT(NULL != h0);
00166 WINSTL_ASSERT(NULL != h1);
00167
00168 handles[0] = h0;
00169 handles[1] = h1;
00170 handles[2] = h2;
00171 handles[3] = h3;
00172 handles[4] = h4;
00173 handles[5] = h5;
00174 handles[6] = h6;
00175 handles[7] = h7;
00176
00177 for(ws_size_t i = numHandles; i < STLSOFT_NUM_ELEMENTS(handles); ++i, ++numHandles)
00178 {
00179 if(NULL == handles[i])
00180 {
00181 break;
00182 }
00183 }
00184
00185 return ::WaitForMultipleObjects(numHandles, &handles[0], bWaitAll, timeout);
00186 }
00187
00188
00193 template< ss_typename_param_k L0
00194 , ss_typename_param_k L1
00195 , ss_typename_param_k L2
00196 , ss_typename_param_k L3
00197 , ss_typename_param_k L4
00198 , ss_typename_param_k L5
00199 , ss_typename_param_k L6
00200 , ss_typename_param_k L7
00201 >
00202 inline DWORD wait_for_multiple_objects(L0 &l0, L1 &l1, L2 &l2, L3 &l3, L4 &l4, L5 &l5, L6 &l6, L7 &l7, ws_bool_t bWaitAll, ws_dword_t timeout)
00203 {
00204 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l0));
00205 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l1));
00206 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l2));
00207 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l3));
00208 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l4));
00209 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l5));
00210 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l6));
00211 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l7));
00212
00213 return w4mo_helper_8(
00214 winstl_ns_qual(w4mo_verify_and_get)(l0)
00215 , winstl_ns_qual(w4mo_verify_and_get)(l1)
00216 , winstl_ns_qual(w4mo_verify_and_get)(l2)
00217 , winstl_ns_qual(w4mo_verify_and_get)(l3)
00218 , winstl_ns_qual(w4mo_verify_and_get)(l4)
00219 , winstl_ns_qual(w4mo_verify_and_get)(l5)
00220 , winstl_ns_qual(w4mo_verify_and_get)(l6)
00221 , winstl_ns_qual(w4mo_verify_and_get)(l7)
00222 , bWaitAll
00223 , timeout);
00224 }
00225
00230 template< ss_typename_param_k L0
00231 , ss_typename_param_k L1
00232 , ss_typename_param_k L2
00233 , ss_typename_param_k L3
00234 , ss_typename_param_k L4
00235 , ss_typename_param_k L5
00236 , ss_typename_param_k L6
00237 >
00238 inline DWORD wait_for_multiple_objects(L0 &l0, L1 &l1, L2 &l2, L3 &l3, L4 &l4, L5 &l5, L6 &l6, ws_bool_t bWaitAll, ws_dword_t timeout)
00239 {
00240 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l0));
00241 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l1));
00242 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l2));
00243 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l3));
00244 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l4));
00245 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l5));
00246 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l6));
00247
00248 return w4mo_helper_8(
00249 winstl_ns_qual(w4mo_verify_and_get)(l0)
00250 , winstl_ns_qual(w4mo_verify_and_get)(l1)
00251 , winstl_ns_qual(w4mo_verify_and_get)(l2)
00252 , winstl_ns_qual(w4mo_verify_and_get)(l3)
00253 , winstl_ns_qual(w4mo_verify_and_get)(l4)
00254 , winstl_ns_qual(w4mo_verify_and_get)(l5)
00255 , winstl_ns_qual(w4mo_verify_and_get)(l6)
00256 , NULL
00257 , bWaitAll
00258 , timeout);
00259 }
00260
00265 template< ss_typename_param_k L0
00266 , ss_typename_param_k L1
00267 , ss_typename_param_k L2
00268 , ss_typename_param_k L3
00269 , ss_typename_param_k L4
00270 , ss_typename_param_k L5
00271 >
00272 inline DWORD wait_for_multiple_objects(L0 &l0, L1 &l1, L2 &l2, L3 &l3, L4 &l4, L5 &l5, ws_bool_t bWaitAll, ws_dword_t timeout)
00273 {
00274 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l0));
00275 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l1));
00276 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l2));
00277 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l3));
00278 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l4));
00279 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l5));
00280
00281 return w4mo_helper_8(
00282 winstl_ns_qual(w4mo_verify_and_get)(l0)
00283 , winstl_ns_qual(w4mo_verify_and_get)(l1)
00284 , winstl_ns_qual(w4mo_verify_and_get)(l2)
00285 , winstl_ns_qual(w4mo_verify_and_get)(l3)
00286 , winstl_ns_qual(w4mo_verify_and_get)(l4)
00287 , winstl_ns_qual(w4mo_verify_and_get)(l5)
00288 , NULL
00289 , NULL
00290 , bWaitAll
00291 , timeout);
00292 }
00293
00298 template< ss_typename_param_k L0
00299 , ss_typename_param_k L1
00300 , ss_typename_param_k L2
00301 , ss_typename_param_k L3
00302 , ss_typename_param_k L4
00303 >
00304 inline DWORD wait_for_multiple_objects(L0 &l0, L1 &l1, L2 &l2, L3 &l3, L4 &l4, ws_bool_t bWaitAll, ws_dword_t timeout)
00305 {
00306 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l0));
00307 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l1));
00308 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l2));
00309 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l3));
00310 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l4));
00311
00312 return w4mo_helper_8(
00313 winstl_ns_qual(w4mo_verify_and_get)(l0)
00314 , winstl_ns_qual(w4mo_verify_and_get)(l1)
00315 , winstl_ns_qual(w4mo_verify_and_get)(l2)
00316 , winstl_ns_qual(w4mo_verify_and_get)(l3)
00317 , winstl_ns_qual(w4mo_verify_and_get)(l4)
00318 , NULL
00319 , NULL
00320 , NULL
00321 , bWaitAll
00322 , timeout);
00323 }
00324
00329 template< ss_typename_param_k L0
00330 , ss_typename_param_k L1
00331 , ss_typename_param_k L2
00332 , ss_typename_param_k L3
00333 >
00334 inline DWORD wait_for_multiple_objects(L0 &l0, L1 &l1, L2 &l2, L3 &l3, ws_bool_t bWaitAll, ws_dword_t timeout)
00335 {
00336 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l0));
00337 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l1));
00338 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l2));
00339 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l3));
00340
00341 return w4mo_helper_8(
00342 winstl_ns_qual(w4mo_verify_and_get)(l0)
00343 , winstl_ns_qual(w4mo_verify_and_get)(l1)
00344 , winstl_ns_qual(w4mo_verify_and_get)(l2)
00345 , winstl_ns_qual(w4mo_verify_and_get)(l3)
00346 , NULL
00347 , NULL
00348 , NULL
00349 , NULL
00350 , bWaitAll
00351 , timeout);
00352 }
00353
00358 template< ss_typename_param_k L0
00359 , ss_typename_param_k L1
00360 , ss_typename_param_k L2
00361 >
00362 inline DWORD wait_for_multiple_objects(L0 &l0, L1 &l1, L2 &l2, ws_bool_t bWaitAll, ws_dword_t timeout)
00363 {
00364 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l0));
00365 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l1));
00366 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l2));
00367
00368 return w4mo_helper_8(
00369 winstl_ns_qual(w4mo_verify_and_get)(l0)
00370 , winstl_ns_qual(w4mo_verify_and_get)(l1)
00371 , winstl_ns_qual(w4mo_verify_and_get)(l2)
00372 , NULL
00373 , NULL
00374 , NULL
00375 , NULL
00376 , NULL
00377 , bWaitAll
00378 , timeout);
00379 }
00380
00385 template< ss_typename_param_k L0
00386 , ss_typename_param_k L1
00387 >
00388 inline DWORD wait_for_multiple_objects(L0 &l0, L1 &l1, ws_bool_t bWaitAll, ws_dword_t timeout)
00389 {
00390 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l0));
00391 WINSTL_ASSERT(NULL != winstl_ns_qual(get_synch_handle)(l1));
00392
00393 return w4mo_helper_8(
00394 winstl_ns_qual(w4mo_verify_and_get)(l0)
00395 , winstl_ns_qual(w4mo_verify_and_get)(l1)
00396 , NULL
00397 , NULL
00398 , NULL
00399 , NULL
00400 , NULL
00401 , NULL
00402 , bWaitAll
00403 , timeout);
00404 }
00405
00407
00408
00409 #ifdef STLSOFT_UNITTEST
00410 # include "./unittest/wait_functions_unittest_.h"
00411 #endif
00412
00413
00414
00415 #ifndef _WINSTL_NO_NAMESPACE
00416 # if defined(_STLSOFT_NO_NAMESPACE) || \
00417 defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00418 }
00419 # else
00420 }
00421 }
00422 # endif
00423 #endif
00424
00425
00426
00427 #endif
00428
00429