URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [ecos-2.0/] [packages/] [kernel/] [v2_0/] [include/] [sched.inl] - Rev 1765
Compare with Previous | Blame | View Log
#ifndef CYGONCE_KERNEL_SCHED_INL#define CYGONCE_KERNEL_SCHED_INL//==========================================================================//// sched.inl//// Scheduler class inlines////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): nickg// Contributors: nickg// Date: 1997-09-09// Purpose: Define inlines for scheduler classes// Description: Inline functions for the scheduler classes. These are// not defined in the header so that we have the option// of making them non-inline.// Usage:// #include <cyg/kernel/sched.hxx>// ...// #include <cyg/kernel/sched.inl>// ...////####DESCRIPTIONEND####////==========================================================================#include <cyg/kernel/instrmnt.h>#include <cyg/kernel/thread.inl> // we use some thread inlines here// -------------------------------------------------------------------------// Inlines for Cyg_Scheduler classinline void Cyg_Scheduler::lock(){// We do not need to do a read-modify-write sequence here because// the scheduler lock is strictly nesting. Even if we are interrupted// partway through the increment, the lock will be returned to the same// value before we are resumed/rescheduled.HAL_REORDER_BARRIER();inc_sched_lock();HAL_REORDER_BARRIER();CYG_INSTRUMENT_SCHED(LOCK,get_sched_lock(),0);};inline void Cyg_Scheduler::unlock(){// This is an inline wrapper for the real scheduler unlock function in// Cyg_Scheduler::unlock_inner().// Only do anything if the lock is about to go zero, otherwise we simply// decrement and return. As with lock() we do not need any special code// to decrement the lock counter.CYG_INSTRUMENT_SCHED(UNLOCK,get_sched_lock(),0);HAL_REORDER_BARRIER();cyg_ucount32 __lock = get_sched_lock() - 1;if( __lock == 0 ) unlock_inner(0);else set_sched_lock(__lock);HAL_REORDER_BARRIER();}inline void Cyg_Scheduler::reschedule(){// This function performs the equivalent of calling unlock() and// lock() is succession. Unlike that pair, however, it does not// leave a brief window between the calls when the lock is unclaimed// by the current thread.CYG_INSTRUMENT_SCHED(RESCHEDULE,get_sched_lock(),0);unlock_inner( get_sched_lock() );}inline void Cyg_Scheduler:: unlock_reschedule(){// This function decrements the scheduler lock and also looks for// a reschedule opportunity. When the lock is being decremented// from 1 to zero this function is equivalent to unlock. When the// lock is being decremented to a non-zero value, it is more or less// equivalent to reschedule() followed by unlock().CYG_INSTRUMENT_SCHED(UNLOCK,get_sched_lock(),0);unlock_inner( get_sched_lock() - 1 );}inline void Cyg_Scheduler::unlock_simple(){// This function decrements the lock, but does not call unlock_inner().// Therefore does not immediately allow another thread to run:// merely makes it possible for some other thread to run at some// indeterminate future time. This is mainly for use by// debuggers, it should not normally be used anywhere else.CYG_INSTRUMENT_SCHED(UNLOCK,get_sched_lock(),0);HAL_REORDER_BARRIER();if (get_sched_lock() > 1)set_sched_lock(get_sched_lock() - 1);else zero_sched_lock();HAL_REORDER_BARRIER();}// -------------------------------------------------------------------------// Inlines for Cyg_SchedThread classinline void Cyg_SchedThread::remove(){if( queue != NULL ){queue->remove((Cyg_Thread *)this);queue = NULL;}}// -------------------------------------------------------------------------#endif // ifndef CYGONCE_KERNEL_SCHED_INL// EOF sched.inl
