diff packages/kernel/current/include/sched.hxx @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children 443894e2e912
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/kernel/current/include/sched.hxx
@@ -0,0 +1,228 @@
+#ifndef CYGONCE_KERNEL_SCHED_HXX
+#define CYGONCE_KERNEL_SCHED_HXX
+
+//==========================================================================
+//
+//	sched.hxx
+//
+//	Scheduler class declaration(s)
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//
+// -------------------------------------------
+// The contents of this file are subject to the Cygnus eCos Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License.  You may obtain a copy of the License at
+// http://sourceware.cygnus.com/ecos
+// 
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
+// License for the specific language governing rights and limitations under
+// the License.
+// 
+// The Original Code is eCos - Embedded Cygnus Operating System, released
+// September 30, 1998.
+// 
+// The Initial Developer of the Original Code is Cygnus.  Portions created
+// by Cygnus are Copyright (C) 1998 Cygnus Solutions.  All Rights Reserved.
+// -------------------------------------------
+//
+//####COPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): 	nickg
+// Contributors:	nickg
+// Date:	1997-09-09
+// Purpose:	Define Scheduler class interfaces
+// Description:	These class definitions supply the internal API
+//              used to scheduler threads. 
+// Usage:	#include <cyg/kernel/sched.hxx>
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+
+#include <cyg/kernel/ktypes.h>
+#include <cyg/infra/cyg_ass.h>         // assertion macros
+
+// -------------------------------------------------------------------------
+// Scheduler base class. This defines stuff that is needed by the
+// specific scheduler implementation. Each scheduler comprises three
+// classes: Cyg_Scheduler_Base, Cyg_Scheduler_Implementation which
+// inherits from it and Cyg_Scheduler which inherits from _it_ in turn.
+
+class Cyg_Scheduler_Base
+{
+    friend class Cyg_HardwareThread;
+    friend class Cyg_SchedThread;
+    
+protected:
+    // The following variables are implicit in the API, but are
+    // not publically visible.
+
+    static volatile cyg_ucount32 sched_lock;    // lock counter
+
+    static Cyg_Thread   *current_thread;        // current running thread
+
+    static cyg_bool     need_reschedule;        // set when schedule needed
+
+    static cyg_ucount32 thread_switches;        // count of number of thread switches
+};
+
+// -------------------------------------------------------------------------
+// Include the scheduler implementation header
+
+#include CYGPRI_KERNEL_SCHED_IMPL_HXX
+
+// Do some checking that we have a consistent universe.
+
+#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INHERITANCE
+# ifndef CYGIMP_THREAD_PRIORITY
+#  error Priority inheritance will not work without priorities!!!
+# endif
+# if CYG_SCHED_UNIQUE_PRIORITIES
+#  error Priority inheritance needs non-unique priorities!!!
+# endif
+#endif
+
+// -------------------------------------------------------------------------
+// Scheduler class. This is the public scheduler interface seen by the
+// rest of the kernel.
+
+class Cyg_Scheduler
+    : public Cyg_Scheduler_Implementation
+{
+    friend class Cyg_Thread;
+    
+    // This function is the actual implementation of the unlock
+    // function.  The unlock() later is an inline shell that deals
+    // with the common case.
+    
+    static void             unlock_inner();
+    
+public:
+
+    CYGDBG_DEFINE_CHECK_THIS
+
+    // The following API functions are common to all scheduler
+    // implementations.
+
+    // claim the preemption lock
+    static void             lock();         
+
+    // release the preemption lock
+    static void             unlock();
+
+    // return a pointer to the current thread
+    static Cyg_Thread       *get_current_thread();
+
+    // Return current value of lock
+    static cyg_ucount32 get_sched_lock();
+
+    // Return current number of thread switches
+    static cyg_ucount32 get_thread_switches();
+    
+    // Start execution of the scheduler
+    static void start() __attribute__ ((noreturn));
+    
+    // The only  scheduler instance should be this one...
+    static Cyg_Scheduler scheduler;
+
+};
+
+// -------------------------------------------------------------------------
+// This class encapsulates the scheduling abstractions in a thread.
+// Cyg_SchedThread is included as a base class of Cyg_Thread. The actual
+// implementation of the abstractions is in Cyg_SchedThread_Implementation
+// so this class has little to do.
+
+class Cyg_SchedThread
+    : public Cyg_SchedThread_Implementation
+{
+    friend class Cyg_ThreadQueue_Implementation;
+    friend class Cyg_Scheduler_Implementation;
+    
+    Cyg_ThreadQueue     *queue;
+
+
+public:
+
+    Cyg_SchedThread(Cyg_Thread *thread, CYG_ADDRWORD sched_info);
+
+    // Return current queue pointer
+
+    Cyg_ThreadQueue     *get_current_queue();
+    
+    // Remove this thread from current queue
+    void remove();
+
+#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INHERITANCE
+
+private:
+
+    // For all priority inheritance mechanisms we need to
+    // keep track of how many mutexes we have locked.
+    cyg_count32         mutex_count;
+
+public:    
+    // Count and uncount the number of mutexes held by
+    // this thread.
+    void count_mutex() { mutex_count++; };
+    void uncount_mutex() { mutex_count--; };
+    
+protected:    
+#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INHERITANCE_SIMPLE
+
+    // The simple priority inheritance mechanism simply needs
+    // somewhere to store the base priority of the current thread.
+    
+    cyg_priority        original_priority;      // our original priority
+
+    cyg_bool            priority_inherited;     // have we inherited?
+    
+#endif
+
+public:
+
+    // Inherit the priority of the provided thread if it
+    // has higher priority than this.
+    void inherit_priority( Cyg_Thread *thread);
+
+    // Lose priority inheritance
+    void disinherit_priority();
+    
+#endif
+    
+};
+
+// -------------------------------------------------------------------------
+// Simple inline accessor functions
+
+inline Cyg_Thread *Cyg_Scheduler::get_current_thread()
+{
+    return current_thread;
+}
+
+// Return current value of lock
+inline cyg_ucount32 Cyg_Scheduler::get_sched_lock()
+{
+    return sched_lock;
+}
+
+// Return current number of thread switches
+inline cyg_ucount32 Cyg_Scheduler::get_thread_switches()
+{
+    return thread_switches;
+}
+
+// Return current queue pointer
+inline Cyg_ThreadQueue *Cyg_SchedThread::get_current_queue()
+{
+    return queue;
+}
+
+// -------------------------------------------------------------------------
+#endif // ifndef __SCHED_HXX__
+// EOF sched.hxx