os/kernelhwsrv/kernel/eka/include/nkern/nkern.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// e32\include\nkern\nkern.h
sl@0
    15
// 
sl@0
    16
// WARNING: This file contains some APIs which are internal and are subject
sl@0
    17
//          to change without notice. Such APIs should therefore not be used
sl@0
    18
//          outside the Kernel and Hardware Services package.
sl@0
    19
//
sl@0
    20
sl@0
    21
#ifndef __NKERN_H__
sl@0
    22
#define __NKERN_H__
sl@0
    23
sl@0
    24
#ifdef	__STANDALONE_NANOKERNEL__
sl@0
    25
#undef	__IN_KERNEL__
sl@0
    26
#define	__IN_KERNEL__
sl@0
    27
#endif
sl@0
    28
sl@0
    29
#include <e32const.h>
sl@0
    30
#include <nklib.h>
sl@0
    31
#include <dfcs.h>
sl@0
    32
#include <nk_trace.h>
sl@0
    33
#include <e32atomics.h>
sl@0
    34
sl@0
    35
extern "C" {
sl@0
    36
/** @internalComponent */
sl@0
    37
IMPORT_C void NKFault(const char* file, TInt line);
sl@0
    38
/** @internalComponent */
sl@0
    39
void NKIdle(TInt aStage);
sl@0
    40
}
sl@0
    41
sl@0
    42
/**
sl@0
    43
@publishedPartner
sl@0
    44
@released
sl@0
    45
*/
sl@0
    46
#define FAULT()		NKFault(__FILE__,__LINE__)
sl@0
    47
sl@0
    48
#ifdef _DEBUG
sl@0
    49
sl@0
    50
/**
sl@0
    51
@publishedPartner
sl@0
    52
@released
sl@0
    53
*/
sl@0
    54
#define __NK_ASSERT_DEBUG(c)	((void) ((c)||(FAULT(),0)) )
sl@0
    55
sl@0
    56
#else
sl@0
    57
sl@0
    58
#define __NK_ASSERT_DEBUG(c)
sl@0
    59
sl@0
    60
#endif
sl@0
    61
sl@0
    62
/**
sl@0
    63
@publishedPartner
sl@0
    64
@released
sl@0
    65
*/
sl@0
    66
#define __NK_ASSERT_ALWAYS(c)	((void) ((c)||(FAULT(),0)) )
sl@0
    67
sl@0
    68
/**
sl@0
    69
	@publishedPartner
sl@0
    70
	@released
sl@0
    71
*/
sl@0
    72
const TInt KNumPriorities=64;
sl@0
    73
sl@0
    74
const TInt KMaxCpus=8;
sl@0
    75
sl@0
    76
class NThread;
sl@0
    77
sl@0
    78
sl@0
    79
/** Spin lock
sl@0
    80
sl@0
    81
	Used for protecting a code fragment against both interrupts and concurrent
sl@0
    82
	execution on another processor.
sl@0
    83
	
sl@0
    84
	@internalComponent
sl@0
    85
*/
sl@0
    86
class TSpinLock
sl@0
    87
	{
sl@0
    88
public:
sl@0
    89
	enum TOrder
sl@0
    90
		{
sl@0
    91
		// Bit 7 of order clear for locks used with interrupts disabled
sl@0
    92
		EOrderGenericIrqLow0	=0x00u,	// Device driver spin locks, low range
sl@0
    93
		EOrderGenericIrqLow1	=0x01u,	// Device driver spin locks, low range
sl@0
    94
		EOrderGenericIrqLow2	=0x02u,	// Device driver spin locks, low range
sl@0
    95
		EOrderGenericIrqLow3	=0x03u,	// Device driver spin locks, low range
sl@0
    96
		EOrderGenericIrqHigh0	=0x18u,	// Device driver spin locks, high range
sl@0
    97
		EOrderGenericIrqHigh1	=0x19u,	// Device driver spin locks, high range
sl@0
    98
		EOrderGenericIrqHigh2	=0x1Au,	// Device driver spin locks, high range
sl@0
    99
		EOrderGenericIrqHigh3	=0x1Bu,	// Device driver spin locks, high range
sl@0
   100
sl@0
   101
		// Bit 7 of order set for locks used with interrupts enabled, preemption disabled
sl@0
   102
		EOrderGenericPreLow0	=0x80u,		// Device driver spin locks, low range
sl@0
   103
		EOrderGenericPreLow1	=0x81u,		// Device driver spin locks, low range
sl@0
   104
		EOrderGenericPreHigh0	=0x9Eu,		// Device driver spin locks, high range
sl@0
   105
		EOrderGenericPreHigh1	=0x9Fu,		// Device driver spin locks, high range
sl@0
   106
sl@0
   107
		EOrderNone				=0xFFu	// No order check required (e.g. for dynamic ordering)
sl@0
   108
		};
sl@0
   109
public:
sl@0
   110
	IMPORT_C TSpinLock(TUint aOrder);
sl@0
   111
private:
sl@0
   112
	volatile TUint64 iLock;
sl@0
   113
	};
sl@0
   114
sl@0
   115
/** Macro to disable interrupts and acquire the lock.
sl@0
   116
sl@0
   117
@publishedPartner
sl@0
   118
@prototype
sl@0
   119
*/
sl@0
   120
#define __SPIN_LOCK_IRQ(lock)					((void)NKern::DisableAllInterrupts())
sl@0
   121
sl@0
   122
/** Macro to release the lock and enable interrupts.
sl@0
   123
sl@0
   124
@publishedPartner
sl@0
   125
@prototype
sl@0
   126
*/
sl@0
   127
#define __SPIN_UNLOCK_IRQ(lock)					(NKern::EnableAllInterrupts())
sl@0
   128
sl@0
   129
/** Macro to see if someone else is waiting for the lock, enabling IRQs 
sl@0
   130
    then disabling IRQs again.
sl@0
   131
sl@0
   132
@publishedPartner
sl@0
   133
@prototype
sl@0
   134
*/
sl@0
   135
#define __SPIN_FLASH_IRQ(lock)					(NKern::EnableAllInterrupts(),(void)NKern::DisableAllInterrupts(),((TBool)TRUE))
sl@0
   136
sl@0
   137
/** Macro to remember original interrupt state then disable interrupts 
sl@0
   138
    and acquire the lock.
sl@0
   139
    
sl@0
   140
@publishedPartner
sl@0
   141
@prototype
sl@0
   142
*/
sl@0
   143
#define __SPIN_LOCK_IRQSAVE(lock)				(NKern::DisableAllInterrupts())
sl@0
   144
sl@0
   145
/** Macro to release the lock then restore original interrupt state to that 
sl@0
   146
	supplied.
sl@0
   147
	
sl@0
   148
@publishedPartner
sl@0
   149
@prototype
sl@0
   150
*/
sl@0
   151
#define __SPIN_UNLOCK_IRQRESTORE(lock,irq)		(NKern::RestoreInterrupts(irq))
sl@0
   152
sl@0
   153
/** Macro to see if someone else is waiting for the lock, enabling IRQs to
sl@0
   154
	the original state supplied then disabling IRQs again.
sl@0
   155
    
sl@0
   156
@publishedPartner
sl@0
   157
@prototype
sl@0
   158
*/
sl@0
   159
#define __SPIN_FLASH_IRQRESTORE(lock,irq)		(NKern::RestoreInterrupts(irq),((void)NKern::DisableAllInterrupts()),((TBool)TRUE))
sl@0
   160
sl@0
   161
/** Macro to acquire the lock. This assumes the caller has already disabled 
sl@0
   162
    interrupts/preemption. 
sl@0
   163
	
sl@0
   164
	If interrupts/preemption is not disabled a run-time assert will occur
sl@0
   165
	This is to protect against unsafe code that might lead to same core 
sl@0
   166
	deadlock.
sl@0
   167
	
sl@0
   168
    In device driver code it is safer to use __SPIN_LOCK_IRQSAVE() instead, 
sl@0
   169
	although not as efficient should interrupts aleady be disabled for the 
sl@0
   170
	duration the lock is held.
sl@0
   171
    
sl@0
   172
@publishedPartner
sl@0
   173
@prototype
sl@0
   174
*/
sl@0
   175
#define __SPIN_LOCK(lock)
sl@0
   176
sl@0
   177
/** Macro to release the lock, don't change interrupt/preemption state.
sl@0
   178
sl@0
   179
@publishedPartner
sl@0
   180
@prototype
sl@0
   181
*/
sl@0
   182
#define __SPIN_UNLOCK(lock)
sl@0
   183
sl@0
   184
/**
sl@0
   185
@internalComponent
sl@0
   186
*/
sl@0
   187
#define __SPIN_FLASH(lock)						((TBool)FALSE)
sl@0
   188
sl@0
   189
/** Macro to see if someone else is waiting for the lock, enabling preemption 
sl@0
   190
    then disabling it again.
sl@0
   191
sl@0
   192
@publishedPartner
sl@0
   193
@prototype
sl@0
   194
*/
sl@0
   195
#define __SPIN_FLASH_PREEMPT(lock)				((TBool)NKern::PreemptionPoint())
sl@0
   196
sl@0
   197
sl@0
   198
/** Read/Write Spin lock
sl@0
   199
sl@0
   200
	@internalComponent
sl@0
   201
*/
sl@0
   202
class TRWSpinLock
sl@0
   203
	{
sl@0
   204
public:
sl@0
   205
	IMPORT_C TRWSpinLock(TUint aOrder);		// Uses same order space as TSpinLock
sl@0
   206
private:
sl@0
   207
	volatile TUint64 iLock;
sl@0
   208
	};
sl@0
   209
sl@0
   210
sl@0
   211
/**
sl@0
   212
@publishedPartner
sl@0
   213
@prototype
sl@0
   214
*/
sl@0
   215
#define __SPIN_LOCK_IRQ_R(lock)					((void)NKern::DisableAllInterrupts())
sl@0
   216
sl@0
   217
/**
sl@0
   218
@publishedPartner
sl@0
   219
@prototype
sl@0
   220
*/
sl@0
   221
#define __SPIN_UNLOCK_IRQ_R(lock)				(NKern::EnableAllInterrupts())
sl@0
   222
sl@0
   223
/**
sl@0
   224
@publishedPartner
sl@0
   225
@prototype
sl@0
   226
*/
sl@0
   227
#define __SPIN_FLASH_IRQ_R(lock)				(NKern::EnableAllInterrupts(),(void)NKern::DisableAllInterrupts(),((TBool)TRUE))
sl@0
   228
sl@0
   229
/**
sl@0
   230
@publishedPartner
sl@0
   231
@prototype
sl@0
   232
*/
sl@0
   233
#define __SPIN_LOCK_IRQ_W(lock)					((void)NKern::DisableAllInterrupts())
sl@0
   234
sl@0
   235
/**
sl@0
   236
@publishedPartner
sl@0
   237
@prototype
sl@0
   238
*/
sl@0
   239
#define __SPIN_UNLOCK_IRQ_W(lock)				(NKern::EnableAllInterrupts())
sl@0
   240
sl@0
   241
/**
sl@0
   242
@publishedPartner
sl@0
   243
@prototype
sl@0
   244
*/
sl@0
   245
#define __SPIN_FLASH_IRQ_W(lock)				(NKern::EnableAllInterrupts(),(void)NKern::DisableAllInterrupts(),((TBool)TRUE))
sl@0
   246
sl@0
   247
sl@0
   248
/**
sl@0
   249
@publishedPartner
sl@0
   250
@prototype
sl@0
   251
*/
sl@0
   252
#define __SPIN_LOCK_R(lock)						
sl@0
   253
sl@0
   254
/**
sl@0
   255
@publishedPartner
sl@0
   256
@prototype
sl@0
   257
*/
sl@0
   258
#define __SPIN_UNLOCK_R(lock)					
sl@0
   259
sl@0
   260
/**
sl@0
   261
@internalComponent
sl@0
   262
*/
sl@0
   263
#define __SPIN_FLASH_R(lock)					((TBool)FALSE)
sl@0
   264
sl@0
   265
/**
sl@0
   266
@publishedPartner
sl@0
   267
@prototype
sl@0
   268
*/
sl@0
   269
#define __SPIN_LOCK_W(lock)						
sl@0
   270
sl@0
   271
/**
sl@0
   272
@publishedPartner
sl@0
   273
@prototype
sl@0
   274
*/
sl@0
   275
#define __SPIN_UNLOCK_W(lock)					
sl@0
   276
sl@0
   277
/**
sl@0
   278
@internalComponent
sl@0
   279
*/
sl@0
   280
#define __SPIN_FLASH_W(lock)					((TBool)FALSE)
sl@0
   281
sl@0
   282
sl@0
   283
/**
sl@0
   284
@publishedPartner
sl@0
   285
@prototype
sl@0
   286
*/
sl@0
   287
#define __SPIN_LOCK_IRQSAVE_R(lock)				(NKern::DisableAllInterrupts())
sl@0
   288
sl@0
   289
/**
sl@0
   290
@publishedPartner
sl@0
   291
@prototype
sl@0
   292
*/
sl@0
   293
#define __SPIN_UNLOCK_IRQRESTORE_R(lock,irq)	(NKern::RestoreInterrupts(irq))
sl@0
   294
sl@0
   295
/**
sl@0
   296
@publishedPartner
sl@0
   297
@prototype
sl@0
   298
*/
sl@0
   299
#define __SPIN_FLASH_IRQRESTORE_R(lock,irq)		(NKern::RestoreInterrupts(irq),((void)NKern::DisableAllInterrupts()),((TBool)TRUE))
sl@0
   300
sl@0
   301
/**
sl@0
   302
@publishedPartner
sl@0
   303
@prototype
sl@0
   304
*/
sl@0
   305
#define __SPIN_LOCK_IRQSAVE_W(lock)				(NKern::DisableAllInterrupts())
sl@0
   306
sl@0
   307
/**
sl@0
   308
@publishedPartner
sl@0
   309
@prototype
sl@0
   310
*/
sl@0
   311
#define __SPIN_UNLOCK_IRQRESTORE_W(lock,irq)	(NKern::RestoreInterrupts(irq))
sl@0
   312
sl@0
   313
/**
sl@0
   314
@publishedPartner
sl@0
   315
@prototype
sl@0
   316
*/
sl@0
   317
#define __SPIN_FLASH_IRQRESTORE_W(lock,irq)		(NKern::RestoreInterrupts(irq),((void)NKern::DisableAllInterrupts()),((TBool)TRUE))
sl@0
   318
sl@0
   319
sl@0
   320
/**
sl@0
   321
@publishedPartner
sl@0
   322
@prototype
sl@0
   323
*/
sl@0
   324
#define __SPIN_FLASH_PREEMPT_R(lock)			((TBool)NKern::PreemptionPoint())
sl@0
   325
sl@0
   326
/**
sl@0
   327
@publishedPartner
sl@0
   328
@prototype
sl@0
   329
*/
sl@0
   330
#define __SPIN_FLASH_PREEMPT_W(lock)			((TBool)NKern::PreemptionPoint())
sl@0
   331
sl@0
   332
sl@0
   333
/** Nanokernel fast semaphore
sl@0
   334
sl@0
   335
	A light-weight semaphore class that only supports a single waiting thread,
sl@0
   336
	suitable for the Symbian OS thread I/O semaphore.
sl@0
   337
	
sl@0
   338
	Initialising a NFastSemaphore involves two steps:
sl@0
   339
	
sl@0
   340
	- Constructing the semaphore
sl@0
   341
	- Setting the semaphore owning thread (the one allowed to wait on it)
sl@0
   342
	
sl@0
   343
	For example, creating one for the current thread to wait on:
sl@0
   344
	
sl@0
   345
	@code
sl@0
   346
	NFastSemaphore sem;
sl@0
   347
	sem.iOwningThread = NKern::CurrentThread();
sl@0
   348
	@endcode
sl@0
   349
	
sl@0
   350
	@publishedPartner
sl@0
   351
	@released
sl@0
   352
*/
sl@0
   353
class NFastSemaphore
sl@0
   354
	{
sl@0
   355
public:
sl@0
   356
	inline NFastSemaphore();
sl@0
   357
	inline NFastSemaphore(NThreadBase* aThread);
sl@0
   358
	IMPORT_C void SetOwner(NThreadBase* aThread);
sl@0
   359
	IMPORT_C void Wait();
sl@0
   360
	IMPORT_C void Signal();
sl@0
   361
	IMPORT_C void SignalN(TInt aCount);
sl@0
   362
	IMPORT_C void Reset();
sl@0
   363
	void WaitCancel();
sl@0
   364
public:
sl@0
   365
	TInt iCount;				/**< @internalComponent */
sl@0
   366
sl@0
   367
	/** The thread allowed to wait on the semaphore
sl@0
   368
		@internalComponent
sl@0
   369
	*/
sl@0
   370
	NThreadBase* iOwningThread;	
sl@0
   371
	};
sl@0
   372
sl@0
   373
/** Create a fast semaphore
sl@0
   374
sl@0
   375
	@publishedPartner
sl@0
   376
	@released
sl@0
   377
*/
sl@0
   378
inline NFastSemaphore::NFastSemaphore()
sl@0
   379
	: iCount(0), iOwningThread(NULL)
sl@0
   380
	{}
sl@0
   381
sl@0
   382
/** Nanokernel fast mutex
sl@0
   383
sl@0
   384
	A light-weight priority-inheritance mutex that can be used if the following
sl@0
   385
	conditions apply:
sl@0
   386
	
sl@0
   387
	- Threads that hold the mutex never block.
sl@0
   388
	- The mutex is never acquired in a nested fashion
sl@0
   389
	
sl@0
   390
	If either of these conditions is not met, a DMutex object is more appropriate.
sl@0
   391
	
sl@0
   392
	@publishedPartner
sl@0
   393
	@released
sl@0
   394
*/
sl@0
   395
class NFastMutex
sl@0
   396
	{
sl@0
   397
public:
sl@0
   398
	IMPORT_C NFastMutex();
sl@0
   399
	IMPORT_C void Wait();
sl@0
   400
	IMPORT_C void Signal();
sl@0
   401
	IMPORT_C TBool HeldByCurrentThread();	/**< @internalComponent */
sl@0
   402
public:
sl@0
   403
	NThreadBase* iHoldingThread;	/**< @internalComponent */
sl@0
   404
sl@0
   405
	/** MUST ALWAYS BE 0 or 1
sl@0
   406
		@internalComponent
sl@0
   407
	*/
sl@0
   408
	TInt iWaiting;
sl@0
   409
	};
sl@0
   410
sl@0
   411
sl@0
   412
/**
sl@0
   413
@publishedPartner
sl@0
   414
@released
sl@0
   415
sl@0
   416
The type of the callback function used by the nanokernel timer. 
sl@0
   417
sl@0
   418
@see NTimer
sl@0
   419
*/
sl@0
   420
typedef void (*NTimerFn)(TAny*);
sl@0
   421
sl@0
   422
sl@0
   423
sl@0
   424
sl@0
   425
/**
sl@0
   426
@publishedPartner
sl@0
   427
@released
sl@0
   428
sl@0
   429
A basic relative timer provided by the nanokernel.
sl@0
   430
sl@0
   431
It can generate either a one-shot interrupt or periodic interrupts.
sl@0
   432
sl@0
   433
A timeout handler is called when the timer expires, either:
sl@0
   434
- from the timer ISR - if the timer is queued via OneShot(TInt aTime) or OneShot(TInt aTime, TBool EFalse), or
sl@0
   435
- from the nanokernel timer dfc1 thread - if the timer is queued via OneShot(TInt aTime, TBool ETrue) call, or
sl@0
   436
- from any other dfc thread that provided DFC belongs to - if the timer is queued via OneShot(TInt aTime, TDfc& aDfc) call.
sl@0
   437
Call-back mechanism cannot be changed in the life time of a timer.
sl@0
   438
sl@0
   439
These timer objects may be manipulated from any context.
sl@0
   440
The timers are driven from a periodic system tick interrupt,
sl@0
   441
usually a 1ms period.
sl@0
   442
sl@0
   443
@see NTimerFn
sl@0
   444
*/
sl@0
   445
class NTimer : public SDblQueLink
sl@0
   446
	{
sl@0
   447
public:
sl@0
   448
	/**
sl@0
   449
	Default constructor.
sl@0
   450
	*/
sl@0
   451
	inline NTimer()
sl@0
   452
		: iState(EIdle)
sl@0
   453
		{}
sl@0
   454
	/**
sl@0
   455
	Constructor taking a callback function and a pointer to be passed
sl@0
   456
	to the callback function.
sl@0
   457
	
sl@0
   458
	@param aFunction The callback function.
sl@0
   459
	@param aPtr      A pointer to be passed to the callback function 
sl@0
   460
	                 when called.
sl@0
   461
	*/
sl@0
   462
	inline NTimer(NTimerFn aFunction, TAny* aPtr)
sl@0
   463
		: iPtr(aPtr), iFunction(aFunction), iState(EIdle)
sl@0
   464
		{}
sl@0
   465
	IMPORT_C TInt OneShot(TInt aTime);
sl@0
   466
	IMPORT_C TInt OneShot(TInt aTime, TBool aDfc);
sl@0
   467
	IMPORT_C TInt OneShot(TInt aTime, TDfc& aDfc);
sl@0
   468
	IMPORT_C TInt Again(TInt aTime);
sl@0
   469
	IMPORT_C TBool Cancel();
sl@0
   470
	IMPORT_C TBool IsPending();
sl@0
   471
public:
sl@0
   472
/**
sl@0
   473
	@internalComponent
sl@0
   474
*/
sl@0
   475
	enum TState
sl@0
   476
		{
sl@0
   477
		EIdle=0,			// not queued
sl@0
   478
		ETransferring=1,	// being transferred from holding to ordered queue
sl@0
   479
		EHolding=2,			// on holding queue
sl@0
   480
		EOrdered=3,			// on ordered queue
sl@0
   481
		ECritical=4,		// on ordered queue and in use by queue walk routine
sl@0
   482
		EFinal=5,			// on final queue
sl@0
   483
		};
sl@0
   484
public:
sl@0
   485
	/** Argument for callback function or the pointer to TDfc */
sl@0
   486
	TAny* iPtr;				/**< @internalComponent */
sl@0
   487
sl@0
   488
	/** Pointer to callback function. NULL value indicates that queuing of provided Dfc queue will be done
sl@0
   489
	instead of calling callback function on completion */
sl@0
   490
	NTimerFn iFunction;		/**< @internalComponent */
sl@0
   491
sl@0
   492
	TUint32 iTriggerTime;	/**< @internalComponent */
sl@0
   493
	TUint8 iCompleteInDfc;	/**< @internalComponent */
sl@0
   494
	TUint8 iState;			/**< @internalComponent */
sl@0
   495
	TUint8 iPad1;			/**< @internalComponent */
sl@0
   496
sl@0
   497
	/** Available for timer client to use.
sl@0
   498
		@internalTechnology */
sl@0
   499
	TUint8 iUserFlags;
sl@0
   500
	};
sl@0
   501
sl@0
   502
/**
sl@0
   503
@internalTechnology
sl@0
   504
*/
sl@0
   505
#define	i_NTimer_iUserFlags	iUserFlags
sl@0
   506
sl@0
   507
/**
sl@0
   508
@internalComponent
sl@0
   509
*/
sl@0
   510
#define	i_NTimer_iState		iState
sl@0
   511
sl@0
   512
/**
sl@0
   513
	@publishedPartner
sl@0
   514
	@released
sl@0
   515
*/
sl@0
   516
typedef void (*NThreadFunction)(TAny*);
sl@0
   517
sl@0
   518
/**
sl@0
   519
	@publishedPartner
sl@0
   520
	@released
sl@0
   521
*/
sl@0
   522
typedef TDfc* (*NThreadExitHandler)(NThread*);
sl@0
   523
sl@0
   524
/**
sl@0
   525
	@publishedPartner
sl@0
   526
	@released
sl@0
   527
*/
sl@0
   528
typedef void (*NThreadStateHandler)(NThread*,TInt,TInt);
sl@0
   529
sl@0
   530
/**
sl@0
   531
	@publishedPartner
sl@0
   532
	@released
sl@0
   533
*/
sl@0
   534
typedef void (*NThreadExceptionHandler)(TAny*,NThread*);
sl@0
   535
sl@0
   536
/**
sl@0
   537
	@publishedPartner
sl@0
   538
	@released
sl@0
   539
*/
sl@0
   540
typedef void (*NThreadTimeoutHandler)(NThread*,TInt);
sl@0
   541
sl@0
   542
/**
sl@0
   543
	@publishedPartner
sl@0
   544
	@released
sl@0
   545
*/
sl@0
   546
struct SNThreadHandlers
sl@0
   547
	{
sl@0
   548
	NThreadExitHandler iExitHandler;
sl@0
   549
	NThreadStateHandler iStateHandler;
sl@0
   550
	NThreadExceptionHandler iExceptionHandler;
sl@0
   551
	NThreadTimeoutHandler iTimeoutHandler;
sl@0
   552
	};
sl@0
   553
sl@0
   554
/** @internalComponent */
sl@0
   555
extern void NThread_Default_State_Handler(NThread*, TInt, TInt);
sl@0
   556
sl@0
   557
/** @internalComponent */
sl@0
   558
extern void NThread_Default_Exception_Handler(TAny*, NThread*);
sl@0
   559
sl@0
   560
/** @internalComponent */
sl@0
   561
#define NTHREAD_DEFAULT_EXIT_HANDLER		((NThreadExitHandler)0)
sl@0
   562
sl@0
   563
/** @internalComponent */
sl@0
   564
#define	NTHREAD_DEFAULT_STATE_HANDLER		(&NThread_Default_State_Handler)
sl@0
   565
sl@0
   566
/** @internalComponent */
sl@0
   567
#define	NTHREAD_DEFAULT_EXCEPTION_HANDLER	(&NThread_Default_Exception_Handler)
sl@0
   568
sl@0
   569
/** @internalComponent */
sl@0
   570
#define	NTHREAD_DEFAULT_TIMEOUT_HANDLER		((NThreadTimeoutHandler)0)
sl@0
   571
sl@0
   572
sl@0
   573
/**
sl@0
   574
	@publishedPartner
sl@0
   575
	@released
sl@0
   576
*/
sl@0
   577
struct SFastExecTable
sl@0
   578
	{
sl@0
   579
	TInt iFastExecCount;			// includes implicit function#0
sl@0
   580
	TLinAddr iFunction[1];			// first entry is for call number 1
sl@0
   581
	};
sl@0
   582
sl@0
   583
/**
sl@0
   584
	@publishedPartner
sl@0
   585
	@released
sl@0
   586
*/
sl@0
   587
const TUint32 KExecFlagClaim=0x80000000;		// claim system lock
sl@0
   588
sl@0
   589
/**
sl@0
   590
	@publishedPartner
sl@0
   591
	@released
sl@0
   592
*/
sl@0
   593
const TUint32 KExecFlagRelease=0x40000000;		// release system lock
sl@0
   594
sl@0
   595
/**
sl@0
   596
	@publishedPartner
sl@0
   597
	@released
sl@0
   598
*/
sl@0
   599
const TUint32 KExecFlagPreprocess=0x20000000;	// preprocess
sl@0
   600
sl@0
   601
/**
sl@0
   602
	@publishedPartner
sl@0
   603
	@released
sl@0
   604
*/
sl@0
   605
const TUint32 KExecFlagExtraArgMask=0x1C000000;	// 3 bits indicating additional arguments
sl@0
   606
sl@0
   607
/**
sl@0
   608
	@publishedPartner
sl@0
   609
	@released
sl@0
   610
*/
sl@0
   611
const TUint32 KExecFlagExtraArgs2=0x04000000;	// 2 additional arguments
sl@0
   612
sl@0
   613
/**
sl@0
   614
	@publishedPartner
sl@0
   615
	@released
sl@0
   616
*/
sl@0
   617
const TUint32 KExecFlagExtraArgs3=0x08000000;	// 3 additional arguments
sl@0
   618
sl@0
   619
/**
sl@0
   620
	@publishedPartner
sl@0
   621
	@released
sl@0
   622
*/
sl@0
   623
const TUint32 KExecFlagExtraArgs4=0x0C000000;	// 4 additional arguments
sl@0
   624
sl@0
   625
/**
sl@0
   626
	@publishedPartner
sl@0
   627
	@released
sl@0
   628
*/
sl@0
   629
const TUint32 KExecFlagExtraArgs5=0x10000000;	// 5 additional arguments
sl@0
   630
sl@0
   631
/**
sl@0
   632
	@publishedPartner
sl@0
   633
	@released
sl@0
   634
*/
sl@0
   635
const TUint32 KExecFlagExtraArgs6=0x14000000;	// 6 additional arguments
sl@0
   636
sl@0
   637
/**
sl@0
   638
	@publishedPartner
sl@0
   639
	@released
sl@0
   640
*/
sl@0
   641
const TUint32 KExecFlagExtraArgs7=0x18000000;	// 7 additional arguments
sl@0
   642
sl@0
   643
/**
sl@0
   644
	@publishedPartner
sl@0
   645
	@released
sl@0
   646
*/
sl@0
   647
const TUint32 KExecFlagExtraArgs8=0x1C000000;	// 8 additional arguments
sl@0
   648
sl@0
   649
sl@0
   650
/**
sl@0
   651
	@publishedPartner
sl@0
   652
	@released
sl@0
   653
*/
sl@0
   654
struct SSlowExecEntry
sl@0
   655
	{
sl@0
   656
	TUint32 iFlags;					// information about call
sl@0
   657
	TLinAddr iFunction;				// address of function to be called
sl@0
   658
	};
sl@0
   659
sl@0
   660
sl@0
   661
/**
sl@0
   662
	@publishedPartner
sl@0
   663
	@released
sl@0
   664
*/
sl@0
   665
struct SSlowExecTable
sl@0
   666
	{
sl@0
   667
	TInt iSlowExecCount;
sl@0
   668
	TLinAddr iInvalidExecHandler;	// used if call number invalid
sl@0
   669
	TLinAddr iPreprocessHandler;	// used for handle lookups
sl@0
   670
	SSlowExecEntry iEntries[1];		// first entry is for call number 0
sl@0
   671
	};
sl@0
   672
sl@0
   673
// Thread iAttributes Constants
sl@0
   674
const TUint8 KThreadAttImplicitSystemLock=1;	/**< @internalComponent */
sl@0
   675
const TUint8 KThreadAttAddressSpace=2;			/**< @internalComponent */
sl@0
   676
const TUint8 KThreadAttLoggable=4;				/**< @internalComponent */
sl@0
   677
const TUint8 KThreadAttDelayed=8;				/**< @internalComponent */
sl@0
   678
sl@0
   679
sl@0
   680
// Thread CPU
sl@0
   681
const TUint32 KCpuAffinityAny=0xffffffffu;		/**< @internalComponent */
sl@0
   682
sl@0
   683
/** Information needed for creating a nanothread.
sl@0
   684
sl@0
   685
	@publishedPartner
sl@0
   686
	@released
sl@0
   687
*/
sl@0
   688
struct SNThreadCreateInfo
sl@0
   689
	{
sl@0
   690
	NThreadFunction iFunction;
sl@0
   691
	TAny* iStackBase;
sl@0
   692
	TInt iStackSize;
sl@0
   693
	TInt iPriority;
sl@0
   694
	TInt iTimeslice;
sl@0
   695
	TUint8 iAttributes;
sl@0
   696
	TUint32 iCpuAffinity;
sl@0
   697
	const SNThreadHandlers* iHandlers;
sl@0
   698
	const SFastExecTable* iFastExecTable;
sl@0
   699
	const SSlowExecTable* iSlowExecTable;
sl@0
   700
	const TUint32* iParameterBlock;
sl@0
   701
	TInt iParameterBlockSize;		// if zero, iParameterBlock _is_ the initial data
sl@0
   702
									// otherwise it points to n bytes of initial data
sl@0
   703
	};
sl@0
   704
sl@0
   705
/**	Constant for use with NKern:: functions which release a fast mutex as well
sl@0
   706
	as performing some other operations.
sl@0
   707
sl@0
   708
	@publishedPartner
sl@0
   709
	@released
sl@0
   710
*/
sl@0
   711
#define	SYSTEM_LOCK		(NFastMutex*)0
sl@0
   712
sl@0
   713
sl@0
   714
/** Idle handler function
sl@0
   715
	Pointer to a function which is called whenever a CPU goes idle
sl@0
   716
sl@0
   717
	@param	aPtr	The iPtr stored in the SCpuIdleHandler structure
sl@0
   718
	@param	aStage	If positive, the number of processors still active
sl@0
   719
					If zero, indicates all processors are now idle
sl@0
   720
					-1 indicates that postamble processing is required after waking up
sl@0
   721
sl@0
   722
	@internalComponent
sl@0
   723
*/
sl@0
   724
typedef void (*TCpuIdleHandlerFn)(TAny* aPtr, TInt aStage);
sl@0
   725
sl@0
   726
/** Idle handler structure
sl@0
   727
sl@0
   728
	@internalComponent
sl@0
   729
*/
sl@0
   730
struct SCpuIdleHandler
sl@0
   731
	{
sl@0
   732
	TCpuIdleHandlerFn	iHandler;
sl@0
   733
	TAny*				iPtr;
sl@0
   734
	volatile TBool		iPostambleRequired;
sl@0
   735
	};
sl@0
   736
sl@0
   737
sl@0
   738
/**
sl@0
   739
@internalComponent
sl@0
   740
*/
sl@0
   741
enum TUserModeCallbackReason
sl@0
   742
	{
sl@0
   743
	EUserModeCallbackRun,
sl@0
   744
	EUserModeCallbackCancel,
sl@0
   745
	};
sl@0
   746
sl@0
   747
sl@0
   748
/**
sl@0
   749
A callback function executed when a thread returns to user mode.
sl@0
   750
sl@0
   751
@internalComponent
sl@0
   752
*/
sl@0
   753
typedef void (*TUserModeCallbackFunc)(TAny* aThisPtr, TUserModeCallbackReason aReasonCode);
sl@0
   754
sl@0
   755
sl@0
   756
/**
sl@0
   757
An object representing a queued callback to be executed when a thread returns to user mode.
sl@0
   758
sl@0
   759
@internalComponent
sl@0
   760
*/
sl@0
   761
class TUserModeCallback
sl@0
   762
	{
sl@0
   763
public:
sl@0
   764
	TUserModeCallback(TUserModeCallbackFunc);
sl@0
   765
	~TUserModeCallback();
sl@0
   766
sl@0
   767
public:
sl@0
   768
	TUserModeCallback* volatile iNext;
sl@0
   769
	TUserModeCallbackFunc iFunc;
sl@0
   770
	};
sl@0
   771
sl@0
   772
TUserModeCallback* const KUserModeCallbackUnqueued = ((TUserModeCallback*)1);
sl@0
   773
sl@0
   774
sl@0
   775
/** Nanokernel functions
sl@0
   776
sl@0
   777
	@publishedPartner
sl@0
   778
	@released
sl@0
   779
*/
sl@0
   780
class NKern
sl@0
   781
	{
sl@0
   782
public:
sl@0
   783
	/** Bitmask values used when blocking a nanothread.
sl@0
   784
		@see NKern::Block()
sl@0
   785
	 */
sl@0
   786
	enum TBlockMode 
sl@0
   787
		{
sl@0
   788
		EEnterCS=1,		/**< Enter thread critical section before blocking */
sl@0
   789
		ERelease=2,		/**< Release specified fast mutex before blocking */
sl@0
   790
		EClaim=4,		/**< Re-acquire specified fast mutex when unblocked */
sl@0
   791
		EObstruct=8,	/**< Signifies obstruction of thread rather than lack of work to do */
sl@0
   792
		};
sl@0
   793
sl@0
   794
	/** Values that specify the context of the processor.
sl@0
   795
		@see NKern::CurrentContext()
sl@0
   796
	*/
sl@0
   797
	enum TContext
sl@0
   798
		{
sl@0
   799
		EThread=0,			/**< The processor is in a thread context*/
sl@0
   800
		EIDFC=1,			/**< The processor is in an IDFC context*/
sl@0
   801
		EInterrupt=2,		/**< The processor is in an interrupt context*/
sl@0
   802
		EEscaped=KMaxTInt	/**< Not valid a process context on target hardware*/
sl@0
   803
		};
sl@0
   804
sl@0
   805
public:
sl@0
   806
	// Threads
sl@0
   807
	IMPORT_C static TInt ThreadCreate(NThread* aThread, SNThreadCreateInfo& anInfo);
sl@0
   808
	IMPORT_C static TBool ThreadSuspend(NThread* aThread, TInt aCount);
sl@0
   809
	IMPORT_C static TBool ThreadResume(NThread* aThread);
sl@0
   810
	IMPORT_C static TBool ThreadResume(NThread* aThread, NFastMutex* aMutex);
sl@0
   811
	IMPORT_C static TBool ThreadForceResume(NThread* aThread);
sl@0
   812
	IMPORT_C static TBool ThreadForceResume(NThread* aThread, NFastMutex* aMutex);
sl@0
   813
	IMPORT_C static void ThreadRelease(NThread* aThread, TInt aReturnValue);
sl@0
   814
	IMPORT_C static void ThreadRelease(NThread* aThread, TInt aReturnValue, NFastMutex* aMutex);
sl@0
   815
	IMPORT_C static void ThreadSetPriority(NThread* aThread, TInt aPriority);
sl@0
   816
	IMPORT_C static void ThreadSetPriority(NThread* aThread, TInt aPriority, NFastMutex* aMutex);
sl@0
   817
	IMPORT_C static void ThreadRequestSignal(NThread* aThread);
sl@0
   818
	IMPORT_C static void ThreadRequestSignal(NThread* aThread, NFastMutex* aMutex);
sl@0
   819
	IMPORT_C static void ThreadRequestSignal(NThread* aThread, TInt aCount);
sl@0
   820
	IMPORT_C static void ThreadKill(NThread* aThread);
sl@0
   821
	IMPORT_C static void ThreadKill(NThread* aThread, NFastMutex* aMutex);
sl@0
   822
	IMPORT_C static void ThreadEnterCS();
sl@0
   823
	IMPORT_C static void ThreadLeaveCS();
sl@0
   824
	static NThread* _ThreadEnterCS();		/**< @internalComponent */
sl@0
   825
	static void _ThreadLeaveCS();			/**< @internalComponent */
sl@0
   826
	IMPORT_C static TInt Block(TUint32 aTimeout, TUint aMode, NFastMutex* aMutex);
sl@0
   827
	IMPORT_C static TInt Block(TUint32 aTimeout, TUint aMode);
sl@0
   828
	IMPORT_C static void NanoBlock(TUint32 aTimeout, TUint aState, TAny* aWaitObj);
sl@0
   829
	IMPORT_C static void ThreadGetUserContext(NThread* aThread, TAny* aContext, TUint32& aAvailRegistersMask);
sl@0
   830
	IMPORT_C static void ThreadSetUserContext(NThread* aThread, TAny* aContext);
sl@0
   831
	IMPORT_C static void ThreadGetSystemContext(NThread* aThread, TAny* aContext, TUint32& aAvailRegistersMask);
sl@0
   832
	static void ThreadModifyUsp(NThread* aThread, TLinAddr aUsp);
sl@0
   833
	IMPORT_C static TInt FreezeCpu();													/**< @internalComponent */
sl@0
   834
	IMPORT_C static void EndFreezeCpu(TInt aCookie);									/**< @internalComponent */
sl@0
   835
	IMPORT_C static TUint32 ThreadSetCpuAffinity(NThread* aThread, TUint32 aAffinity);	/**< @internalComponent */
sl@0
   836
	IMPORT_C static void ThreadSetTimeslice(NThread* aThread, TInt aTimeslice);			/**< @internalComponent */
sl@0
   837
	IMPORT_C static TUint64 ThreadCpuTime(NThread* aThread);							/**< @internalComponent */
sl@0
   838
	IMPORT_C static TUint32 CpuTimeMeasFreq();											/**< @internalComponent */
sl@0
   839
	static TInt QueueUserModeCallback(NThreadBase* aThread, TUserModeCallback* aCallback);	/**< @internalComponent */
sl@0
   840
	static void MoveUserModeCallbacks(NThreadBase* aSrcThread, NThreadBase* aDestThread);	/**< @internalComponent */
sl@0
   841
	static void CancelUserModeCallbacks();												/**< @internalComponent */
sl@0
   842
sl@0
   843
	// Fast semaphores
sl@0
   844
	IMPORT_C static void FSSetOwner(NFastSemaphore* aSem,NThreadBase* aThread);
sl@0
   845
	IMPORT_C static void FSWait(NFastSemaphore* aSem);
sl@0
   846
	IMPORT_C static void FSSignal(NFastSemaphore* aSem);
sl@0
   847
	IMPORT_C static void FSSignal(NFastSemaphore* aSem, NFastMutex* aMutex);
sl@0
   848
	IMPORT_C static void FSSignalN(NFastSemaphore* aSem, TInt aCount);
sl@0
   849
	IMPORT_C static void FSSignalN(NFastSemaphore* aSem, TInt aCount, NFastMutex* aMutex);
sl@0
   850
sl@0
   851
	// Fast mutexes
sl@0
   852
	IMPORT_C static void FMWait(NFastMutex* aMutex);
sl@0
   853
	IMPORT_C static void FMSignal(NFastMutex* aMutex);
sl@0
   854
	IMPORT_C static TBool FMFlash(NFastMutex* aMutex);
sl@0
   855
sl@0
   856
	// Scheduler
sl@0
   857
	IMPORT_C static void Lock();
sl@0
   858
	IMPORT_C static NThread* LockC();	
sl@0
   859
	IMPORT_C static void Unlock();
sl@0
   860
	IMPORT_C static TInt PreemptionPoint();
sl@0
   861
sl@0
   862
	// Interrupts
sl@0
   863
	IMPORT_C static TInt DisableAllInterrupts();
sl@0
   864
	IMPORT_C static TInt DisableInterrupts(TInt aLevel);
sl@0
   865
	IMPORT_C static void RestoreInterrupts(TInt aRestoreData);
sl@0
   866
	IMPORT_C static void EnableAllInterrupts();
sl@0
   867
sl@0
   868
	// Read-modify-write
sl@0
   869
	inline static TInt LockedInc(TInt& aCount)
sl@0
   870
		{ return __e32_atomic_add_ord32(&aCount,1); }
sl@0
   871
	inline static TInt LockedDec(TInt& aCount)
sl@0
   872
		{ return __e32_atomic_add_ord32(&aCount,0xffffffff); }
sl@0
   873
	inline static TInt LockedAdd(TInt& aDest, TInt aSrc)
sl@0
   874
		{ return __e32_atomic_add_ord32(&aDest,aSrc); }
sl@0
   875
	inline static TInt64 LockedInc(TInt64& aCount)
sl@0
   876
		{ return __e32_atomic_add_ord64(&aCount,1); }
sl@0
   877
	inline static TInt64 LockedDec(TInt64& aCount)
sl@0
   878
		{ return __e32_atomic_add_ord64(&aCount,TUint64(TInt64(-1))); }
sl@0
   879
	inline static TInt64 LockedAdd(TInt64& aDest, TInt64 aSrc)		/**< @internalComponent */
sl@0
   880
		{ return __e32_atomic_add_ord64(&aDest,aSrc); }
sl@0
   881
	inline static TUint32 LockedSetClear(TUint32& aDest, TUint32 aClearMask, TUint32 aSetMask)
sl@0
   882
		{ return __e32_atomic_axo_ord32(&aDest,~(aClearMask|aSetMask),aSetMask); }
sl@0
   883
	inline static TUint16 LockedSetClear16(TUint16& aDest, TUint16 aClearMask, TUint16 aSetMask)	/**< @internalComponent */
sl@0
   884
		{ return __e32_atomic_axo_ord16(&aDest,TUint16(~(aClearMask|aSetMask)),aSetMask); }
sl@0
   885
	inline static TUint8 LockedSetClear8(TUint8& aDest, TUint8 aClearMask, TUint8 aSetMask)
sl@0
   886
		{ return __e32_atomic_axo_ord8(&aDest,TUint8(~(aClearMask|aSetMask)),aSetMask); }
sl@0
   887
	inline static TInt SafeInc(TInt& aCount)
sl@0
   888
		{ return __e32_atomic_tas_ord32(&aCount,1,1,0); }
sl@0
   889
	inline static TInt SafeDec(TInt& aCount)
sl@0
   890
		{ return __e32_atomic_tas_ord32(&aCount,1,-1,0); }
sl@0
   891
	inline static TInt AddIfGe(TInt& aCount, TInt aLimit, TInt aInc)	/**< @internalComponent */
sl@0
   892
		{ return __e32_atomic_tas_ord32(&aCount,aLimit,aInc,0); }
sl@0
   893
	inline static TInt AddIfLt(TInt& aCount, TInt aLimit, TInt aInc)	/**< @internalComponent */
sl@0
   894
		{ return __e32_atomic_tas_ord32(&aCount,aLimit,0,aInc); }
sl@0
   895
	inline static TAny* SafeSwap(TAny* aNewValue, TAny*& aPtr)
sl@0
   896
		{ return __e32_atomic_swp_ord_ptr(&aPtr, aNewValue); }
sl@0
   897
	inline static TUint8 SafeSwap8(TUint8 aNewValue, TUint8& aPtr)
sl@0
   898
		{ return __e32_atomic_swp_ord8(&aPtr, aNewValue); }
sl@0
   899
	inline static TUint16 SafeSwap16(TUint16 aNewValue, TUint16& aPtr)						/**< @internalComponent */
sl@0
   900
		{ return __e32_atomic_swp_ord16(&aPtr, aNewValue); }
sl@0
   901
	inline static TBool CompareAndSwap(TAny*& aPtr, TAny* aExpected, TAny* aNew)			/**< @internalComponent */
sl@0
   902
		{ return __e32_atomic_cas_ord_ptr(&aPtr, &aExpected, aNew); }
sl@0
   903
	inline static TBool CompareAndSwap8(TUint8& aPtr, TUint8 aExpected, TUint8 aNew)		/**< @internalComponent */
sl@0
   904
		{ return __e32_atomic_cas_ord8(&aPtr, (TUint8*)&aExpected, (TUint8)aNew); }
sl@0
   905
	inline static TBool CompareAndSwap16(TUint16& aPtr, TUint16 aExpected, TUint16 aNew)	/**< @internalComponent */
sl@0
   906
		{ return __e32_atomic_cas_ord16(&aPtr, (TUint16*)&aExpected, (TUint16)aNew); }
sl@0
   907
	inline static TUint32 SafeSwap(TUint32 aNewValue, TUint32& aPtr)						/**< @internalComponent */
sl@0
   908
		{ return __e32_atomic_swp_ord32(&aPtr, aNewValue); }
sl@0
   909
	inline static TUint SafeSwap(TUint aNewValue, TUint& aPtr)								/**< @internalComponent */
sl@0
   910
		{ return __e32_atomic_swp_ord32(&aPtr, aNewValue); }
sl@0
   911
	inline static TInt SafeSwap(TInt aNewValue, TInt& aPtr)									/**< @internalComponent */
sl@0
   912
		{ return __e32_atomic_swp_ord32(&aPtr, aNewValue); }
sl@0
   913
	inline static TBool CompareAndSwap(TUint32& aPtr, TUint32 aExpected, TUint32 aNew)		/**< @internalComponent */
sl@0
   914
		{ return __e32_atomic_cas_ord32(&aPtr, &aExpected, aNew); }
sl@0
   915
	inline static TBool CompareAndSwap(TUint& aPtr, TUint aExpected, TUint aNew)			/**< @internalComponent */
sl@0
   916
		{ return __e32_atomic_cas_ord32(&aPtr, (TUint32*)&aExpected, (TUint32)aNew); }
sl@0
   917
	inline static TBool CompareAndSwap(TInt& aPtr, TInt aExpected, TInt aNew)				/**< @internalComponent */
sl@0
   918
		{ return __e32_atomic_cas_ord32(&aPtr, (TUint32*)&aExpected, (TUint32)aNew); }
sl@0
   919
sl@0
   920
sl@0
   921
	// Miscellaneous
sl@0
   922
	IMPORT_C static NThread* CurrentThread();
sl@0
   923
	IMPORT_C static TInt CurrentCpu();										/**< @internalComponent */
sl@0
   924
	IMPORT_C static TInt NumberOfCpus();									/**< @internalComponent */
sl@0
   925
	IMPORT_C static void LockSystem();
sl@0
   926
	IMPORT_C static void UnlockSystem();
sl@0
   927
	IMPORT_C static TBool FlashSystem();
sl@0
   928
	IMPORT_C static void WaitForAnyRequest();
sl@0
   929
	IMPORT_C static void Sleep(TUint32 aTime);
sl@0
   930
	IMPORT_C static void Exit();
sl@0
   931
	IMPORT_C static void DeferredExit();
sl@0
   932
	IMPORT_C static void YieldTimeslice();									/**< @internalComponent */
sl@0
   933
	IMPORT_C static void RotateReadyList(TInt aPriority);					
sl@0
   934
	IMPORT_C static void RotateReadyList(TInt aPriority, TInt aCpu);		/**< @internalTechnology */
sl@0
   935
	IMPORT_C static void RecordIntLatency(TInt aLatency, TInt aIntMask);	/**< @internalTechnology */
sl@0
   936
	IMPORT_C static void RecordThreadLatency(TInt aLatency);				/**< @internalTechnology */
sl@0
   937
	IMPORT_C static TUint32 TickCount();
sl@0
   938
	IMPORT_C static TInt TickPeriod();
sl@0
   939
	IMPORT_C static TInt TimerTicks(TInt aMilliseconds);
sl@0
   940
	IMPORT_C static TInt TimesliceTicks(TUint32 aMicroseconds);				/**< @internalTechnology */
sl@0
   941
	IMPORT_C static TInt CurrentContext();
sl@0
   942
	IMPORT_C static TUint32 FastCounter();
sl@0
   943
	IMPORT_C static TInt FastCounterFrequency();
sl@0
   944
	static void Init0(TAny* aVariantData);
sl@0
   945
	static void Init(NThread* aThread, SNThreadCreateInfo& anInfo);
sl@0
   946
	IMPORT_C static TBool KernelLocked(TInt aCount=0);						/**< @internalTechnology */
sl@0
   947
	IMPORT_C static NFastMutex* HeldFastMutex();							/**< @internalTechnology */
sl@0
   948
	static void Idle();	
sl@0
   949
	IMPORT_C static SCpuIdleHandler* CpuIdleHandler();						/**< @internalTechnology */
sl@0
   950
	static void NotifyCrash(const TAny* a0, TInt a1);						/**< @internalTechnology */
sl@0
   951
	IMPORT_C static TBool Crashed();
sl@0
   952
	static TUint32 IdleGenerationCount();
sl@0
   953
sl@0
   954
	// Debugger support
sl@0
   955
	typedef void (*TRescheduleCallback)(NThread*);
sl@0
   956
	IMPORT_C static void SchedulerHooks(TLinAddr& aStart, TLinAddr& aEnd);
sl@0
   957
	IMPORT_C static void InsertSchedulerHooks();
sl@0
   958
	IMPORT_C static void RemoveSchedulerHooks();
sl@0
   959
	IMPORT_C static void SetRescheduleCallback(TRescheduleCallback aCallback);
sl@0
   960
	};
sl@0
   961
sl@0
   962
sl@0
   963
/** Create a fast semaphore
sl@0
   964
sl@0
   965
	@publishedPartner
sl@0
   966
	@released
sl@0
   967
*/
sl@0
   968
inline NFastSemaphore::NFastSemaphore(NThreadBase* aThread)
sl@0
   969
	:	iCount(0),
sl@0
   970
		iOwningThread(aThread ? aThread : (NThreadBase*)NKern::CurrentThread())
sl@0
   971
	{
sl@0
   972
	}
sl@0
   973
sl@0
   974
sl@0
   975
#endif