mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 14:16:50 +00:00
1803 lines
46 KiB
C
1803 lines
46 KiB
C
/*
|
||
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 <20> 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__ */
|
||
|