blob: ccd5f64c75006af890480bf5cd0ee4f2696c9d80 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
/*! \addtogroup osclproc OSCL Proc
*
* @{
*/
/** \file oscl_scheduler_readyq.h
\brief ready q types for oscl scheduler
*/
#ifndef OSCL_SCHEDULER_READYQ_H_INCLUDED
#define OSCL_SCHEDULER_READYQ_H_INCLUDED
#ifndef OSCL_SCHEDULER_TYPES_H_INCLUDED
#include "oscl_scheduler_types.h"
#endif
#ifndef OSCL_SCHEDULER_TUNEABLES_H_INCLUDED
#include "oscl_scheduler_tuneables.h"
#endif
#ifndef OSCL_PRIQUEUE_H_INCLUDED
#include "oscl_priqueue.h"
#endif
#ifndef OSCL_BASE_ALLOC_H_INCLUDED
#include "oscl_base_alloc.h"
#endif
#ifndef OSCL_SEMAPHORE_H_INCLUDED
#include "oscl_semaphore.h"
#endif
#ifndef OSCL_MEM_H_INCLUDED
#include "oscl_mem.h"
#endif
#ifndef OSCL_MUTEX_H_INCLUDED
#include "oscl_mutex.h"
#endif
#ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
#include "oscl_string_containers.h"
#endif
class PVActiveBase;
class OsclReadyAlloc: public Oscl_DefAlloc
{
public:
OsclAny* allocate(const uint32 size) ;
OsclAny* allocate_fl(const uint32 size, const char * file_name, const int line_num);
void deallocate(OsclAny* p) ;
private:
OsclMemAllocator iBasicAlloc;
};
typedef PVActiveBase* TOsclReady;
class OsclReadyCompare
{
public:
static int compare(TOsclReady& a, TOsclReady& b) ;
};
class OsclTimerCompare
{
public:
static int compare(TOsclReady& a, TOsclReady& b) ;
};
/** This is a thread-safe priority queue for holding the
active objects that are ready to run.
This queue also contains the request semaphore and the
queue observer callback logic.
*/
class PVLogger;
class OsclSchedulerObserver;
class OsclReadyQ
: public OsclPriorityQueue<TOsclReady, OsclReadyAlloc, Oscl_Vector<TOsclReady, OsclReadyAlloc>, OsclReadyCompare>
{
public:
void Construct(int);
void ThreadLogon();
void ThreadLogoff();
void Remove(TOsclReady);
bool IsIn(TOsclReady);
uint32 Depth()
{
return size();
}
TOsclReady PopTop();
TOsclReady Top();
TOsclReady WaitAndPopTop();
TOsclReady WaitAndPopTop(uint32);
int32 PendComplete(PVActiveBase *pvbase, int32 aReason);
int32 WaitForRequestComplete(PVActiveBase*);
//For non-blocking scheduler observer support
void RegisterForCallback(OsclSchedulerObserver* aCallback, OsclAny* aCallbackContext);
void TimerCallback(uint32 aDelayMicrosec);
OsclSchedulerObserver* Callback()
{
return iCallback;
}
private:
TOsclReady PopTopAfterWait();
//mutex for thread protection
OsclNoYieldMutex iCrit;
//this semaphore tracks the queue size. it is used to
//regulate the scheduling loop when running in blocking mode.
OsclSemaphore iSem;
//a sequence number needed to maintain FIFO sorting order in oscl pri queue.
uint32 iSeqNumCounter;
//For non-blocking scheduler observer support
OsclSchedulerObserver* iCallback;
OsclAny* iCallbackContext;
};
/*
** A non-thread-safe queue for holding pending timers.
*/
class OsclTimerQ
: public OsclPriorityQueue<TOsclReady, OsclReadyAlloc, Oscl_Vector<TOsclReady, OsclReadyAlloc>, OsclTimerCompare>
{
public:
void Construct(int);
void Add(TOsclReady);
void Remove(TOsclReady);
TOsclReady PopTop();
TOsclReady Top();
void Pop(TOsclReady);
bool IsIn(TOsclReady);
private:
//a sequence number needed to maintain FIFO sorting order in oscl pri queue.
uint32 iSeqNumCounter;
};
/** This class defines the queue link, which is common to both ready Q and timer Q.
Each AO contains its own queue link object.
*/
class TReadyQueLink
{
public:
TReadyQueLink()
{
iAOPriority = 0;
iTimeToRunTicks = 0;
iSeqNum = 0;
iIsIn = NULL;
}
int32 iAOPriority;//scheduling priority
uint32 iTimeToRunTicks;//for timers, this is the time to run in ticks.
uint32 iTimeQueuedTicks;//the time when the AO was queued, in ticks.
uint32 iSeqNum;//sequence number for oscl pri queue.
OsclAny* iIsIn;//pointer to the queue we're in, cast as a void*
};
#endif
/*! @} */