Beispiel #1
0
static void rt_fractionated_sleep(RTIME OneUnit)
{
#define FRACT 100
	int i = FRACT;
	while (i--) {
		rt_sleep(llimd(OneUnit, 1, FRACT));
	}
}
Beispiel #2
0
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);
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}