Mercurial > nand-ecoscentric
diff packages/kernel/current/include/mlqueue.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/mlqueue.hxx @@ -0,0 +1,243 @@ +#ifndef CYGONCE_KERNEL_MLQUEUE_HXX +#define CYGONCE_KERNEL_MLQUEUE_HXX + +//========================================================================== +// +// mlqueue.hxx +// +// Multi-Level Queue scheduler class declarations +// +//========================================================================== +//####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-10 +// Purpose: Define multilevel queue scheduler implementation +// Description: The classes defined here are used as base classes +// by the common classes that define schedulers and thread +// things. The MLQ scheduler in various configurations +// provides standard FIFO, round-robin and single priority +// schedulers. +// Usage: Included according to configuration by +// <cyg/kernel/sched.hxx> +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <cyg/kernel/ktypes.h> + +// ------------------------------------------------------------------------- +// The macro CYGNUM_KERNEL_SCHED_PRIORITIES contains the number of priorities +// supported by the scheduler. + +#ifndef CYGNUM_KERNEL_SCHED_PRIORITIES +#define CYGNUM_KERNEL_SCHED_PRIORITIES 32 // define a default +#endif + +// set bitmap size +#define CYGNUM_KERNEL_SCHED_BITMAP_SIZE CYGNUM_KERNEL_SCHED_PRIORITIES + +// ------------------------------------------------------------------------- +// The macro CYGNUM_KERNEL_SCHED_BITMAP_SIZE contains the number of bits that the +// scheduler bitmap should contain. It is derived from the number of prioirity +// levels defined by the configuration. + +#if CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 8 +typedef cyg_ucount8 cyg_sched_bitmap; +#elif CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 16 +typedef cyg_ucount16 cyg_sched_bitmap; +#elif CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 32 +typedef cyg_ucount32 cyg_sched_bitmap; +#else +#error Bitmaps greater than 32 bits not currently allowed +#endif + +// ------------------------------------------------------------------------- +// Customize the scheduler + +#define CYGIMP_THREAD_PRIORITY 1 // Threads have changable priorities +#define CYG_SCHED_UNIQUE_PRIORITIES 0 // Threads don't have unique priorities + +#define CYG_THREAD_MIN_PRIORITY (CYGNUM_KERNEL_SCHED_PRIORITIES-1) +#define CYG_THREAD_MAX_PRIORITY 0 + +// set default scheduling info value for thread constructors. +#define CYG_SCHED_DEFAULT_INFO CYG_THREAD_MAX_PRIORITY + +// ------------------------------------------------------------------------- +// Thread queue implementation. +// This class provides the (scheduler specific) implementation of the +// thread queue class. + +class Cyg_ThreadQueue_Implementation +{ + friend class Cyg_Scheduler_Implementation; + friend class Cyg_SchedThread_Implementation; + + Cyg_Thread *queue; + +protected: + + // API used by Cyg_ThreadQueue + + Cyg_ThreadQueue_Implementation(); // Constructor + + // Add thread to queue + void enqueue(Cyg_Thread *thread); + + // return first thread on queue + Cyg_Thread *highpri(); + + // remove first thread on queue + Cyg_Thread *dequeue(); + + // remove specified thread from queue + void remove(Cyg_Thread *thread); + + // test if queue is empty + cyg_bool empty(); + + void rotate(); // Rotate the queue +}; + +inline cyg_bool Cyg_ThreadQueue_Implementation::empty() +{ + return queue == NULL; +} + +// ------------------------------------------------------------------------- +// This class contains the implementation details of the scheduler, and +// provides a standard API for accessing it. + +class Cyg_Scheduler_Implementation + : public Cyg_Scheduler_Base +{ + friend class Cyg_ThreadQueue_Implementation; + friend class Cyg_SchedThread_Implementation; + friend class Cyg_HardwareThread; + + // Mask of which run queues have ready threads + cyg_sched_bitmap queue_map; + + // Each run queue is a double linked circular list of threads. + // These pointers point to the head element of each list. + Cyg_ThreadQueue_Implementation run_queue[CYGNUM_KERNEL_SCHED_PRIORITIES]; + +protected: + +#ifdef CYGSEM_KERNEL_SCHED_TIMESLICE + + // Timeslice counter. This is decremented on each + // clock tick, and a timeslice is performed each + // time it zeroes. + + static cyg_ucount32 timeslice_count; + + static void reset_timeslice_count(); + +#endif + + Cyg_Scheduler_Implementation(); // Constructor + + // The following functions provide the scheduler implementation + // interface to the Cyg_Scheduler class. These are protected + // so that only the scheduler can call them. + + // choose a new thread + Cyg_Thread *schedule(); + + // make thread schedulable + void add_thread(Cyg_Thread *thread); + + // make thread un-schedulable + void rem_thread(Cyg_Thread *thread); + + // register thread with scheduler + void register_thread(Cyg_Thread *thread); + + // deregister thread + void deregister_thread(Cyg_Thread *thread); + + // Test the given priority for uniqueness + cyg_bool unique( cyg_priority priority); + +#ifdef CYGSEM_KERNEL_SCHED_TIMESLICE + + // If timeslicing is enbled, define a scheduler + // entry point to do timeslicing. This will be + // called from the RTC DSR. +public: + void timeslice(); + +#endif + +}; + +// ------------------------------------------------------------------------- +// Cyg_Scheduler_Implementation inlines + +#ifdef CYGSEM_KERNEL_SCHED_TIMESLICE + +inline void Cyg_Scheduler_Implementation::reset_timeslice_count() +{ + timeslice_count = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS; +} + +#endif + +// ------------------------------------------------------------------------- +// Scheduler thread implementation. +// This class provides the implementation of the scheduler specific parts +// of each thread. + +class Cyg_SchedThread_Implementation +{ + friend class Cyg_Scheduler_Implementation; + friend class Cyg_ThreadQueue_Implementation; + + Cyg_Thread *next; // next thread in queue + Cyg_Thread *prev; // previous thread in queue + + void insert( Cyg_Thread *thread ); // Insert thread in front of this + + void remove(); // remove this from queue + +protected: + + cyg_priority priority; // current thread priority + + Cyg_SchedThread_Implementation(CYG_ADDRWORD sched_info); + + void yield(); // Yield CPU to next thread + + static void rotate_queue( cyg_priority pri ); + // Rotate that run queue +}; + +// ------------------------------------------------------------------------- +#endif // ifndef CYGONCE_KERNEL_MLQUEUE_HXX +// EOF mlqueue.hxx
