Changeset 573 for trunk/libs/libpthread/pthread.c
- Timestamp:
- Oct 5, 2018, 12:21:52 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libs/libpthread/pthread.c
r477 r573 31 31 #include <syscalls_numbers.h> 32 32 33 #define PTHREAD_MUTEX_DEBUG 0 34 #define PTHREAD_BARRIER_DEBUG 1 33 #define PTHREAD_BARRIER_DEBUG 0 35 34 36 35 //////////////////////////////////////////////////////////////////////////////////////////// … … 307 306 if ( node->parent != NULL ) sqt_barrier_decrement( node->parent ); 308 307 309 // reset the current node310 node->sense = expected;311 node->count = node->arity;312 313 308 #if PTHREAD_BARRIER_DEBUG 314 309 printf("\n[BARRIER] %s : core[%x,%d] reset SQT barrier node %x :\n" … … 317 312 node->level , node->arity , node->sense , node->count ); 318 313 #endif 314 // reset the current node 315 node->sense = expected; 316 node->count = node->arity; 317 319 318 return; 320 319 } … … 374 373 } 375 374 376 mutex->current = 0; 377 mutex->free = 0; 378 379 #if PTHEAD_MUTEX_DEBUG 380 unsigned int cxy; 381 unsigned int lid; 382 get_core( &cxy , &lid ); 383 printf("\n[MUTEX DEBUG] %s : core[%x,%d] initializes mutex %x\n", 384 __FUNCTION__, cxy, lid, mutex ); 385 #endif 386 387 return 0; 375 return hal_user_syscall( SYS_MUTEX, 376 (reg_t)mutex, 377 MUTEX_INIT, 378 0, 0 ); 379 } 380 381 //////////////////////////////////////////////////// 382 int pthread_mutex_destroy( pthread_mutex_t * mutex ) 383 { 384 return hal_user_syscall( SYS_MUTEX, 385 (reg_t)mutex, 386 MUTEX_DESTROY, 387 0, 0 ); 388 388 } 389 389 … … 391 391 int pthread_mutex_lock( pthread_mutex_t * mutex ) 392 392 { 393 unsigned int ticket; 394 395 // get next free ticket 396 ticket = (unsigned int)hal_user_atomic_add( (int *)&mutex->free, 1 ); 397 398 #if PTHREAD_MUTEX_DEBUG 399 unsigned int cxy; 400 unsigned int lid; 401 get_core( &cxy , &lid ); 402 printf("\n[MUTEX DEBUG] %s : core[%x,%d] get ticket %d\n", 403 " / mutex = %x / current = %d / free = %d\n", 404 __FUNCTION__, cxy, lid, ticket, mutex, mutex->current, mutex->free ); 405 #endif 406 407 // poll the current index 408 while( 1 ) 409 { 410 if( mutex->current == ticket) break; 411 } 412 413 #if PTHREAD_MUTEX_DEBUG 414 printf("\n[MUTEX DEBUG] %s : core[%x,%d] get mutex %x / current = %d / free = %d\n", 415 __FUNCTION__, cxy, lid, mutex, mutex->current, mutex->free ); 416 #endif 417 418 return 0; 393 return hal_user_syscall( SYS_MUTEX, 394 (reg_t)mutex, 395 MUTEX_LOCK, 396 0, 0 ); 419 397 } 420 398 … … 422 400 int pthread_mutex_trylock( pthread_mutex_t * mutex ) 423 401 { 424 unsigned int ticket; 425 426 // get next free ticket 427 ticket = (unsigned int)hal_user_atomic_add( (int *)&mutex->free, 1 ); 428 429 #if PTHREAD_MUTEX_DEBUG 430 unsigned int cxy; 431 unsigned int lid; 432 get_core( &cxy, &lid ); 433 printf("\n[MUTEX DEBUG] %s : core[%x,%d] get ticket = %d" 434 " / mutex = %x / current = %d / free = %d\n", 435 __FUNCTION__, cxy, lid, ticket, mutex, mutex->current, mutex->free ); 436 #endif 437 438 // test ticket 439 if( ticket == mutex->current ) return 0; // success 440 else return -1; // failure 402 return hal_user_syscall( SYS_MUTEX, 403 (reg_t)mutex, 404 MUTEX_TRYLOCK, 405 0, 0 ); 441 406 } 442 407 … … 444 409 int pthread_mutex_unlock( pthread_mutex_t * mutex ) 445 410 { 446 hal_user_fence(); 447 448 mutex->current = mutex->current + 1; 449 450 #if PTHREAD_MUTEX_DEBUG 451 unsigned int cxy; 452 unsigned int lid; 453 get_core( &cxy , &lid ); 454 printf("\n[MUTEX_DEBUG] %s : core[%x,%d] releases mutex %x" 455 " / current = %d / free = %d\n", 456 __FUNCTION__, cxy, lid, mutex, mutex->current, mutex->free ); 457 #endif 458 459 return 0; 460 } 411 return hal_user_syscall( SYS_MUTEX, 412 (reg_t)mutex, 413 MUTEX_UNLOCK, 414 0, 0 ); 415 } 416 417 //////////////////////////////////////////////////////////////////////////////////////////// 418 // Condition variable 419 //////////////////////////////////////////////////////////////////////////////////////////// 420 421 /////////////////////////////////////////////// 422 int pthread_cond_init( pthread_cond_t * cond, 423 pthread_condattr_t * attr ) 424 { 425 if( attr ) 426 { 427 printf("[ERROR] in %s ; <attr> argument must be NULL\n", __FUNCTION__ ); 428 return -1; 429 } 430 431 return hal_user_syscall( SYS_CONDVAR, 432 (reg_t)cond, 433 CONDVAR_INIT, 434 0, 0 ); 435 } 436 437 ///////////////////////////////////////////////// 438 int pthread_cond_destroy( pthread_cond_t * cond ) 439 { 440 return hal_user_syscall( SYS_CONDVAR, 441 (reg_t)cond, 442 CONDVAR_DESTROY, 443 0, 0 ); 444 } 445 446 ////////////////////////////////////////////// 447 int pthread_cond_wait( pthread_cond_t * cond, 448 pthread_mutex_t * mutex ) 449 { 450 return hal_user_syscall( SYS_CONDVAR, 451 (reg_t)cond, 452 CONDVAR_WAIT, 453 (reg_t)mutex, 454 0 ); 455 } 456 457 //////////////////////////////////////////////// 458 int pthread_cond_signal( pthread_cond_t * cond ) 459 { 460 return hal_user_syscall( SYS_CONDVAR, 461 (reg_t)cond, 462 CONDVAR_SIGNAL, 463 0, 0 ); 464 } 465 466 /////////////////////////////////////////////////// 467 int pthread_cond_broadcast( pthread_cond_t * cond ) 468 { 469 return hal_user_syscall( SYS_CONDVAR, 470 (reg_t)cond, 471 CONDVAR_BROADCAST, 472 0, 0 ); 473 } 474 475 476 477 461 478 462 479
Note: See TracChangeset
for help on using the changeset viewer.