00001 #if !defined(__THREADCONTEXT_HPP)
00002 #define __THREADCONTEXT_HPP
00003
00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022
00023
00024 #if !defined(__COMMON_HPP)
00025 #include <Common.hpp>
00026 #endif
00027
00028 #if !defined(__THREADEXCEPTION_HPP)
00029 #include <ThreadException.hpp>
00030 #endif
00031
00032 namespace corelinux
00033 {
00034
00036
00037 enum ThreadState
00038 {
00040
00041 THREAD_WAITING_TO_START = 0,
00042
00044
00045 THREAD_STARTING,
00046
00048
00049 THREAD_RUNNING,
00050
00052
00053 THREAD_NORMAL_EXIT,
00054
00056
00057 THREAD_START_EXCEPTION,
00058
00060
00061 THREAD_EXCEPTION,
00062
00064
00065 THREAD_START_FAILED
00066
00067 };
00068
00069
00070 DECLARE_CLASS( ThreadContext );
00071
00078 typedef int (*CallerFunctionPtr)(ThreadContextPtr);
00079
00086 typedef Int (*ThreadFrameFunctionPtr)( ThreadContextPtr );
00087
00097 typedef ThreadContextPtr (*ThreadContextCreatePtr)( ThreadContextRef );
00098
00108 typedef void (*ThreadContextDestroyPtr)( ThreadContextPtr );
00109
00118 typedef BytePtr (*ThreadStackCreatePtr)( ThreadContextPtr );
00119
00129 typedef void (*ThreadStackDestroyPtr)( BytePtr );
00130
00137 class ThreadContext : public Synchronized
00138 {
00139
00140 public:
00141
00142
00143
00144
00145
00156 ThreadContext( CallerFunctionPtr )
00157 throw ( Assertion );
00158
00171 ThreadContext( CallerFunctionPtr, Size )
00172 throw ( Assertion );
00173
00183 ThreadContext( ThreadContextCref )
00184
00185 throw ( Assertion );
00186
00188
00189 virtual ~ThreadContext( void );
00190
00191
00192
00193
00194
00204 ThreadContextRef operator=( ThreadContextCref )
00205 throw( Assertion );
00206
00213 bool operator==( ThreadContextCref ) const;
00214
00221 bool operator==( ThreadIdentifierCref ) const;
00222
00229 bool operator==( CallerFunctionPtr ) const;
00230
00235 operator ThreadIdentifierCref( void ) const;
00236
00237
00238
00239
00246 const ThreadState & getState( void ) const;
00247
00254 Size getStackSize( void ) const;
00255
00263 Int getShareMask( void ) const;
00264
00273 Int getReturnCode( void ) const;
00274
00281 ThreadIdentifierCref getIdentifier( void ) const;
00282
00289 virtual ThreadFrameFunctionPtr getFramePointer( void );
00290
00292
00293 BytePtr getStack( void );
00294
00296
00297 BytePtr *getStackTop( void );
00298
00299
00300
00301
00302
00311 void setShareMask( Int );
00312
00322 void setFrameFunction( ThreadFrameFunctionPtr );
00323
00339 void setContextFunctions
00340 (
00341 ThreadContextCreatePtr ,
00342 ThreadContextDestroyPtr
00343 );
00344
00360 void setStackFunctions
00361 (
00362 ThreadStackCreatePtr ,
00363 ThreadStackDestroyPtr
00364 );
00365
00366
00372 void setReturnCode( Int );
00373
00379 void setThreadState( ThreadState );
00380
00388 static Int cloneFrameFunction( ThreadContextPtr );
00389
00390
00391
00392
00393
00403 ThreadContextPtr createContext( void )
00404 throw ( ThreadException );
00405
00413 void destroyContext( ThreadContextPtr ) throw ( Assertion );
00414
00415 protected:
00416
00417
00418
00419 00421
00422 ThreadContext( void ) throw ( Assertion );
00423
00424
00425
00426
00427
00436 ThreadContextRef operator=( ThreadIdentifier );
00437
00438
00439
00440
00441
00448 CallerFunctionPtr getCallerFunction( void );
00449
00450 private:
00451
00452
00453
00454
00455
00465 static Int defaultFrameFunction( ThreadContextPtr );
00466
00467
00468
00469
00470
00479 static ThreadContextPtr defaultContextCreate( ThreadContextRef );
00480
00486 static void defaultContextDestroy( ThreadContextPtr );
00487
00494 static BytePtr defaultStackCreate( ThreadContextPtr );
00495
00501 static void defaultStackDestroy( BytePtr );
00502
00503
00504 private:
00505
00507
00508 static ThreadFrameFunctionPtr theDefaultFrameFunction;
00509
00511
00512 static ThreadContextCreatePtr theDefaultContextCreator;
00513
00515
00516 static ThreadContextDestroyPtr theDefaultContextDestroyer;
00517
00519
00520 static ThreadStackCreatePtr theDefaultStackCreator;
00521
00523
00524 static ThreadStackDestroyPtr theDefaultStackDestroyer;
00525
00527
00528 ThreadFrameFunctionPtr theFrameFunction;
00529
00531
00532 ThreadContextCreatePtr theContextCreator;
00533
00535
00536 ThreadContextDestroyPtr theContextDestroyer;
00537
00539
00540 ThreadStackCreatePtr theStackCreator;
00541
00543
00544 ThreadStackDestroyPtr theStackDestroyer;
00545
00547
00548 BytePtr theStack;
00549
00551
00552 Size theStackSize;
00553
00555
00556 Int theShareMask;
00557
00559
00560 ThreadIdentifier theThreadIdentifier;
00561
00563
00564 CallerFunctionPtr theCallersFunction;
00565
00567
00568 ThreadState theThreadState;
00569
00571
00572 Int theReturnCode;
00573 };
00574
00575 }
00576
00577 #endif // if !defined(__THREADCONTEXT_HPP)
00578
00579 00580 00581 00582 00583 00584 00585
00586