bool RWLockImplLxrt38::writeLock()
{
#ifdef STRICT_LXRT_CHECKS
  if (!icl_core::os::isThisLxrtTask())
  {
    PRINTF("RWLockImplLxrt38::writeLock: Called from a Linux task!\n");
    return false;
  }
#endif
  return rt_rwl_wrlock(m_rwlock) == 0;
}
Esempio n. 2
0
static void fun(long idx)
{
	unsigned int loops = LOOPS;
	while(loops--) {
		rt_printk("TASK %d 1 COND/TIMED PREWLOCKED\n", idx);
		if (idx%2) {
			if (rt_rwl_wrlock_if(&rwl)) {
				rt_printk("TASK %d 1 COND PREWLOCKED FAILED GO UNCOND\n", idx);
				rt_rwl_wrlock(&rwl);
			}
		} else if (rt_rwl_wrlock_timed(&rwl, nano2count(20000)) >= SEM_TIMOUT) {
			rt_printk("TASK %d 1 TIMED PREWLOCKED FAILED GO UNCOND\n", idx);
			rt_rwl_wrlock(&rwl);
		}
		rt_printk("TASK %d 1 WLOCKED\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 2 COND PREWLOCK\n", idx);
		if (rt_rwl_wrlock_if(&rwl)) {
			rt_printk("TASK %d 2 COND PREWLOCK FAILED GO UNCOND\n", idx);
			rt_rwl_wrlock(&rwl);
		}
		rt_printk("TASK %d 2 WLOCK\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 3 PREWLOCK\n", idx);
		rt_rwl_wrlock(&rwl);
		rt_printk("TASK %d 3 WLOCK\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 3 PREWUNLOCK\n", idx);
		rt_rwl_unlock(&rwl);
		rt_printk("TASK %d 3 WUNLOCK\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 2 PREWUNLOCK\n", idx);
		rt_rwl_unlock(&rwl);
		rt_printk("TASK %d 2 WUNLOCK\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 1 PREWUNLOCKED\n", idx);
		rt_rwl_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 (rt_rwl_rdlock_if(&rwl)) {
				rt_printk("TASK %d 1 COND PRERDLOCKED FAILED GO UNCOND\n", idx);
				rt_rwl_rdlock(&rwl);
			}
		} else if (rt_rwl_rdlock_timed(&rwl, nano2count(20000)) >= SEM_TIMOUT) {
			rt_printk("TASK %d 1 TIMED PRERDLOCKED FAILED GO UNCOND\n", idx);
			rt_rwl_rdlock(&rwl);
		}
		rt_printk("TASK %d 1 RDLOCKED\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 2 COND PRERDLOCK\n", idx);
		if (rt_rwl_rdlock_if(&rwl)) {
			rt_printk("TASK %d 2 COND PRERDLOCK FAILED GO UNCOND\n", idx);
			rt_rwl_rdlock(&rwl);
		}
		rt_printk("TASK %d 2 RDLOCK\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 3 PRERDLOCK\n", idx);
		rt_rwl_rdlock(&rwl);
		rt_printk("TASK %d 3 RDLOCK\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 3 PRERDUNLOCK\n", idx);
		rt_rwl_unlock(&rwl);
		rt_printk("TASK %d 3 RDUNLOCK\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 2 PRERDUNLOCK\n", idx);
		rt_rwl_unlock(&rwl);
		rt_printk("TASK %d 2 RDUNLOCK\n", idx);
		rt_busy_sleep(100000);
		rt_printk("TASK %d 1 PRERDUNLOCK\n", idx);
		rt_rwl_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);
}