@@ -375,7 +375,7 @@ struct pthread_attr_t {
375
375
}
376
376
377
377
#[ link( name = "pthread" ) ]
378
- #[ cfg( not ( target_env= "msvc" ) ) ]
378
+ #[ cfg( unix ) ]
379
379
extern "C" {
380
380
fn pthread_attr_init ( attr : * mut pthread_attr_t ) -> c_int ;
381
381
@@ -399,14 +399,14 @@ type LPVOID = *mut c_void;
399
399
type HANDLE = * mut c_void ;
400
400
401
401
#[ link( name = "msvcrt" ) ]
402
- #[ cfg( target_env= "msvc" ) ]
402
+ #[ cfg( windows ) ]
403
403
extern "C" {
404
404
fn WaitForSingleObject (
405
405
hHandle : LPVOID ,
406
406
dwMilliseconds : DWORD
407
407
) -> DWORD ;
408
408
409
- fn CreateThread (
409
+ fn CreateThread (
410
410
lpThreadAttributes : LPVOID , // Technically LPSECURITY_ATTRIBUTES, but we don't use it anyway
411
411
dwStackSize : usize ,
412
412
lpStartAddress : extern "C" fn ( _: * mut c_void ) -> * mut c_void ,
@@ -416,14 +416,16 @@ extern "C" {
416
416
) -> HANDLE ;
417
417
}
418
418
419
- enum Thread {
420
- Windows ( HANDLE ) ,
421
- Pthread ( pthread_t )
419
+ struct Thread {
420
+ #[ cfg( windows) ]
421
+ handle : HANDLE ,
422
+ #[ cfg( unix) ]
423
+ handle : pthread_t ,
422
424
}
423
425
424
426
impl Thread {
425
427
unsafe fn create ( f : extern "C" fn ( _: * mut c_void ) -> * mut c_void ) -> Self {
426
- #[ cfg( not ( target_env= "msvc" ) ) ]
428
+ #[ cfg( unix ) ]
427
429
{
428
430
let mut attr: pthread_attr_t = zeroed ( ) ;
429
431
let mut thread: pthread_t = 0 ;
@@ -436,35 +438,38 @@ impl Thread {
436
438
assert ! ( false ) ;
437
439
}
438
440
439
- Thread :: Pthread ( thread)
441
+ Thread {
442
+ handle : thread,
443
+ }
440
444
}
441
445
442
- #[ cfg( target_env= "msvc" ) ]
446
+ #[ cfg( windows ) ]
443
447
{
444
448
let handle = CreateThread ( 0 as * mut c_void , 0 , f, 0 as * mut c_void , 0 , 0 as * mut u32 ) ;
445
449
446
450
if ( handle as u64 ) == 0 {
447
451
assert ! ( false ) ;
448
452
}
449
453
450
- Thread :: Windows ( handle)
454
+ Thread {
455
+ handle,
456
+ }
451
457
}
452
458
}
453
459
454
460
455
461
unsafe fn join ( self ) {
456
- match self {
457
- #[ cfg( not( target_env="msvc" ) ) ]
458
- Thread :: Pthread ( thread) => {
459
- let mut res = 0 as * mut c_void ;
460
- pthread_join ( thread, & mut res) ;
461
- }
462
- #[ cfg( target_env="msvc" ) ]
463
- Thread :: Windows ( handle) => {
464
- let wait_time = 5000 ; // in milliseconds
465
- assert ! ( WaitForSingleObject ( handle, wait_time) == 0 ) ;
466
- }
467
- _ => assert ! ( false ) ,
462
+ #[ cfg( unix) ]
463
+ {
464
+ let mut res = 0 as * mut c_void ;
465
+ pthread_join ( self . handle , & mut res) ;
466
+ }
467
+
468
+ #[ cfg( windows) ]
469
+ {
470
+ // The INFINITE macro is used to signal operations that do not timeout.
471
+ let infinite = 0xffffffff ;
472
+ assert ! ( WaitForSingleObject ( self . handle, infinite) == 0 ) ;
468
473
}
469
474
}
470
475
}
0 commit comments