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