void test_errors(void) { rtems_status_code sc; void *value; /* * task variable add error status codes */ puts( "task variable add - NULL pointer - RTEMS_INVALID_ADDRESS" ); sc = rtems_task_variable_add(RTEMS_SELF, NULL, NULL ); fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "add NULL pointer" ); /* * task variable get error status codes */ puts( "task variable get - bad Id - RTEMS_INVALID_ID" ); sc = rtems_task_variable_get( rtems_task_self() + 10, (void **)&taskvar1, &value ); fatal_directive_status( sc, RTEMS_INVALID_ID, "bad Id" ); puts( "task variable get - NULL pointer - RTEMS_INVALID_ADDRESS" ); sc = rtems_task_variable_get(RTEMS_SELF, NULL, &value ); fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "get NULL pointer" ); puts( "task variable get - bad result - RTEMS_INVALID_ADDRESS" ); sc = rtems_task_variable_get(RTEMS_SELF, (void **)&taskvar1, NULL); fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "get bad result" ); puts( "task variable get - bad pointer - RTEMS_INVALID_ADDRESS" ); sc = rtems_task_variable_get(RTEMS_SELF, (void **)&taskvar1, &value); fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "get bad pointer" ); /* * task variable delete error status codes */ puts( "task variable delete - bad Id - RTEMS_INVALID_ID" ); sc = rtems_task_variable_delete( rtems_task_self() + 10, (void **)&taskvar1 ); fatal_directive_status( sc, RTEMS_INVALID_ID, "bad Id" ); puts( "task variable delete - NULL pointer - RTEMS_INVALID_ADDRESS" ); sc = rtems_task_variable_delete(RTEMS_SELF, NULL); fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "delete NULL pointer" ); puts( "task variable delete - bad pointer - RTEMS_INVALID_ADDRESS" ); sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar1); fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "delete bad pointer" ); }
void test_out_of_memory(void) { int i; int max; rtems_status_code sc; int ran_out = 0; void **base; base = Pointers; for (i=0 ; i<MAX_VARS ; i++ ) { sc = rtems_task_variable_add(RTEMS_SELF, &base[i], NULL); if ( sc == RTEMS_NO_MEMORY ) { puts( "task_variable_add - returns NO_MEMORY" ); max = i; ran_out = 1; break; } directive_failed( sc, "add loop until out of memory" ); } if ( !ran_out ) { puts( "ERROR!!! did not run out of memory adding task variables!" ); rtems_test_exit(0); } for (i=0 ; i<max ; i++ ) { sc = rtems_task_variable_delete(RTEMS_SELF, &base[i]); directive_failed( sc, "delete loop until out of memory" ); } }
rtems_task Other_Task(rtems_task_argument ignored) { rtems_status_code sc; puts( "Deleting task variables in another task" ); sc = rtems_task_variable_delete(main_task, (void **)&taskvar1); directive_failed( sc, "delete loop for other task" ); (void) rtems_task_delete( RTEMS_SELF ); }
int rtems_gxx_key_delete (__gthread_key_t key) { rtems_status_code status; #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: delete key=%x\n", key ); #endif /* register with RTEMS the buffer that will hold the key values */ status = rtems_task_variable_delete( RTEMS_SELF, (void **)key ); if ( status == RTEMS_SUCCESSFUL ) { /* Hmm - hopefully all tasks using this key have gone away... */ if ( key ) free( *(void **)key ); return 0; } key = NULL; return 0; }
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) { rtems_status_code sc; rtems_user_env_t * shared_user_env; rtems_id current_task_id; sc=rtems_task_ident(RTEMS_SELF,0,¤t_task_id); if (sc != RTEMS_SUCCESSFUL) return sc; if (rtems_current_user_env->task_id==current_task_id) { /* kill the current user env & task_var*/ rtems_user_env_t *tmp = rtems_current_user_env; sc = rtems_task_variable_delete(RTEMS_SELF,(void*)&rtems_current_user_env); if (sc != RTEMS_SUCCESSFUL) return sc; free_user_env(tmp); }; /* AT THIS POINT, rtems_current_user_env is DANGLING */ sc = rtems_task_variable_get(task_id,(void*)&rtems_current_user_env, (void*)&shared_user_env ); if (sc != RTEMS_SUCCESSFUL) goto bailout; sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free_user_env); if (sc != RTEMS_SUCCESSFUL) goto bailout; /* the current_user_env is the same pointer that remote env */ rtems_current_user_env = shared_user_env; /* increase the reference count */ #ifdef HAVE_USERENV_REFCNT rtems_current_user_env->refcnt++; #endif return RTEMS_SUCCESSFUL; bailout: /* fallback to the global env */ rtems_current_user_env = &rtems_global_user_env; return sc; }
rtems_task subtask (rtems_task_argument arg) { uintptr_t localvar = arg; int i; rtems_status_code sc; nRunning++; while (nRunning != 3) rtems_task_wake_after (0); sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar, NULL); directive_failed( sc, "task variable add" ); taskvar = (void *)localvar; while (localvar < 1000) { localvar++; rtems_task_wake_after (0); taskvar = (void *)((uintptr_t)taskvar + 1); rtems_task_wake_after (0); if ((uintptr_t)taskvar != localvar) { printf( "Task:%" PRIdrtems_task_argument " taskvar:%" PRIuPTR " localvar:%" PRIuPTR "\n", arg, (uintptr_t)taskvar, localvar ); rtems_task_suspend (RTEMS_SELF); } } sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar); nDeleted++; directive_failed( sc, "task variable delete" ); if ((uintptr_t)taskvar == localvar) { printf( "Task:%" PRIdrtems_task_argument " deleted taskvar:%" PRIuPTR " localvar:%" PRIuPTR "\n", arg, (uintptr_t)taskvar, localvar ); nRunning--; rtems_task_suspend (RTEMS_SELF); } while (nDeleted != 3) rtems_task_wake_after (0); for (i = 0 ; i < 1000 ; i++) { taskvar = (void *)(localvar = 100 * arg); rtems_task_wake_after(0); if (nRunning <= 1) break; if ((uintptr_t)taskvar == localvar) { printf( "Task:%" PRIdrtems_task_argument " taskvar:%" PRIuPTR " localvar:%" PRIuPTR "\n", arg, (uintptr_t)taskvar, localvar ); nRunning--; rtems_task_suspend(RTEMS_SELF); } } nRunning--; while (nRunning) rtems_task_wake_after(0); puts("*** END OF TEST 28 ***" ); rtems_test_exit(0); }
void test_multiple_taskvars(void) { rtems_status_code sc; void *value; test_dtor_ran = 0; /* * Add multiple task variables and add each twice to * verify that behavior is OK */ puts( "task variable add - bad Id - RTEMS_INVALID_ID" ); sc = rtems_task_variable_add( rtems_task_self() + 10, (void **)&taskvar1, NULL ); fatal_directive_status( sc, RTEMS_INVALID_ID, "bad Id" ); puts( "Adding multiple task variables" ); sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar1, NULL); directive_failed( sc, "add multiple #1" ); sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar1, test_dtor); directive_failed( sc, "add multiple #2" ); sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar2, test_dtor); directive_failed( sc, "add multiple #3" ); sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar2, NULL); directive_failed( sc, "add multiple #4" ); sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar3, NULL); directive_failed( sc, "add multiple #5" ); sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar3, test_dtor); directive_failed( sc, "add multiple #6" ); /* * Obtain task variables in various spots on the chain */ puts( "Obtaining multiple task variables" ); sc = rtems_task_variable_get( RTEMS_SELF, (void **)&taskvar3, &value ); directive_failed( sc, "get multiple #1" ); sc = rtems_task_variable_get( RTEMS_SELF, (void **)&taskvar2, &value ); directive_failed( sc, "get multiple #2" ); sc = rtems_task_variable_get( RTEMS_SELF, (void **)&taskvar1, &value ); directive_failed( sc, "get multiple #2" ); /* * Delete task variables in various spots on the chain */ /* to trip the destructors */ taskvar1 = (void *)1; taskvar2 = (void *)2; taskvar3 = (void *)3; puts( "Deleting multiple task variables" ); sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar2); directive_failed( sc, "delete multiple #1" ); sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar3); directive_failed( sc, "delete multiple #2" ); sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar1); directive_failed( sc, "delete multiple #3" ); if ( test_dtor_ran != 2 ) { printf( "Test dtor ran %" PRIu32 " times not 2 times as expected\n", test_dtor_ran ); rtems_test_exit(0); } }