|
|
/* |
|
|
File: Multiprocessing.h |
|
|
|
|
|
Contains: Multiprocessing interfaces |
|
|
|
|
|
Version: QuickTime 7.3 |
|
|
|
|
|
Copyright: (c) 2007 (c) 1996-2001 by Apple Computer, Inc. and (c) 1995-1997 DayStar Digital, Inc. |
|
|
|
|
|
Bugs?: For bug reports, consult the following page on |
|
|
the World Wide Web: |
|
|
|
|
|
http://developer.apple.com/bugreporter/ |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
=========================================================================================== |
|
|
*** WARNING: You must properly check the availability of MP services before calling them! |
|
|
See the section titled "Checking API Availability". |
|
|
=========================================================================================== |
|
|
*/ |
|
|
|
|
|
|
|
|
#ifndef __MULTIPROCESSING__ |
|
|
#define __MULTIPROCESSING__ |
|
|
|
|
|
#ifndef __MACTYPES__ |
|
|
#include <MacTypes.h> |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if PRAGMA_ONCE |
|
|
#pragma once |
|
|
#endif |
|
|
|
|
|
#ifdef __cplusplus |
|
|
extern "C" { |
|
|
#endif |
|
|
|
|
|
#if PRAGMA_IMPORT |
|
|
#pragma import on |
|
|
#endif |
|
|
|
|
|
#if PRAGMA_STRUCT_ALIGN |
|
|
#pragma options align=power |
|
|
#elif PRAGMA_STRUCT_PACKPUSH |
|
|
#pragma pack(push, 2) |
|
|
#elif PRAGMA_STRUCT_PACK |
|
|
#pragma pack(2) |
|
|
#endif |
|
|
|
|
|
|
|
|
/* |
|
|
=========================================================================================== |
|
|
This is the header file for version 2.2 of the Mac OS multiprocessing support. This version |
|
|
has been totally reimplemented and has significant new services. The main goal of the |
|
|
reimplementation has been to transfer task management into the core operating system to provide |
|
|
much more reliable and more efficient operation, including on single processor machines. |
|
|
The memory management has also been massively improved, it is much faster and wastes much |
|
|
less space. New services include POSIX style per-task storage, timers with millisecond and |
|
|
microsecond resolutions, memory allocation at a specified alignment, and system pageable |
|
|
and RAM resident memory pools. See the MP API documentation for details. |
|
|
The old "DayStar" debugging services (whose names began with an underscore) have been |
|
|
removed from this header. A very few are still implemented for binary compatibility, or in |
|
|
cases where they happened to be exposed inappropriately. (E.g. _MPIsFullyInitialized must |
|
|
be called to see if the MP API is ReallyTruly(tm) usable.) New code and recompiles of old |
|
|
code should avoid use of these defunct services, except for _MPIsFullyInitialized. |
|
|
=========================================================================================== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
=========================================================================================== |
|
|
The following services are from the original MP API and remain supported in version 2.0: |
|
|
MPProcessors |
|
|
MPCreateTask |
|
|
MPTerminateTask |
|
|
MPCurrentTaskID |
|
|
MPYield |
|
|
MPExit |
|
|
MPCreateQueue |
|
|
MPDeleteQueue |
|
|
MPNotifyQueue |
|
|
MPWaitOnQueue |
|
|
MPCreateSemaphore |
|
|
MPCreateBinarySemaphore (In C only, a macro that calls MPCreateSemaphore.) |
|
|
MPDeleteSemaphore |
|
|
MPSignalSemaphore |
|
|
MPWaitOnSemaphore |
|
|
MPCreateCriticalRegion |
|
|
MPDeleteCriticalRegion |
|
|
MPEnterCriticalRegion |
|
|
MPExitCriticalRegion |
|
|
MPAllocate (Deprecated, use MPAllocateAligned for new builds.) |
|
|
MPFree |
|
|
MPBlockCopy |
|
|
MPLibraryIsLoaded (In C only, a macro.) |
|
|
_MPIsFullyInitialized (See comments about checking for MP API availability.) |
|
|
=========================================================================================== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
=========================================================================================== |
|
|
The following services are new in version 2.0: |
|
|
MPProcessorsScheduled |
|
|
MPSetTaskWeight |
|
|
MPTaskIsPreemptive |
|
|
MPAllocateTaskStorageIndex |
|
|
MPDeallocateTaskStorageIndex |
|
|
MPSetTaskStorageValue |
|
|
MPGetTaskStorageValue |
|
|
MPSetQueueReserve |
|
|
MPCreateEvent |
|
|
MPDeleteEvent |
|
|
MPSetEvent |
|
|
MPWaitForEvent |
|
|
UpTime |
|
|
DurationToAbsolute |
|
|
AbsoluteToDuration |
|
|
MPDelayUntil |
|
|
MPCreateTimer |
|
|
MPDeleteTimer |
|
|
MPSetTimerNotify |
|
|
MPArmTimer |
|
|
MPCancelTimer |
|
|
MPSetExceptionHandler |
|
|
MPThrowException |
|
|
MPDisposeTaskException |
|
|
MPExtractTaskState |
|
|
MPSetTaskState |
|
|
MPRegisterDebugger |
|
|
MPUnregisterDebugger |
|
|
MPAllocateAligned (Preferred over MPAllocate.) |
|
|
MPGetAllocatedBlockSize |
|
|
MPBlockClear |
|
|
MPDataToCode |
|
|
MPRemoteCall (Preferred over _MPRPC.) |
|
|
=========================================================================================== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
=========================================================================================== |
|
|
The following services are new in version 2.1: |
|
|
MPCreateNotification |
|
|
MPDeleteNotification |
|
|
MPModifyNotification |
|
|
MPCauseNotification |
|
|
MPGetNextTaskID |
|
|
MPGetNextCpuID |
|
|
=========================================================================================== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
=========================================================================================== |
|
|
The following services are "unofficial" extensions to the original API. They are not in |
|
|
the multiprocessing API documentation, but were in previous versions of this header. They |
|
|
remain supported in version 2.0. They may not be supported in other environments. |
|
|
_MPRPC (Deprecated, use MPRemoteCall for new builds.) |
|
|
_MPAllocateSys (Deprecated, use MPAllocateAligned for new builds.) |
|
|
_MPTaskIsToolboxSafe |
|
|
_MPLibraryVersion |
|
|
_MPLibraryIsCompatible |
|
|
=========================================================================================== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
=========================================================================================== |
|
|
The following services were in previous versions of this header for "debugging only" use. |
|
|
They are NOT implemented in version 2.0. For old builds they can be accessed by defining |
|
|
the symbol MPIncludeDefunctServices to have a nonzero value. |
|
|
_MPInitializePrintf |
|
|
_MPPrintf |
|
|
_MPDebugStr |
|
|
_MPStatusPString |
|
|
_MPStatusCString |
|
|
=========================================================================================== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
General Types and Constants |
|
|
=========================== |
|
|
*/ |
|
|
|
|
|
|
|
|
#define MPCopyrightNotice \ |
|
|
"Copyright <EFBFBD> 1995-2000 Apple Computer, Inc.\n" |
|
|
#define MPLibraryName "MPLibrary" |
|
|
#define MPLibraryCName MPLibraryName |
|
|
#define MPLibraryPName "\p" MPLibraryName |
|
|
#define MP_API_Version "2.3" |
|
|
|
|
|
enum { |
|
|
MPLibrary_MajorVersion = 2, /* ! When these change be sure to update the build versions*/ |
|
|
MPLibrary_MinorVersion = 3, /* ! used in the startup check in MPInitializeAPI!*/ |
|
|
MPLibrary_Release = 1, |
|
|
MPLibrary_DevelopmentRevision = 1 |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct OpaqueMPProcessID* MPProcessID; |
|
|
typedef struct OpaqueMPTaskID* MPTaskID; |
|
|
typedef struct OpaqueMPQueueID* MPQueueID; |
|
|
typedef struct OpaqueMPSemaphoreID* MPSemaphoreID; |
|
|
typedef struct OpaqueMPCriticalRegionID* MPCriticalRegionID; |
|
|
typedef struct OpaqueMPTimerID* MPTimerID; |
|
|
typedef struct OpaqueMPEventID* MPEventID; |
|
|
typedef struct OpaqueMPAddressSpaceID* MPAddressSpaceID; |
|
|
typedef struct OpaqueMPNotificationID* MPNotificationID; |
|
|
typedef struct OpaqueMPCoherenceID* MPCoherenceID; |
|
|
typedef struct OpaqueMPCpuID* MPCpuID; |
|
|
typedef struct OpaqueMPAreaID* MPAreaID; |
|
|
typedef struct OpaqueMPConsoleID* MPConsoleID; |
|
|
typedef struct OpaqueMPOpaqueID* MPOpaqueID; |
|
|
enum { |
|
|
/* Values for MPOpaqueIDClass.*/ |
|
|
kOpaqueAnyID = 0, |
|
|
kOpaqueProcessID = 1, |
|
|
kOpaqueTaskID = 2, |
|
|
kOpaqueTimerID = 3, |
|
|
kOpaqueQueueID = 4, |
|
|
kOpaqueSemaphoreID = 5, |
|
|
kOpaqueCriticalRegionID = 6, |
|
|
kOpaqueCpuID = 7, |
|
|
kOpaqueAddressSpaceID = 8, |
|
|
kOpaqueEventID = 9, |
|
|
kOpaqueCoherenceID = 10, |
|
|
kOpaqueAreaID = 11, |
|
|
kOpaqueNotificationID = 12, |
|
|
kOpaqueConsoleID = 13 |
|
|
}; |
|
|
|
|
|
typedef UInt32 MPOpaqueIDClass; |
|
|
|
|
|
enum { |
|
|
kMPNoID = kInvalidID /* New code should use kInvalidID everywhere.*/ |
|
|
}; |
|
|
|
|
|
|
|
|
typedef OptionBits MPTaskOptions; |
|
|
typedef UInt32 TaskStorageIndex; |
|
|
typedef UInt32 TaskStorageValue; |
|
|
typedef ItemCount MPSemaphoreCount; |
|
|
typedef UInt32 MPTaskWeight; |
|
|
typedef UInt32 MPEventFlags; |
|
|
typedef UInt32 MPExceptionKind; |
|
|
typedef UInt32 MPTaskStateKind; |
|
|
typedef UInt32 MPPageSizeClass; |
|
|
|
|
|
enum { |
|
|
kDurationImmediate = 0L, |
|
|
kDurationForever = 0x7FFFFFFF, |
|
|
kDurationMillisecond = 1, |
|
|
kDurationMicrosecond = -1 |
|
|
}; |
|
|
|
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Process/Processor Services |
|
|
========================== |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPProcessors() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( ItemCount ) |
|
|
MPProcessors(void); |
|
|
|
|
|
|
|
|
/* The physical total.*/ |
|
|
|
|
|
/* |
|
|
* MPProcessorsScheduled() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( ItemCount ) |
|
|
MPProcessorsScheduled(void); |
|
|
|
|
|
|
|
|
/* Those currently in use.*/ |
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Tasking Services |
|
|
================ |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
enum { |
|
|
/* For MPCreateTask options*/ |
|
|
kMPCreateTaskSuspendedMask = 1L << 0, |
|
|
kMPCreateTaskTakesAllExceptionsMask = 1L << 1, |
|
|
kMPCreateTaskNotDebuggableMask = 1L << 2, |
|
|
kMPCreateTaskValidOptionsMask = kMPCreateTaskSuspendedMask | kMPCreateTaskTakesAllExceptionsMask | kMPCreateTaskNotDebuggableMask |
|
|
}; |
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef CALLBACK_API_C( OSStatus , TaskProc )(void * parameter); |
|
|
|
|
|
/* |
|
|
* MPCreateTask() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPCreateTask( |
|
|
TaskProc entryPoint, |
|
|
void * parameter, |
|
|
ByteCount stackSize, |
|
|
MPQueueID notifyQueue, |
|
|
void * terminationParameter1, |
|
|
void * terminationParameter2, |
|
|
MPTaskOptions options, |
|
|
MPTaskID * task); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPTerminateTask() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPTerminateTask( |
|
|
MPTaskID task, |
|
|
OSStatus terminationStatus); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPSetTaskWeight() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPSetTaskWeight( |
|
|
MPTaskID task, |
|
|
MPTaskWeight weight); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPTaskIsPreemptive() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( Boolean ) |
|
|
MPTaskIsPreemptive(MPTaskID taskID); |
|
|
|
|
|
|
|
|
/* May be kInvalidID.*/ |
|
|
|
|
|
/* |
|
|
* MPExit() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
MPExit(OSStatus status); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPYield() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
MPYield(void); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPCurrentTaskID() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( MPTaskID ) |
|
|
MPCurrentTaskID(void); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPSetTaskType() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.3 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.1 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPSetTaskType( |
|
|
MPTaskID task, |
|
|
OSType taskType); |
|
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
/* |
|
|
--------------------------------------------------- |
|
|
! The task storage services are new in version 2.0. |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPAllocateTaskStorageIndex() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPAllocateTaskStorageIndex(TaskStorageIndex * index); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPDeallocateTaskStorageIndex() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPDeallocateTaskStorageIndex(TaskStorageIndex index); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPSetTaskStorageValue() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPSetTaskStorageValue( |
|
|
TaskStorageIndex index, |
|
|
TaskStorageValue value); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPGetTaskStorageValue() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( TaskStorageValue ) |
|
|
MPGetTaskStorageValue(TaskStorageIndex index); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Synchronization Services |
|
|
======================== |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPCreateQueue() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPCreateQueue(MPQueueID * queue); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPDeleteQueue() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPDeleteQueue(MPQueueID queue); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPNotifyQueue() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPNotifyQueue( |
|
|
MPQueueID queue, |
|
|
void * param1, |
|
|
void * param2, |
|
|
void * param3); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPWaitOnQueue() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPWaitOnQueue( |
|
|
MPQueueID queue, |
|
|
void ** param1, |
|
|
void ** param2, |
|
|
void ** param3, |
|
|
Duration timeout); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPSetQueueReserve() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPSetQueueReserve( |
|
|
MPQueueID queue, |
|
|
ItemCount count); |
|
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPCreateSemaphore() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPCreateSemaphore( |
|
|
MPSemaphoreCount maximumValue, |
|
|
MPSemaphoreCount initialValue, |
|
|
MPSemaphoreID * semaphore); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPDeleteSemaphore() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPDeleteSemaphore(MPSemaphoreID semaphore); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPSignalSemaphore() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPSignalSemaphore(MPSemaphoreID semaphore); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPWaitOnSemaphore() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPWaitOnSemaphore( |
|
|
MPSemaphoreID semaphore, |
|
|
Duration timeout); |
|
|
|
|
|
|
|
|
|
|
|
#define MPCreateBinarySemaphore(semaphore) \ |
|
|
MPCreateSemaphore ( 1, 1, (semaphore) ) |
|
|
|
|
|
/* -------------------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPCreateCriticalRegion() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPCreateCriticalRegion(MPCriticalRegionID * criticalRegion); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPDeleteCriticalRegion() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPDeleteCriticalRegion(MPCriticalRegionID criticalRegion); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPEnterCriticalRegion() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPEnterCriticalRegion( |
|
|
MPCriticalRegionID criticalRegion, |
|
|
Duration timeout); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPExitCriticalRegion() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPExitCriticalRegion(MPCriticalRegionID criticalRegion); |
|
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
/* |
|
|
* MPCreateEvent() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API( OSStatus ) |
|
|
MPCreateEvent(MPEventID * event); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPDeleteEvent() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPDeleteEvent(MPEventID event); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPSetEvent() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPSetEvent( |
|
|
MPEventID event, |
|
|
MPEventFlags flags); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPWaitForEvent() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API( OSStatus ) |
|
|
MPWaitForEvent( |
|
|
MPEventID event, |
|
|
MPEventFlags * flags, |
|
|
Duration timeout); |
|
|
|
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Notification Services (API) |
|
|
===================== |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPCreateNotification() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.1 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPCreateNotification(MPNotificationID * notificationID); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPDeleteNotification() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.1 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPDeleteNotification(MPNotificationID notificationID); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPModifyNotification() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.1 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPModifyNotification( |
|
|
MPNotificationID notificationID, |
|
|
MPOpaqueID anID, |
|
|
void * notifyParam1, |
|
|
void * notifyParam2, |
|
|
void * notifyParam3); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPModifyNotificationParameters() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.3 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.1 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPModifyNotificationParameters( |
|
|
MPNotificationID notificationID, |
|
|
MPOpaqueIDClass kind, |
|
|
void * notifyParam1, |
|
|
void * notifyParam2, |
|
|
void * notifyParam3); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPCauseNotification() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.1 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPCauseNotification(MPNotificationID notificationID); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Timer Services |
|
|
============== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
-------------------------------------------- |
|
|
! The timer services are new in version 2.0. |
|
|
*/ |
|
|
|
|
|
|
|
|
#if 0 |
|
|
/* For now these are taken from DriverServices, should be in a better place.*/ |
|
|
#if CALL_NOT_IN_CARBON |
|
|
/* |
|
|
* UpTime() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: not available |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( AbsoluteTime ) |
|
|
UpTime(void); |
|
|
|
|
|
|
|
|
/* |
|
|
* DurationToAbsolute() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: not available |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( AbsoluteTime ) |
|
|
DurationToAbsolute(Duration duration); |
|
|
|
|
|
|
|
|
/* |
|
|
* AbsoluteToDuration() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: not available |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( Duration ) |
|
|
AbsoluteToDuration(AbsoluteTime time); |
|
|
|
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */ |
|
|
|
|
|
#endif /* 0 */ |
|
|
|
|
|
|
|
|
enum { |
|
|
/* For MPArmTimer options*/ |
|
|
kMPPreserveTimerIDMask = 1L << 0, |
|
|
kMPTimeIsDeltaMask = 1L << 1, |
|
|
kMPTimeIsDurationMask = 1L << 2 |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPDelayUntil() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPDelayUntil(AbsoluteTime * expirationTime); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if CALL_NOT_IN_CARBON |
|
|
/* |
|
|
* MPDelayUntilSys() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.1 and later |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API( OSStatus ) |
|
|
MPDelayUntilSys(AbsoluteTime * expirationTime); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */ |
|
|
|
|
|
/* |
|
|
* MPCreateTimer() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPCreateTimer(MPTimerID * timerID); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPDeleteTimer() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPDeleteTimer(MPTimerID timerID); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPSetTimerNotify() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPSetTimerNotify( |
|
|
MPTimerID timerID, |
|
|
MPOpaqueID anID, |
|
|
void * notifyParam1, |
|
|
void * notifyParam2, |
|
|
void * notifyParam3); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPArmTimer() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPArmTimer( |
|
|
MPTimerID timerID, |
|
|
AbsoluteTime * expirationTime, |
|
|
OptionBits options); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPCancelTimer() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPCancelTimer( |
|
|
MPTimerID timerID, |
|
|
AbsoluteTime * timeRemaining); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Memory Services |
|
|
=============== |
|
|
*/ |
|
|
|
|
|
|
|
|
enum { |
|
|
/* Maximum allocation request size is 1GB.*/ |
|
|
kMPMaxAllocSize = 1024L * 1024 * 1024 |
|
|
}; |
|
|
|
|
|
enum { |
|
|
/* Values for the alignment parameter to MPAllocateAligned.*/ |
|
|
kMPAllocateDefaultAligned = 0, |
|
|
kMPAllocate8ByteAligned = 3, |
|
|
kMPAllocate16ByteAligned = 4, |
|
|
kMPAllocate32ByteAligned = 5, |
|
|
kMPAllocate1024ByteAligned = 10, |
|
|
kMPAllocate4096ByteAligned = 12, |
|
|
kMPAllocateMaxAlignment = 16, /* Somewhat arbitrary limit on expectations.*/ |
|
|
kMPAllocateAltiVecAligned = kMPAllocate16ByteAligned, /* The P.C. name.*/ |
|
|
kMPAllocateVMXAligned = kMPAllocateAltiVecAligned, /* The older, common name.*/ |
|
|
kMPAllocateVMPageAligned = 254, /* Pseudo value, converted at runtime.*/ |
|
|
kMPAllocateInterlockAligned = 255 /* Pseudo value, converted at runtime.*/ |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
enum { |
|
|
/* Values for the options parameter to MPAllocateAligned.*/ |
|
|
kMPAllocateClearMask = 0x0001, /* Zero the allocated block.*/ |
|
|
kMPAllocateGloballyMask = 0x0002, /* Allocate from the globally visible pool.*/ |
|
|
kMPAllocateResidentMask = 0x0004, /* Allocate from the RAM-resident pool.*/ |
|
|
kMPAllocateNoGrowthMask = 0x0010, /* Do not attempt to grow the pool.*/ |
|
|
kMPAllocateNoCreateMask = 0x0020 /* Do not attempt to create the pool if it doesn't exist yet.*/ |
|
|
}; |
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPAllocateAligned() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( LogicalAddress ) |
|
|
MPAllocateAligned( |
|
|
ByteCount size, |
|
|
UInt8 alignment, |
|
|
OptionBits options); |
|
|
|
|
|
|
|
|
/* ! MPAllocateAligned is new in version 2.0.*/ |
|
|
|
|
|
/* |
|
|
* MPAllocate() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( LogicalAddress ) |
|
|
MPAllocate(ByteCount size); |
|
|
|
|
|
|
|
|
/* Use MPAllocateAligned instead.*/ |
|
|
|
|
|
/* |
|
|
* MPFree() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
MPFree(LogicalAddress object); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPGetAllocatedBlockSize() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( ByteCount ) |
|
|
MPGetAllocatedBlockSize(LogicalAddress object); |
|
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPBlockCopy() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
MPBlockCopy( |
|
|
LogicalAddress source, |
|
|
LogicalAddress destination, |
|
|
ByteCount size); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPBlockClear() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
MPBlockClear( |
|
|
LogicalAddress address, |
|
|
ByteCount size); |
|
|
|
|
|
|
|
|
/* ! MPBlockClear is new in version 2.0.*/ |
|
|
|
|
|
/* |
|
|
* MPDataToCode() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
MPDataToCode( |
|
|
LogicalAddress address, |
|
|
ByteCount size); |
|
|
|
|
|
|
|
|
/* ! MPDataToCode is new in version 2.0.*/ |
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Exception/Debugging Services |
|
|
============================ |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
------------------------------------------------------------------------------------------- |
|
|
*** Important Note *** |
|
|
---------------------- |
|
|
|
|
|
The functions MPExtractTaskState and MPSetTaskState infer the size of the "info" buffer |
|
|
from the "kind" parameter. A given value for MPTaskStateKind will always refer to a |
|
|
single specific physical buffer layout. Should new register sets be added, or the size |
|
|
or number of any registers change, new values of MPTaskStateKind will be introduced to |
|
|
refer to the new buffer layouts. |
|
|
|
|
|
The following types for the buffers are in MachineExceptions. The correspondence between |
|
|
MPTaskStateKind values and MachineExceptions types is: |
|
|
|
|
|
kMPTaskStateRegisters -> RegisterInformation |
|
|
kMPTaskStateFPU -> FPUInformation |
|
|
kMPTaskStateVectors -> VectorInformation |
|
|
kMPTaskStateMachine -> MachineInformation |
|
|
kMPTaskState32BitMemoryException -> ExceptionInfo for old-style 32-bit memory exceptions |
|
|
|
|
|
For reference, on PowerPC the MachineExceptions types contain: |
|
|
|
|
|
RegisterInformation -> The GPRs, 32 values of 64 bits each. |
|
|
FPUInformation -> The FPRs plus FPSCR, 32 values of 64 bits each, one value of |
|
|
32 bits. |
|
|
VectorInformation -> The AltiVec vector registers plus VSCR and VRSave, 32 values |
|
|
of 128 bits each, one value of 128 bits, and one 32 bit value. |
|
|
MachineInformation -> The CTR, LR, PC, each of 64 bits. The CR, XER, MSR, MQ, |
|
|
exception kind, and DSISR, each of 32 bits. The 64 bit DAR. |
|
|
ExceptionInfo -> Only memory exceptions are specified, 4 fields of 32 bits each. |
|
|
Note that this type only covers memory exceptions on 32-bit CPUs! |
|
|
The following types are declared here: |
|
|
kMPTaskStateTaskInfo -> MPTaskInfo |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
enum { |
|
|
/* Values for the TaskStateKind to MPExtractTaskState and MPSetTaskState.*/ |
|
|
kMPTaskStateRegisters = 0, /* The task general registers.*/ |
|
|
kMPTaskStateFPU = 1, /* The task floating point registers*/ |
|
|
kMPTaskStateVectors = 2, /* The task vector registers*/ |
|
|
kMPTaskStateMachine = 3, /* The task machine registers*/ |
|
|
kMPTaskState32BitMemoryException = 4, /* The task memory exception information for 32-bit CPUs.*/ |
|
|
kMPTaskStateTaskInfo = 5 /* Static and dynamic information about the task.*/ |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
enum { |
|
|
/* Option bits and numbers for MPDisposeTaskException.*/ |
|
|
kMPTaskPropagate = 0, /* The exception is propagated.*/ |
|
|
kMPTaskResumeStep = 1, /* The task is resumed and single step is enabled.*/ |
|
|
kMPTaskResumeBranch = 2, /* The task is resumed and branch stepping is enabled.*/ |
|
|
kMPTaskResumeMask = 0x0000, /* The task is resumed.*/ |
|
|
kMPTaskPropagateMask = 1 << kMPTaskPropagate, /* The exception is propagated.*/ |
|
|
kMPTaskResumeStepMask = 1 << kMPTaskResumeStep, /* The task is resumed and single step is enabled.*/ |
|
|
kMPTaskResumeBranchMask = 1 << kMPTaskResumeBranch /* The task is resumed and branch stepping is enabled.*/ |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
enum { |
|
|
/* For kMPTaskStateTaskInfo, the task's runState*/ |
|
|
kMPTaskBlocked = 0, /* Task is blocked (queued on resource)*/ |
|
|
kMPTaskReady = 1, /* Task is runnable*/ |
|
|
kMPTaskRunning = 2 /* Task is running*/ |
|
|
}; |
|
|
|
|
|
enum { |
|
|
/* For kMPTaskStateTaskInfo, the version of the MPTaskInfo structure requested.*/ |
|
|
kMPTaskInfoVersion = 3 |
|
|
}; |
|
|
|
|
|
|
|
|
struct MPTaskInfo { |
|
|
PBVersion version; /* Version 3 of the data structure requested*/ |
|
|
|
|
|
OSType name; /* Task name*/ |
|
|
|
|
|
OSType queueName; /* Task's queue owner name*/ |
|
|
UInt16 runState; /* Running, ready, blocked*/ |
|
|
UInt16 lastCPU; /* Address of CPU where task previously ran*/ |
|
|
UInt32 weight; /* Processing weight: 1 - 10,000*/ |
|
|
|
|
|
MPProcessID processID; /* Owning process ID*/ |
|
|
|
|
|
AbsoluteTime cpuTime; /* Accumulated task time*/ |
|
|
AbsoluteTime schedTime; /* Time when last scheduled*/ |
|
|
AbsoluteTime creationTime; /* Time when task created*/ |
|
|
|
|
|
ItemCount codePageFaults; /* Page faults from code execution*/ |
|
|
ItemCount dataPageFaults; /* Page faults from data access*/ |
|
|
ItemCount preemptions; /* Number of times task was preempted*/ |
|
|
|
|
|
MPCpuID cpuID; /* ID of CPU where task previously ran.*/ |
|
|
MPOpaqueID blockedObject; /* ID of blocked object.*/ |
|
|
MPAddressSpaceID spaceID; /* Address space ID of this task.*/ |
|
|
|
|
|
LogicalAddress stackBase; /* Base of stack (lowest address).*/ |
|
|
LogicalAddress stackLimit; /* Stack limit (highest address).*/ |
|
|
LogicalAddress stackCurr; /* Current stack address.*/ |
|
|
}; |
|
|
typedef struct MPTaskInfo MPTaskInfo; |
|
|
/* |
|
|
Upon a task exception, the following message is sent to the designated queue: |
|
|
1. The MPTaskID, |
|
|
2. The exception kind. These are enumerated in the interfaces header MachineExceptions.h |
|
|
3. N/A |
|
|
*/ |
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPSetExceptionHandler() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPSetExceptionHandler( |
|
|
MPTaskID task, |
|
|
MPQueueID exceptionQ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPDisposeTaskException() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPDisposeTaskException( |
|
|
MPTaskID task, |
|
|
OptionBits action); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPExtractTaskState() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPExtractTaskState( |
|
|
MPTaskID task, |
|
|
MPTaskStateKind kind, |
|
|
void * info); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPSetTaskState() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPSetTaskState( |
|
|
MPTaskID task, |
|
|
MPTaskStateKind kind, |
|
|
void * info); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPThrowException() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPThrowException( |
|
|
MPTaskID task, |
|
|
MPExceptionKind kind); |
|
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
typedef UInt32 MPDebuggerLevel; |
|
|
enum { |
|
|
kMPLowLevelDebugger = 0x00000000, /* MacsBug-like*/ |
|
|
kMPMidLevelDebugger = 0x10000000, /* Jasik-like*/ |
|
|
kMPHighLevelDebugger = 0x20000000 /* Metrowerks-like*/ |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPRegisterDebugger() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPRegisterDebugger( |
|
|
MPQueueID queue, |
|
|
MPDebuggerLevel level); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPUnregisterDebugger() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( OSStatus ) |
|
|
MPUnregisterDebugger(MPQueueID queue); |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Remote Call Services |
|
|
==================== |
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
typedef CALLBACK_API_C( void *, MPRemoteProcedure )(void * parameter); |
|
|
|
|
|
typedef UInt8 MPRemoteContext; |
|
|
enum { |
|
|
kMPAnyRemoteContext = 0, |
|
|
kMPOwningProcessRemoteContext = 1, |
|
|
kMPInterruptRemoteContext = 2, |
|
|
kMPAsyncInterruptRemoteContext = 3 |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
* MPRemoteCall() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 2.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( void * ) |
|
|
MPRemoteCall( |
|
|
MPRemoteProcedure remoteProc, |
|
|
void * parameter, |
|
|
MPRemoteContext context); |
|
|
|
|
|
|
|
|
/* ! MPRemoteCall is new in version 2.0.*/ |
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Checking API Availability |
|
|
========================= |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
=========================================================================================== |
|
|
*** WARNING: You must properly check the availability of MP services before calling them! |
|
|
=========================================================================================== |
|
|
|
|
|
Checking for the availability of the MP API is rather ugly. This is a historical problem, |
|
|
caused by the original implementation letting itself get prepared when it really wasn't |
|
|
usable and complicated by some important clients then depending on weak linking to "work". |
|
|
(And further complicated by CFM not supporting "deferred" imports, which is how many |
|
|
programmers think weak imports work.) |
|
|
|
|
|
The end result is that the MP API library may get prepared by CFM but be totally unusable. |
|
|
This means that if you import from the MP API library, you cannot simply check for a |
|
|
resolved import to decide if MP services are available. Worse, if you explicitly prepare |
|
|
the MP API library you cannot assume that a noErr result from GetSharedLibrary means that |
|
|
MP services are available. |
|
|
|
|
|
o If you import from the MP API library you MUST: |
|
|
|
|
|
Use the MPLibraryIsLoaded macro (or equivalent code in languages other than C) to tell |
|
|
if the MP API services are available. It is not sufficient to simply check that an |
|
|
imported symbol is resolved as is commonly done for other libraries. The macro expands |
|
|
to the expression: |
|
|
|
|
|
( ( (UInt32)_MPIsFullyInitialized != (UInt32)kUnresolvedCFragSymbolAddress ) && |
|
|
( _MPIsFullyInitialized () ) ) |
|
|
|
|
|
This checks if the imported symbol _MPIsFullyInitialized is resolved and if resolved |
|
|
calls it. Both parts must succeed for the MP API services to be available. |
|
|
|
|
|
o If you explicitly prepare the MP API library you MUST: |
|
|
|
|
|
Use code similar to the following example to tell if the MP API services are available. |
|
|
It is not sufficient to depend on just a noErr result from GetSharedLibrary. |
|
|
|
|
|
OSErr err; |
|
|
Boolean mpIsAvailable = false; |
|
|
CFragConnectionID connID = kInvalidID; |
|
|
MPIsFullyInitializedProc mpIsFullyInitialized = NULL; |
|
|
|
|
|
err = GetSharedLibrary ( "\pMPLibrary", kCompiledCFragArch, kReferenceCFrag, |
|
|
&connID, NULL, NULL ); |
|
|
|
|
|
if ( err == noErr ) { |
|
|
err = FindSymbol ( connID, "\p_MPIsFullyInitialized", |
|
|
(Ptr *) &mpIsFullyInitialized, NULL ); |
|
|
} |
|
|
|
|
|
if ( err == noErr ) { |
|
|
mpIsAvailable = (* mpIsFullyInitialized) (); |
|
|
} |
|
|
|
|
|
=========================================================================================== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
* _MPIsFullyInitialized() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( Boolean ) |
|
|
_MPIsFullyInitialized(void); |
|
|
|
|
|
|
|
|
typedef CALLBACK_API_C( Boolean , MPIsFullyInitializedProc )(void); |
|
|
#define kMPUnresolvedCFragSymbolAddress 0 |
|
|
#define MPLibraryIsLoaded() \ |
|
|
( ( (UInt32)_MPIsFullyInitialized != (UInt32)kMPUnresolvedCFragSymbolAddress ) && \ |
|
|
( _MPIsFullyInitialized () ) ) |
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Miscellaneous Services |
|
|
====================== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
* _MPLibraryVersion() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
_MPLibraryVersion( |
|
|
const char ** versionCString, |
|
|
UInt32 * major, |
|
|
UInt32 * minor, |
|
|
UInt32 * release, |
|
|
UInt32 * revision); |
|
|
|
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Unofficial Services |
|
|
=================== |
|
|
*/ |
|
|
|
|
|
|
|
|
/* |
|
|
=========================================================================================== |
|
|
*** WARNING *** |
|
|
These services are not part of the officially documented multiprocessing API. They may not |
|
|
be avaliable in future versions of Mac OS multiprocessing support, or in environments that |
|
|
have a different underlying OS architecture such as Mac OS on top of a microkernel, the |
|
|
Mac OS Blue Box under Mac OS X, native MP support in Mac OS X, etc. |
|
|
=========================================================================================== |
|
|
*/ |
|
|
|
|
|
#if CALL_NOT_IN_CARBON |
|
|
#if CALL_NOT_IN_CARBON |
|
|
/* |
|
|
* _MPAllocateSys() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( LogicalAddress ) |
|
|
_MPAllocateSys(ByteCount size); |
|
|
|
|
|
|
|
|
/* Use MPAllocateAligned instead.*/ |
|
|
/* |
|
|
* _MPRPC() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( void * ) |
|
|
_MPRPC( |
|
|
MPRemoteProcedure remoteProc, |
|
|
void * parameter); |
|
|
|
|
|
|
|
|
/* Use _MPRemoteCall instead.*/ |
|
|
/* |
|
|
* _MPTaskIsToolboxSafe() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( Boolean ) |
|
|
_MPTaskIsToolboxSafe(MPTaskID task); |
|
|
|
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */ |
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */ |
|
|
|
|
|
/* |
|
|
* _MPLibraryIsCompatible() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibrary 1.0 and later |
|
|
* CarbonLib: in CarbonLib 1.0 and later |
|
|
* Mac OS X: in version 10.0 and later |
|
|
*/ |
|
|
EXTERN_API_C( Boolean ) |
|
|
_MPLibraryIsCompatible( |
|
|
const char * versionCString, |
|
|
UInt32 major, |
|
|
UInt32 minor, |
|
|
UInt32 release, |
|
|
UInt32 revision); |
|
|
|
|
|
|
|
|
|
|
|
#define MPRPC _MPRPC |
|
|
#define MPTaskIsToolboxSafe _MPTaskIsToolboxSafe |
|
|
|
|
|
/* |
|
|
. |
|
|
=========================================================================================== |
|
|
Defunct Services |
|
|
================ |
|
|
*/ |
|
|
|
|
|
#if CALL_NOT_IN_CARBON |
|
|
#ifndef MPIncludeDefunctServices |
|
|
#define MPIncludeDefunctServices 0 |
|
|
#endif /* !defined(MPIncludeDefunctServices) */ |
|
|
|
|
|
#if MPIncludeDefunctServices |
|
|
#if CALL_NOT_IN_CARBON |
|
|
/* |
|
|
* _MPDebugStr() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibraryObsolete 1.0 and later |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
_MPDebugStr(ConstStr255Param msg); |
|
|
|
|
|
|
|
|
/* |
|
|
* _MPStatusPString() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibraryObsolete 1.0 and later |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( StringPtr ) |
|
|
_MPStatusPString(OSStatus status); |
|
|
|
|
|
|
|
|
/* |
|
|
* _MPStatusCString() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibraryObsolete 1.0 and later |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( const char * ) |
|
|
_MPStatusCString(OSStatus status); |
|
|
|
|
|
|
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */ |
|
|
|
|
|
#include <stdarg.h> |
|
|
typedef CALLBACK_API_C( void , MPPrintfHandler )(MPTaskID taskID, const char *format, va_list args); |
|
|
#if CALL_NOT_IN_CARBON |
|
|
/* |
|
|
* _MPInitializePrintf() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibraryObsolete 1.0 and later |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
_MPInitializePrintf(MPPrintfHandler pfn); |
|
|
|
|
|
|
|
|
/* |
|
|
* _MPPrintf() |
|
|
* |
|
|
* Availability: |
|
|
* Non-Carbon CFM: in MPLibraryObsolete 1.0 and later |
|
|
* CarbonLib: not available |
|
|
* Mac OS X: not available |
|
|
*/ |
|
|
EXTERN_API_C( void ) |
|
|
_MPPrintf(const char * format, ...); |
|
|
|
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */ |
|
|
|
|
|
#endif /* MPIncludeDefunctServices */ |
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */ |
|
|
|
|
|
/* ===========================================================================================*/ |
|
|
|
|
|
|
|
|
|
|
|
#if PRAGMA_STRUCT_ALIGN |
|
|
#pragma options align=reset |
|
|
#elif PRAGMA_STRUCT_PACKPUSH |
|
|
#pragma pack(pop) |
|
|
#elif PRAGMA_STRUCT_PACK |
|
|
#pragma pack() |
|
|
#endif |
|
|
|
|
|
#ifdef PRAGMA_IMPORT_OFF |
|
|
#pragma import off |
|
|
#elif PRAGMA_IMPORT |
|
|
#pragma import reset |
|
|
#endif |
|
|
|
|
|
#ifdef __cplusplus |
|
|
} |
|
|
#endif |
|
|
|
|
|
#endif /* __MULTIPROCESSING__ */ |
|
|
|
|
|
|