Changeset 40188718 in rtems
- Timestamp:
- 07/13/15 08:00:28 (9 years ago)
- Branches:
- 5, master
- Children:
- a1b4af4b
- Parents:
- 7237b3e
- git-author:
- Sebastian Huber <sebastian.huber@…> (07/13/15 08:00:28)
- git-committer:
- Sebastian Huber <sebastian.huber@…> (07/30/15 07:11:18)
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/libmisc/monitor/mon-prmisc.c
r7237b3e r40188718 135 135 { "Wsem", STATES_WAITING_FOR_SEMAPHORE, 0 }, 136 136 { "Wsig", STATES_WAITING_FOR_SIGNAL, 0 }, 137 { "Wslftx", STATES_WAITING_FOR_SYS_LOCK_FUTEX, 0 }, 137 138 { "Wslmtx", STATES_WAITING_FOR_SYS_LOCK_MUTEX, 0 }, 138 139 { "Wslsem", STATES_WAITING_FOR_SYS_LOCK_SEMAPHORE, 0 }, -
cpukit/score/Makefile.am
r7237b3e r40188718 346 346 libscore_a_SOURCES += src/isrisinprogress.c 347 347 libscore_a_SOURCES += src/debugisownerofallocator.c 348 libscore_a_SOURCES += src/futex.c 348 349 libscore_a_SOURCES += src/profilingisrentryexit.c 349 350 libscore_a_SOURCES += src/mutex.c -
cpukit/score/include/rtems/score/statesimpl.h
r7237b3e r40188718 91 91 /** This macro corresponds to a task waiting for a <sys/lock.h> semaphore. */ 92 92 #define STATES_WAITING_FOR_SYS_LOCK_SEMAPHORE 0x4000000 93 /** This macro corresponds to a task waiting for a <sys/lock.h> futex. */ 94 #define STATES_WAITING_FOR_SYS_LOCK_FUTEX 0x8000000 93 95 94 96 /** This macro corresponds to a task which is in an interruptible … … 110 112 STATES_WAITING_FOR_SYS_LOCK_MUTEX | \ 111 113 STATES_WAITING_FOR_SYS_LOCK_SEMAPHORE | \ 114 STATES_WAITING_FOR_SYS_LOCK_FUTEX | \ 112 115 STATES_WAITING_FOR_RWLOCK ) 113 116 -
testsuites/sptests/spsyslock01/init.c
r7237b3e r40188718 20 20 21 21 #include <sys/lock.h> 22 #include <errno.h> 23 #include <limits.h> 22 24 #include <string.h> 23 25 #include <time.h> … … 42 44 43 45 #define EVENT_SEM_WAIT RTEMS_EVENT_7 46 47 #define EVENT_FUTEX_WAIT RTEMS_EVENT_8 44 48 45 49 typedef struct { … … 50 54 struct _Mutex_recursive_Control rec_mtx; 51 55 struct _Semaphore_Control sem; 56 struct _Futex_Control futex; 57 int val; 58 int eno[2]; 52 59 int generation[2]; 53 60 int current_generation[2]; … … 88 95 struct _Mutex_recursive_Control rec_mtx = _MUTEX_RECURSIVE_INITIALIZER; 89 96 struct _Semaphore_Control sem = _SEMAPHORE_INITIALIZER(1); 97 struct _Futex_Control futex = _FUTEX_INITIALIZER; 90 98 91 99 _Mutex_Initialize(&ctx->mtx); 92 100 _Mutex_recursive_Initialize(&ctx->rec_mtx); 93 101 _Semaphore_Initialize(&ctx->sem, 1); 102 _Futex_Initialize(&ctx->futex); 94 103 95 104 rtems_test_assert(memcmp(&mtx, &ctx->mtx, sizeof(mtx)) == 0); 96 105 rtems_test_assert(memcmp(&rec_mtx, &ctx->rec_mtx, sizeof(rec_mtx)) == 0); 97 106 rtems_test_assert(memcmp(&sem, &ctx->sem, sizeof(sem)) == 0); 107 rtems_test_assert(memcmp(&futex, &ctx->futex, sizeof(futex)) == 0); 98 108 99 109 _Mutex_Destroy(&mtx); 100 110 _Mutex_recursive_Destroy(&rec_mtx); 101 111 _Semaphore_Destroy(&sem); 112 _Futex_Destroy(&futex); 102 113 } 103 114 … … 322 333 } 323 334 335 static void test_futex(test_context *ctx) 336 { 337 struct _Futex_Control *futex = &ctx->futex; 338 size_t a = 0; 339 size_t b = 1; 340 int eno; 341 int woken; 342 343 eno = _Futex_Wait(futex, &ctx->val, 1); 344 rtems_test_assert(eno == EWOULDBLOCK); 345 346 woken = _Futex_Wake(futex, 0); 347 rtems_test_assert(woken == 0); 348 349 woken = _Futex_Wake(futex, 1); 350 rtems_test_assert(woken == 0); 351 352 ctx->val = 1; 353 354 ctx->eno[a] = -1; 355 send_event(ctx, a, EVENT_FUTEX_WAIT); 356 rtems_test_assert(ctx->eno[a] == -1); 357 358 woken = _Futex_Wake(futex, INT_MAX); 359 rtems_test_assert(woken == 1); 360 rtems_test_assert(ctx->eno[a] == 0); 361 362 ctx->eno[a] = -1; 363 ctx->eno[b] = -1; 364 send_event(ctx, a, EVENT_FUTEX_WAIT); 365 send_event(ctx, b, EVENT_FUTEX_WAIT); 366 rtems_test_assert(ctx->eno[a] == -1); 367 rtems_test_assert(ctx->eno[b] == -1); 368 369 woken = _Futex_Wake(futex, 1); 370 rtems_test_assert(woken == 1); 371 rtems_test_assert(ctx->eno[a] == 0); 372 rtems_test_assert(ctx->eno[b] == -1); 373 374 woken = _Futex_Wake(futex, 1); 375 rtems_test_assert(woken == 1); 376 rtems_test_assert(ctx->eno[a] == 0); 377 rtems_test_assert(ctx->eno[b] == 0); 378 379 ctx->eno[a] = -1; 380 ctx->eno[b] = -1; 381 send_event(ctx, a, EVENT_FUTEX_WAIT); 382 send_event(ctx, b, EVENT_FUTEX_WAIT); 383 rtems_test_assert(ctx->eno[a] == -1); 384 rtems_test_assert(ctx->eno[b] == -1); 385 386 woken = _Futex_Wake(futex, 2); 387 rtems_test_assert(woken == 2); 388 rtems_test_assert(ctx->eno[a] == 0); 389 rtems_test_assert(ctx->eno[b] == 0); 390 } 391 324 392 static void mid_task(rtems_task_argument arg) 325 393 { … … 402 470 _Semaphore_Wait(&ctx->sem); 403 471 ctx->generation[idx] = generation(ctx, idx); 472 } 473 474 if ((events & EVENT_FUTEX_WAIT) != 0) { 475 ctx->eno[idx] = _Futex_Wait(&ctx->futex, &ctx->val, 1); 404 476 } 405 477 } … … 460 532 test_sem(ctx); 461 533 test_sem_prio_wait_order(ctx); 534 test_futex(ctx); 462 535 463 536 send_event(ctx, 0, EVENT_MTX_DEADLOCK); … … 466 539 _Mutex_recursive_Destroy(&ctx->rec_mtx); 467 540 _Semaphore_Destroy(&ctx->sem); 541 _Futex_Destroy(&ctx->futex); 468 542 } 469 543
Note: See TracChangeset
for help on using the changeset viewer.