Changes between Version 10 and Version 11 of Developer/SMP


Ignore:
Timestamp:
Jan 13, 2014, 2:17:57 PM (6 years ago)
Author:
Sh
Comment:

/* Design Issues */

Legend:

Unmodified
Added
Removed
Modified
  • Developer/SMP

    v10 v11  
    142142
    143143[wiki:File:rtems-smp-affinity.png File:rtems-smp-affinity.png]
    144 =  Implementation  =
    145 
    146 =  = Testing ==
     144=  Atomic Operations  =
     145
     146==  Status  ==
     147
     148
     149The <stdatomic.h> header file is now available in Newlib.  GCC 4.8 supports C11 atomic operations.  Proper atomic operations support for LEON3 is included in
     150GCC 4.9.  According to the SPARC GCC maintainer it is possible to back port this to GCC 4.8.  A GSoC 2013 project works on an atomic operations API for RTEMS.
     151One part will be a read-write lock using a phase-fair lock implementation.
     152
     153Example ticket lock with C11 atomics.
     154 #include <stdatomic.h>
     155 
     156 struct ticket {
     157        atomic_uint ticket;
     158        atomic_uint now_serving;
     159 };
     160 
     161 void acquire(struct ticket *t)
     162 {
     163        unsigned int my_ticket = atomic_fetch_add_explicit(&t->ticket, 1, memory_order_relaxed);
     164 
     165        while (atomic_load_explicit(&t->now_serving, memory_order_acquire) != my_ticket) {
     166                /* Wait */
     167        }
     168 }
     169 
     170 void release(struct ticket *t)
     171 {
     172        unsigned int current_ticket = atomic_load_explicit(&t->now_serving, memory_order_relaxed);
     173 
     174        atomic_store_explicit(&t->now_serving, current_ticket + 1U, memory_order_release);
     175 }
     176
     177The generated assembler code looks pretty good.  Please note that GCC generates ''CAS'' instructions and not ''CASA'' instructions.
     178        .file   "ticket.c"
     179        .section        ".text"
     180        .align 4
     181        .global acquire
     182        .type   acquire, #function
     183        .proc   020
     184 acquire:
     185        ld      [%o0], %g1
     186        mov     %g1, %g2
     187 .LL7:
     188        add     %g1, 1, %g1
     189        cas     [%o0], %g2, %g1
     190        cmp     %g1, %g2
     191        bne,a   .LL7
     192         mov    %g1, %g2
     193        add     %o0, 4, %o0
     194 .LL4:
     195        ld      [%o0], %g1
     196        cmp     %g1, %g2
     197        bne     .LL4
     198         nop
     199        jmp     %o7+8
     200         nop
     201        .size   acquire, .-acquire
     202        .align 4
     203        .global release
     204        .type   release, #function
     205        .proc   020
     206 release:
     207        ld      [%o0+4], %g1
     208        add     %g1, 1, %g1
     209        st      %g1, [%o0+4]
     210        jmp     %o7+8
     211         nop
     212        .size   release, .-release
     213        .ident  "GCC: (GNU) 4.9.0 20130917 (experimental)"
     214=  = Future Directions ====
     215
     216
     217 *  Review and integrate the GSoC work.
     218 *  Make use of atomic operations.
     219=  = Implementation ==
     220
     221
     222== Testing ==
    147223
    148224