source: rtems/cpukit/score/Makefile.am @ d19cce29

4.115
Last change on this file since d19cce29 was d19cce29, checked in by Sebastian Huber <sebastian.huber@…>, on 08/05/13 at 12:54:11

score: Per-CPU thread dispatch disable level

Use a per-CPU thread dispatch disable level. So instead of one global
thread dispatch disable level we have now one instance per processor.
This is a major performance improvement for SMP. On non-SMP
configurations this may simplifiy the interrupt entry/exit code.

The giant lock is still present, but it is now decoupled from the thread
dispatching in _Thread_Dispatch(), _Thread_Handler(),
_Thread_Restart_self() and the interrupt entry/exit. Access to the
giant lock is now available via _Giant_Acquire() and _Giant_Release().
The giant lock is still implicitly acquired via
_Thread_Dispatch_decrement_disable_level().

The giant lock is only acquired for high-level operations in interrupt
handlers (e.g. release of a semaphore, sending of an event).

As a side-effect this change fixes the lost thread dispatch necessary
indication bug in _Thread_Dispatch().

A per-CPU thread dispatch disable level greatly simplifies the SMP
support for the interrupt entry/exit code since no spin locks have to be
acquired in this area. It is only necessary to get the current
processor index and use this to calculate the address of the own per-CPU
control. This reduces the interrupt latency considerably.

All elements for the interrupt entry/exit code are now part of the
Per_CPU_Control structure: thread dispatch disable level, ISR nest level
and thread dispatch necessary. Nothing else is required (except CPU
port specific stuff like on SPARC).

  • Property mode set to 100644
File size: 13.2 KB
RevLine 
[0c819966]1include $(top_srcdir)/automake/multilib.am
[53fa63e]2include $(top_srcdir)/automake/compile.am
[e1d8abb]3
[4df3f89]4SUBDIRS = cpu
[0c819966]5
6## include
7
8include_rtemsdir = $(includedir)/rtems
9
[a2680da0]10include_rtems_HEADERS = include/rtems/debug.h
11include_rtems_HEADERS += include/rtems/system.h
12include_rtems_HEADERS += include/rtems/seterr.h
13include_rtems_HEADERS += include/rtems/bspsmp.h
[0c819966]14
15include_rtems_scoredir = $(includedir)/rtems/score
16
[a2680da0]17include_rtems_score_HEADERS = include/rtems/score/address.h
18include_rtems_score_HEADERS += include/rtems/score/apiext.h
19include_rtems_score_HEADERS += include/rtems/score/apimutex.h
[95519eed]20include_rtems_score_HEADERS += include/rtems/score/assert.h
[a2680da0]21include_rtems_score_HEADERS += include/rtems/score/chain.h
[6e93dc4a]22include_rtems_score_HEADERS += include/rtems/score/chainimpl.h
[a2680da0]23include_rtems_score_HEADERS += include/rtems/score/context.h
24include_rtems_score_HEADERS += include/rtems/score/copyrt.h
25include_rtems_score_HEADERS += include/rtems/score/corebarrier.h
[bb2d9f9]26include_rtems_score_HEADERS += include/rtems/score/corebarrierimpl.h
[a2680da0]27include_rtems_score_HEADERS += include/rtems/score/coremsg.h
[b5d514f]28include_rtems_score_HEADERS += include/rtems/score/coremsgimpl.h
[a2680da0]29include_rtems_score_HEADERS += include/rtems/score/coremutex.h
[20e239c2]30include_rtems_score_HEADERS += include/rtems/score/coremuteximpl.h
[a2680da0]31include_rtems_score_HEADERS += include/rtems/score/coresem.h
[c4f58558]32include_rtems_score_HEADERS += include/rtems/score/coresemimpl.h
[a2680da0]33include_rtems_score_HEADERS += include/rtems/score/heap.h
[e6f7f81]34include_rtems_score_HEADERS += include/rtems/score/heapimpl.h
[a2680da0]35include_rtems_score_HEADERS += include/rtems/score/protectedheap.h
36include_rtems_score_HEADERS += include/rtems/score/interr.h
37include_rtems_score_HEADERS += include/rtems/score/isr.h
[df00777]38include_rtems_score_HEADERS += include/rtems/score/isrlevel.h
[2d915cf]39include_rtems_score_HEADERS += include/rtems/score/isrlock.h
[8fb2bea]40include_rtems_score_HEADERS += include/rtems/score/freechain.h
[a2680da0]41include_rtems_score_HEADERS += include/rtems/score/object.h
[a2e3f33]42include_rtems_score_HEADERS += include/rtems/score/objectimpl.h
[a2680da0]43include_rtems_score_HEADERS += include/rtems/score/percpu.h
44include_rtems_score_HEADERS += include/rtems/score/priority.h
45include_rtems_score_HEADERS += include/rtems/score/prioritybitmap.h
[f0bfd7d8]46include_rtems_score_HEADERS += include/rtems/score/prioritybitmapimpl.h
[a2680da0]47include_rtems_score_HEADERS += include/rtems/score/rbtree.h
[93fb3cb0]48include_rtems_score_HEADERS += include/rtems/score/rbtreeimpl.h
[a2680da0]49include_rtems_score_HEADERS += include/rtems/score/scheduler.h
[c6e21ee1]50include_rtems_score_HEADERS += include/rtems/score/schedulerimpl.h
[82db8e56]51include_rtems_score_HEADERS += include/rtems/score/schedulercbs.h
[5472ad41]52include_rtems_score_HEADERS += include/rtems/score/scheduleredf.h
[a2680da0]53include_rtems_score_HEADERS += include/rtems/score/schedulerpriority.h
[f068384e]54include_rtems_score_HEADERS += include/rtems/score/schedulerpriorityimpl.h
[a2680da0]55include_rtems_score_HEADERS += include/rtems/score/schedulersimple.h
[bd5606ab]56include_rtems_score_HEADERS += include/rtems/score/schedulersimpleimpl.h
[edde99b]57include_rtems_score_HEADERS += include/rtems/score/smp.h
[3ccce23]58include_rtems_score_HEADERS += include/rtems/score/smplock.h
[a2680da0]59include_rtems_score_HEADERS += include/rtems/score/stack.h
[218286bc]60include_rtems_score_HEADERS += include/rtems/score/stackimpl.h
[a2680da0]61include_rtems_score_HEADERS += include/rtems/score/states.h
[fe6c170c]62include_rtems_score_HEADERS += include/rtems/score/statesimpl.h
[a2680da0]63include_rtems_score_HEADERS += include/rtems/score/sysstate.h
64include_rtems_score_HEADERS += include/rtems/score/thread.h
[5618c37a]65include_rtems_score_HEADERS += include/rtems/score/threadimpl.h
[4fc370e]66include_rtems_score_HEADERS += include/rtems/score/threaddispatch.h
[a2680da0]67include_rtems_score_HEADERS += include/rtems/score/threadq.h
[a112364]68include_rtems_score_HEADERS += include/rtems/score/threadqimpl.h
[a2680da0]69include_rtems_score_HEADERS += include/rtems/score/threadsync.h
70include_rtems_score_HEADERS += include/rtems/score/timespec.h
71include_rtems_score_HEADERS += include/rtems/score/timestamp.h
72include_rtems_score_HEADERS += include/rtems/score/timestamp64.h
[965a442]73include_rtems_score_HEADERS += include/rtems/score/tod.h
[f031df0e]74include_rtems_score_HEADERS += include/rtems/score/todimpl.h
[a2680da0]75include_rtems_score_HEADERS += include/rtems/score/userext.h
[3be0c9a]76include_rtems_score_HEADERS += include/rtems/score/userextimpl.h
[a2680da0]77include_rtems_score_HEADERS += include/rtems/score/watchdog.h
[4b48ece0]78include_rtems_score_HEADERS += include/rtems/score/watchdogimpl.h
[a2680da0]79include_rtems_score_HEADERS += include/rtems/score/wkspace.h
80include_rtems_score_HEADERS += include/rtems/score/cpuopts.h
81include_rtems_score_HEADERS += include/rtems/score/basedefs.h
[2e7f5798]82if ATOMIC
[9d23df2]83include_rtems_score_HEADERS += include/rtems/score/atomic.h
[34229d5]84include_rtems_score_HEADERS += include/rtems/score/cpustdatomic.h
[2e7f5798]85endif
[42bb344e]86
[88157a7]87if HAS_PTHREADS
[a2680da0]88include_rtems_score_HEADERS += include/rtems/score/corespinlock.h
[c71b596]89include_rtems_score_HEADERS += include/rtems/score/corespinlockimpl.h
[a2680da0]90include_rtems_score_HEADERS += include/rtems/score/corerwlock.h
[cbdabc8]91include_rtems_score_HEADERS += include/rtems/score/corerwlockimpl.h
[0df035b]92endif
93
[0c819966]94if HAS_MP
[8f83131]95# We only build multiprocessing related files if HAS_MP was defined
[a2680da0]96include_rtems_score_HEADERS += include/rtems/score/mpci.h
[7f04cb18]97include_rtems_score_HEADERS += include/rtems/score/mpciimpl.h
[a2680da0]98include_rtems_score_HEADERS += include/rtems/score/mppkt.h
99include_rtems_score_HEADERS += include/rtems/score/objectmp.h
100include_rtems_score_HEADERS += include/rtems/score/threadmp.h
[0c819966]101endif
102
[ba7bc099]103if HAS_SMP
104include_rtems_score_HEADERS += include/rtems/score/schedulersimplesmp.h
105endif
106
[0c819966]107## src
108
[4df3f89]109noinst_LIBRARIES = libscore.a
110libscore_a_SOURCES =
111libscore_a_CPPFLAGS = $(AM_CPPFLAGS)
112
[0c819966]113# We only build multiprocessing related files if HAS_MP was defined
[4df3f89]114if HAS_MP
115libscore_a_SOURCES += src/mpci.c src/objectmp.c src/threadmp.c
116endif
[0c819966]117
[42bb344e]118if HAS_SMP
[a936aa49]119libscore_a_SOURCES += src/schedulersimplesmp.c
120libscore_a_SOURCES += src/smp.c
[42bb344e]121endif
[06dcaf0]122
[8fd28d83]123## CORE_APIMUTEX_C_FILES
[a2e3f33]124libscore_a_SOURCES += src/apimutex.c \
[8fd28d83]125    src/apimutexlock.c src/apimutexunlock.c
126
[9c191ee]127## CORE_BARRIER_C_FILES
128libscore_a_SOURCES += src/corebarrier.c src/corebarrierrelease.c \
129    src/corebarrierwait.c
130
[4df3f89]131## CORE_MESSAGE_QUEUE_C_FILES
132libscore_a_SOURCES += src/coremsg.c src/coremsgbroadcast.c \
[8f83131]133    src/coremsgclose.c src/coremsgflush.c src/coremsgflushwait.c \
134    src/coremsginsert.c src/coremsgflushsupp.c src/coremsgseize.c \
135    src/coremsgsubmit.c
[0c819966]136
[4df3f89]137## CORE_MUTEX_C_FILES
138libscore_a_SOURCES += src/coremutex.c src/coremutexflush.c \
[bc2b8df6]139    src/coremutexseize.c src/coremutexsurrender.c \
140    src/coremutexseizeintr.c
[0c819966]141
[11e8bc5]142## CORE_PERCPU_C_FILES
143libscore_a_SOURCES += src/percpu.c
[f1738ed]144libscore_a_SOURCES += src/percpuasm.c
[11e8bc5]145
[9c191ee]146## CORE_RWLOCK_C_FILES
[88157a7]147if HAS_PTHREADS
[9c191ee]148libscore_a_SOURCES += src/corerwlock.c src/corerwlockobtainread.c \
[047d67a]149    src/corerwlockobtainwrite.c src/corerwlockrelease.c src/corerwlocktimeout.c
[88157a7]150endif
[9c191ee]151
[4df3f89]152## CORE_SEMAPHORE_C_FILES
153libscore_a_SOURCES += src/coresem.c src/coresemflush.c src/coresemseize.c \
[0c819966]154    src/coresemsurrender.c
155
[9c191ee]156## CORE_SPINLOCK_C_FILES
[88157a7]157if HAS_PTHREADS
[9c191ee]158libscore_a_SOURCES += src/corespinlock.c src/corespinlockrelease.c \
159    src/corespinlockwait.c
[0df035b]160endif
[9c191ee]161
[4df3f89]162## HEAP_C_FILES
[e746a88]163libscore_a_SOURCES += src/heap.c src/heapallocate.c src/heapextend.c \
164    src/heapfree.c src/heapsizeofuserarea.c src/heapwalk.c src/heapgetinfo.c \
[28a0887]165    src/heapgetfreeinfo.c src/heapresizeblock.c src/heapiterate.c \
[6ccfe72]166    src/heapgreedy.c src/heapnoextend.c
[0c819966]167
[4df3f89]168## OBJECT_C_FILES
[584ab9e]169libscore_a_SOURCES += src/objectallocate.c src/objectclose.c \
[ce19f1fa]170    src/objectextendinformation.c src/objectfree.c src/objectget.c \
171    src/objectgetisr.c src/objectgetnext.c src/objectinitializeinformation.c \
172    src/objectnametoid.c src/objectnametoidstring.c \
[ff08b808]173    src/objectshrinkinformation.c src/objectgetnoprotection.c \
[6c06288]174    src/objectidtoname.c src/objectgetnameasstring.c src/objectsetname.c \
[9184270]175    src/objectgetinfo.c src/objectgetinfoid.c src/objectapimaximumclass.c \
[fe1dc22]176    src/objectnamespaceremove.c \
177    src/objectactivecount.c
[0c819966]178
[0faa9dad]179## SCHEDULER_C_FILES
180libscore_a_SOURCES += src/scheduler.c
[62d947d]181libscore_a_SOURCES += src/schedulerdefaultallocatefree.c
[037cfd1]182libscore_a_SOURCES += src/schedulerdefaultreleasejob.c
[1ccb64e1]183libscore_a_SOURCES += src/schedulerdefaultstartidle.c
[3346106b]184libscore_a_SOURCES += src/schedulerdefaulttick.c
185libscore_a_SOURCES += src/schedulerdefaultupdate.c
[0faa9dad]186
187## SCHEDULERPRIORITY_C_FILES
188libscore_a_SOURCES += src/schedulerpriority.c \
[108c4b0]189    src/schedulerpriorityallocate.c \
190    src/schedulerpriorityblock.c \
191    src/schedulerpriorityenqueue.c \
192    src/schedulerpriorityenqueuefirst.c \
193    src/schedulerpriorityextract.c \
194    src/schedulerpriorityfree.c \
[ac9d2ecc]195    src/schedulerpriorityprioritycompare.c \
[108c4b0]196    src/schedulerpriorityschedule.c \
197    src/schedulerpriorityunblock.c \
198    src/schedulerpriorityupdate.c \
199    src/schedulerpriorityyield.c
[0faa9dad]200
[0118ed6]201## SCHEDULERSIMPLE_C_FILES
202libscore_a_SOURCES += src/schedulersimple.c \
203    src/schedulersimpleblock.c \
204    src/schedulersimpleenqueue.c \
205    src/schedulersimpleenqueuefirst.c \
206    src/schedulersimpleextract.c \
207    src/schedulersimplereadyqueueenqueue.c \
208    src/schedulersimplereadyqueueenqueuefirst.c \
209    src/schedulersimpleschedule.c \
210    src/schedulersimpleunblock.c \
211    src/schedulersimpleyield.c
212
[5472ad41]213## SCHEDULEREDF_C_FILES
214libscore_a_SOURCES += src/scheduleredf.c \
215    src/scheduleredfallocate.c \
216    src/scheduleredfblock.c \
217    src/scheduleredfenqueue.c \
218    src/scheduleredfenqueuefirst.c \
219    src/scheduleredfextract.c \
220    src/scheduleredffree.c \
221    src/scheduleredfprioritycompare.c \
222    src/scheduleredfreleasejob.c \
223    src/scheduleredfschedule.c \
224    src/scheduleredfunblock.c \
225    src/scheduleredfupdate.c \
226    src/scheduleredfyield.c
227
[82db8e56]228## SCHEDULERCBS_C_FILES
229libscore_a_SOURCES += src/schedulercbs.c \
[7a9288fe]230    src/schedulercbsallocate.c \
[82db8e56]231    src/schedulercbsattachthread.c \
232    src/schedulercbscleanup.c \
233    src/schedulercbscreateserver.c \
234    src/schedulercbsdestroyserver.c \
235    src/schedulercbsdetachthread.c \
236    src/schedulercbsgetapprovedbudget.c \
237    src/schedulercbsgetexecutiontime.c \
238    src/schedulercbsgetparameters.c \
239    src/schedulercbsgetremainingbudget.c \
240    src/schedulercbsgetserverid.c \
241    src/schedulercbssetparameters.c \
242    src/schedulercbsreleasejob.c \
243    src/schedulercbsunblock.c
244
[e746a88]245## PROTECTED_HEAP_C_FILES
[9224a751]246libscore_a_SOURCES += src/pheapallocate.c \
[7246c8e9]247    src/pheapextend.c src/pheapfree.c src/pheapgetsize.c \
248    src/pheapgetblocksize.c src/pheapgetfreeinfo.c src/pheapgetinfo.c \
[a89ae540]249    src/pheapinit.c src/pheapresizeblock.c src/pheapwalk.c src/pheapiterate.c
[e746a88]250
[8fb2bea]251## FREECHAIN_C_FILES
252libscore_a_SOURCES += src/freechain.c
253
[bd9baa81]254## RBTREE_C_FILES
255libscore_a_SOURCES += src/rbtree.c \
256    src/rbtreeextract.c src/rbtreefind.c src/rbtreefindheader.c \
[0f31ec5d]257    src/rbtreeget.c src/rbtreeinsert.c src/rbtreeiterate.c src/rbtreenext.c
[bd9baa81]258
[4df3f89]259## THREAD_C_FILES
260libscore_a_SOURCES += src/thread.c src/threadchangepriority.c \
[8f83131]261    src/threadclearstate.c src/threadclose.c src/threadcreateidle.c \
[569b3f4]262    src/threaddelayended.c src/threaddispatch.c \
[d7c3883]263    src/threadenabledispatch.c src/threaddisabledispatch.c \
[93f7ea15]264    src/threadget.c src/threadhandler.c src/threadinitialize.c \
[8bef4cc]265    src/threadloadenv.c src/threadready.c src/threadreset.c \
[59eb125]266    src/threadrestart.c src/threadsetpriority.c \
[8bef4cc]267    src/threadsetstate.c src/threadsettransient.c \
[93f7ea15]268    src/threadstackallocate.c src/threadstackfree.c src/threadstart.c \
[3203e09]269    src/threadstartmultitasking.c src/iterateoverthreads.c \
270    src/threadblockingoperationcancel.c
[3a8a999]271   
272if HAS_SMP
273libscore_a_SOURCES += src/threaddispatchdisablelevel.c
274endif
[0c819966]275
[4df3f89]276## THREADQ_C_FILES
277libscore_a_SOURCES += src/threadq.c src/threadqdequeue.c \
[8f83131]278    src/threadqdequeuefifo.c src/threadqdequeuepriority.c \
279    src/threadqenqueue.c src/threadqenqueuefifo.c \
280    src/threadqenqueuepriority.c src/threadqextract.c \
281    src/threadqextractfifo.c src/threadqextractpriority.c \
282    src/threadqextractwithproxy.c src/threadqfirst.c src/threadqfirstfifo.c \
[96d0b64]283    src/threadqfirstpriority.c src/threadqflush.c src/threadqrequeue.c \
[c57f26bd]284    src/threadqprocesstimeout.c src/threadqtimeout.c
[0c819966]285
[fc054ca]286## TIMESPEC_C_FILES
[412dbff6]287libscore_a_SOURCES += src/timespecaddto.c src/timespecfromticks.c \
[3a42e6fd]288    src/timespecisvalid.c src/timespeclessthan.c \
[c3330a8]289    src/timespecsubtract.c src/timespectoticks.c src/timespecdivide.c \
290    src/timespecdividebyinteger.c
[fc054ca]291
[e57cb3c]292## TIMESTAMP_INT64_C_FILES
293libscore_a_SOURCES += src/ts64addto.c src/ts64dividebyinteger.c \
294    src/ts64divide.c src/ts64equalto.c \
295    src/ts64getnanoseconds.c src/ts64getseconds.c \
[3a42e6fd]296    src/ts64lessthan.c \
[e57cb3c]297    src/ts64set.c src/ts64settozero.c src/ts64subtract.c \
[154721c4]298    src/ts64toticks.c src/ts64totimespec.c src/ts64totimeval.c
[e57cb3c]299
[4df3f89]300## TOD_C_FILES
[812da54]301libscore_a_SOURCES += src/coretod.c src/coretodset.c src/coretodget.c \
[62181b21]302    src/coretodgetuptimetimespec.c src/coretodtickle.c \
[9bf7467]303    src/coretodsecondssinceepoch.c \
[88c74ab]304    src/coretodtickspersec.c
[0c819966]305
[4df3f89]306## WATCHDOG_C_FILES
[812da54]307libscore_a_SOURCES += src/watchdog.c src/watchdogadjust.c \
[109ace3a]308    src/watchdogadjusttochain.c src/watchdoginsert.c src/watchdogremove.c \
[965a442]309    src/watchdogtickle.c src/watchdogreport.c src/watchdogreportchain.c
[0c819966]310
[c3db01d0]311## USEREXT_C_FILES
[b7de5de]312libscore_a_SOURCES += src/userextaddset.c \
[32b2c83]313    src/userext.c src/userextremoveset.c src/userextiterate.c
[c3db01d0]314
[4df3f89]315## STD_C_FILES
[c3db01d0]316libscore_a_SOURCES += src/apiext.c src/chain.c src/chainappend.c \
317    src/chainextract.c src/chainget.c src/chaininsert.c \
[a19ae9ec]318    src/chainappendempty.c src/chainprependempty.c src/chaingetempty.c \
[cbd07e4]319    src/chainnodecount.c \
[40883773]320    src/assertthreaddispatchingrepressed.c \
[141b311]321    src/interr.c src/isr.c src/wkspace.c src/wkstringduplicate.c
[0c819966]322
[4768a274]323EXTRA_DIST = src/Unlimited.txt
[0c819966]324
[dbe8e519]325DISTCLEANFILES = include/rtems/score/cpuopts.h
[8f83131]326
[6265b83]327include $(srcdir)/preinstall.am
[fed6210d]328include $(top_srcdir)/automake/subdirs.am
329include $(top_srcdir)/automake/local.am
Note: See TracBrowser for help on using the repository browser.