Gilles Chanteperdrix wrote:
> Jan Kiszka wrote:
> 
>> [1]http://thread.gmane.org/gmane.linux.real-time.xenomai.devel/5412/focus=5405
>>
> always-put-xnthread-base-into-registry.patch:
>       I understand the need, but I will cowardly let Philippe decide whether
> he likes the implementation details.
> 
> handle-base-xn_sys_current-1.patch:
>       In some places (pse51_mutex_timedlock_inner for instances) you use
> XN_NO_HANDLE, in others (pse51_mutex_timedlock for instances) you use
> NULL, are the two equivalents ? If yes, should not we always use the
> same consistently ? Otherwise looks ok.

I fail to find the NULL spots - which pse51_mutex_timedlock do you mean?

> 
> remove-xnarch_atomic_intptr.patch:
>       Ok.
> 
> spread-xeno_set_current.patch:
>       Ok. This is even a bug fix.
> 
> xnsynch refactoring:
>       things have moved too much to see what has really changed in
> xnsynch_wakeup_one_sleeper and xnsynch_sleep_on. But is not there a
> common behaviour between the old and new services that could be factored
> ? But otherwise I agree with the general idea of the patch, this is what
> we had discussed with Philippe.

Yes, the diff is unfortunate due to a reordering of the function within
synch.c. Here is a direct diff of both services:

--- a   2008-09-22 10:06:56.000000000 +0200
+++ b   2008-09-22 10:07:39.000000000 +0200
@@ -1,112 +1,47 @@
 void xnsynch_sleep_on(xnsynch_t *synch, xnticks_t timeout,
                      xntmode_t timeout_mode)
 {
-       xnthread_t *thread = xnpod_current_thread(), *owner;
+       xnthread_t *thread = xnpod_current_thread();
        spl_t s;
 
+       XENO_BUGON(NUCLEUS, testbits(synch->status, XNSYNCH_OWNER));
+
        xnlock_get_irqsave(&nklock, s);
 
        trace_mark(xn_nucleus_synch_sleepon,
                   "thread %p thread_name %s synch %p",
                   thread, xnthread_name(thread), synch);
 
-       if (!testbits(synch->status, XNSYNCH_PRIO)) { /* i.e. FIFO */
+       if (!testbits(synch->status, XNSYNCH_PRIO)) /* i.e. FIFO */
                appendpq(&synch->pendq, &thread->plink);
-               xnpod_suspend_thread(thread, XNPEND, timeout, timeout_mode, 
synch);
-               goto unlock_and_exit;
-       }
-
-       if (!testbits(synch->status, XNSYNCH_PIP)) { /* i.e. no ownership */
-               insertpqf(&synch->pendq, &thread->plink, thread->cprio);
-               xnpod_suspend_thread(thread, XNPEND, timeout, timeout_mode, 
synch);
-               goto unlock_and_exit;
-       }
-
-redo:
-       owner = synch->owner;
-
-       if (!owner) {
-               synch->owner = thread;
-               xnthread_clear_info(thread, XNRMID | XNTIMEO | XNBREAK);
-               goto unlock_and_exit;
-       }
-
-       if (thread->cprio > owner->cprio) {
-               if (xnthread_test_info(owner, XNWAKEN) && owner->wwake == 
synch) {
-                       /* Ownership is still pending, steal the resource. */
-                       synch->owner = thread;
-                       xnthread_clear_info(thread, XNRMID | XNTIMEO | XNBREAK);
-                       xnthread_set_info(owner, XNROBBED);
-                       goto unlock_and_exit;
-               }
-
-               if (!xnthread_test_state(owner, XNBOOST)) {
-                       owner->bprio = owner->cprio;
-                       xnthread_set_state(owner, XNBOOST);
-               }
-
-               if (testbits(synch->status, XNSYNCH_CLAIMED))
-                       removepq(&owner->claimq, &synch->link);
-               else
-                       __setbits(synch->status, XNSYNCH_CLAIMED);
-
-               insertpqf(&owner->claimq, &synch->link, thread->cprio);
-               insertpqf(&synch->pendq, &thread->plink, thread->cprio);
-               xnsynch_renice_thread(owner, thread->cprio);
-       } else
+       else /* i.e. priority-sorted */
                insertpqf(&synch->pendq, &thread->plink, thread->cprio);
 
        xnpod_suspend_thread(thread, XNPEND, timeout, timeout_mode, synch);
 
-       if (xnthread_test_info(thread, XNRMID | XNTIMEO | XNBREAK))
-               goto unlock_and_exit;
-
-       if (xnthread_test_info(thread, XNROBBED)) {
-               /* Somebody stole us the ownership while we were ready
-                  to run, waiting for the CPU: we need to wait again
-                  for the resource. */
-               if (timeout_mode != XN_RELATIVE || timeout == XN_INFINITE)
-                       goto redo;
-               timeout = xntimer_get_timeout_stopped(&thread->rtimer);
-               if (timeout > 1) /* Otherwise, it's too late. */
-                       goto redo;
-               xnthread_set_info(thread, XNTIMEO);
-       }
-
-      unlock_and_exit:
-
-       thread->wwake = NULL;
-       xnthread_clear_info(thread, XNWAKEN);
-
        xnlock_put_irqrestore(&nklock, s);
 }
 
 xnthread_t *xnsynch_wakeup_one_sleeper(xnsynch_t *synch)
 {
-       xnthread_t *thread = NULL, *lastowner;
+       xnthread_t *thread = NULL;
        xnpholder_t *holder;
        spl_t s;
 
+       XENO_BUGON(NUCLEUS, testbits(synch->status, XNSYNCH_OWNER));
+
        xnlock_get_irqsave(&nklock, s);
 
-       lastowner = synch->owner;
        holder = getpq(&synch->pendq);
 
        if (holder) {
                thread = link2thread(holder, plink);
                thread->wchan = NULL;
-               thread->wwake = synch;
-               synch->owner = thread;
-               xnthread_set_info(thread, XNWAKEN);
                trace_mark(xn_nucleus_synch_wakeup_one,
                           "thread %p thread_name %s synch %p",
                           thread, xnthread_name(thread), synch);
                xnpod_resume_thread(thread, XNPEND);
-       } else
-               synch->owner = NULL;
-
-       if (testbits(synch->status, XNSYNCH_CLAIMED))
-               xnsynch_clear_boost(synch, lastowner);
+       }
 
        xnlock_put_irqrestore(&nklock, s);
 

Jan

-- 
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to