static void rt_fractionated_sleep(RTIME OneUnit) { #define FRACT 100 int i = FRACT; while (i--) { rt_sleep(llimd(OneUnit, 1, FRACT)); } }
static void sched_task(long t) { int i, k; unsigned long msg; change = 0; t = rdtsc(); for (i = 0; i < loops; i++) { for (k = 0; k < ntasks; k++) { rt_task_resume(thread + k); } } t = rdtsc() - t; rt_printk("\n\nFOR %d TASKS: ", ntasks); rt_printk("TIME %d (ms), SUSP/RES SWITCHES %d, ", (int)llimd(t, 1000, CPU_FREQ), 2*ntasks*loops); rt_printk("SWITCH TIME%s %d (ns)\n", use_fpu ? " (INCLUDING FULL FP SUPPORT)":"", (int)llimd(llimd(t, 1000000000, CPU_FREQ), 1, 2*ntasks*loops)); change = 1; for (k = 0; k < ntasks; k++) { rt_task_resume(thread + k); } t = rdtsc(); for (i = 0; i < loops; i++) { for (k = 0; k < ntasks; k++) { rt_sem_signal(&sem); } } t = rdtsc() - t; rt_printk("\nFOR %d TASKS: ", ntasks); rt_printk("TIME %d (ms), SEM SIG/WAIT SWITCHES %d, ", (int)llimd(t, 1000, CPU_FREQ), 2*ntasks*loops); rt_printk("SWITCH TIME%s %d (ns)\n", use_fpu ? " (INCLUDING FULL FP SUPPORT)":"", (int)llimd(llimd(t, 1000000000, CPU_FREQ), 1, 2*ntasks*loops)); change = 2; for (k = 0; k < ntasks; k++) { rt_sem_signal(&sem); } t = rdtsc(); for (i = 0; i < loops; i++) { for (k = 0; k < ntasks; k++) { rt_rpc(thread + k, 0, &msg); } } t = rdtsc() - t; rt_printk("\nFOR %d TASKS: ", ntasks); rt_printk("TIME %d (ms), RPC/RCV-RET SWITCHES %d, ", (int)llimd(t, 1000, CPU_FREQ), 2*ntasks*loops); rt_printk("SWITCH TIME%s %d (ns)\n\n", use_fpu ? " (INCLUDING FULL FP SUPPORT)":"", (int)llimd(llimd(t, 1000000000, CPU_FREQ), 1, 2*ntasks*loops)); }
void cleanup_module(void) { int i; checkt = rdtsc() - checkt; checkj = jiffies - checkj; stop_rt_timer(); printk("\n(JIFFIES COUNT CHECK: TRUE = %d, LINUX = %d)\n", (int)llimd(checkt, 100, CPU_FREQ), checkj); rt_task_delete(&start_task); for (i = 0; i < NUM_TASKS; ++i) { rt_task_delete(&tasks[i]); rt_sem_delete(&sems[i]); } rt_sem_delete(&sync_sem); rt_mbx_delete(&mbx_in); rt_mbx_delete(&mbx_out); }
static long long user_srq_handler(unsigned long whatever) { long long time; ++scount; if (whatever == 1) { return (long long)((TIMER_FREQ*1000)/HZ); } if (whatever == 2) { return (long long)scount; } down_interruptible(&sem); // let's show how to communicate. Copy to and from user shall allow any kind of // data interchange and service. time = llimd(rtai_rdtsc(), 1000000, CPU_FREQ); copy_to_user((long long *)whatever, &time, sizeof(long long)); return time; }
static void *fun(int idx) { unsigned int loops = LOOPS; while(loops--) { rt_printk("TASK %d 1 COND/TIMED PREWLOCKED\n", idx); if (idx%2) { if (pthread_rwlock_trywrlock(&rwl)) { rt_printk("TASK %d 1 COND PREWLOCKED FAILED GO UNCOND\n", idx); pthread_rwlock_wrlock(&rwl); } } else { struct timespec abstime; abstime.tv_sec = llimd(rt_get_cpu_time_ns(), 1, 1000000000); abstime.tv_nsec = 20000; if (pthread_rwlock_timedwrlock(&rwl, &abstime) < 0) { rt_printk("TASK %d 1 TIMED PREWLOCKED FAILED GO UNCOND\n", idx); pthread_rwlock_wrlock(&rwl); } } rt_printk("TASK %d 1 WLOCKED\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 2 COND PREWLOCK\n", idx); if (pthread_rwlock_trywrlock(&rwl)) { rt_printk("TASK %d 2 COND PREWLOCK FAILED GO UNCOND\n", idx); pthread_rwlock_wrlock(&rwl); } rt_printk("TASK %d 2 WLOCK\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 3 PREWLOCK\n", idx); pthread_rwlock_wrlock(&rwl); rt_printk("TASK %d 3 WLOCK\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 3 PREWUNLOCK\n", idx); pthread_rwlock_unlock(&rwl); rt_printk("TASK %d 3 WUNLOCK\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 2 PREWUNLOCK\n", idx); pthread_rwlock_unlock(&rwl); rt_printk("TASK %d 2 WUNLOCK\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 1 PREWUNLOCKED\n", idx); pthread_rwlock_unlock(&rwl); rt_printk("TASK %d 1 WUNLOCKED\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 1 COND/TIMED PRERDLOCKED\n", idx); if (idx%2) { if (pthread_rwlock_tryrdlock(&rwl)) { rt_printk("TASK %d 1 COND PRERDLOCKED FAILED GO UNCOND\n", idx); pthread_rwlock_rdlock(&rwl); } } else { struct timespec abstime; abstime.tv_sec = llimd(rt_get_cpu_time_ns(), 1, 1000000000); abstime.tv_nsec = 20000; if (pthread_rwlock_timedrdlock(&rwl, &abstime) < 0) { rt_printk("TASK %d 1 TIMED PRERDLOCKED FAILED GO UNCOND\n", idx); pthread_rwlock_rdlock(&rwl); } } rt_printk("TASK %d 1 RDLOCKED\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 2 COND PRERDLOCK\n", idx); if (pthread_rwlock_tryrdlock(&rwl)) { rt_printk("TASK %d 2 COND PRERDLOCK FAILED GO UNCOND\n", idx); pthread_rwlock_rdlock(&rwl); } rt_printk("TASK %d 2 RDLOCK\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 3 PRERDLOCK\n", idx); pthread_rwlock_rdlock(&rwl); rt_printk("TASK %d 3 RDLOCK\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 3 PRERDUNLOCK\n", idx); pthread_rwlock_unlock(&rwl); rt_printk("TASK %d 3 RDUNLOCK\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 2 PRERDUNLOCK\n", idx); pthread_rwlock_unlock(&rwl); rt_printk("TASK %d 2 RDUNLOCK\n", idx); rt_busy_sleep(100000); rt_printk("TASK %d 1 PRERDUNLOCK\n", idx); pthread_rwlock_unlock(&rwl); rt_printk("TASK %d 1 RDUNLOCK\n", idx); rt_busy_sleep(100000); } extcnt[idx - 1] = loops; rt_sleep(nano2count(10000000)); rt_printk("TASK %d EXITED\n", idx); cleanup = 1; return 0; }