Files
pspsdk/src/user/pspthreadman.h
2024-04-21 00:21:14 +02:00

1848 lines
47 KiB
C

/*
* PSP Software Development Kit - https://github.com/pspdev
* -----------------------------------------------------------------------
* Licensed under the BSD license, see LICENSE in PSPSDK root for details.
*
* pspthreadman.h - Library imports for the kernel threading library.
*
* Copyright (c) 2005 Marcus R. Brown <mrbrown@ocgnet.org>
* Copyright (c) 2005 James Forshaw <tyranid@gmail.com>
* Copyright (c) 2005 John Kelley <ps2dev@kelley.ca>
* Copyright (c) 2005 Florin Sasu
*
*/
#ifndef __THREADMAN_H__
#define __THREADMAN_H__
#include <psptypes.h>
#include <pspkerneltypes.h>
/* Include for profile register definitions */
#include <pspdebug.h>
/* Note: Some of the structures, types, and definitions in this file were
extrapolated from symbolic debugging information found in the Japanese
version of Puzzle Bobble. */
/** @defgroup ThreadMan Thread Manager Library
* Library imports for the kernel threading library.
*/
#ifdef __cplusplus
extern "C" {
#endif
/** @addtogroup ThreadMan */
/**@{*/
/** 64-bit system clock type. */
typedef struct SceKernelSysClock {
SceUInt32 low;
SceUInt32 hi;
} SceKernelSysClock;
/** Attribute for threads. */
enum PspThreadAttributes
{
/** Enable VFPU access for the thread. */
PSP_THREAD_ATTR_VFPU = 0x00004000,
/** Start the thread in user mode (done automatically
if the thread creating it is in user mode). */
PSP_THREAD_ATTR_USER = 0x80000000,
/** Thread is part of the USB/WLAN API. */
PSP_THREAD_ATTR_USBWLAN = 0xa0000000,
/** Thread is part of the VSH API. */
PSP_THREAD_ATTR_VSH = 0xc0000000,
/** Allow using scratchpad memory for a thread, NOT USABLE ON V1.0 */
PSP_THREAD_ATTR_SCRATCH_SRAM = 0x00008000,
/** Disables filling the stack with 0xFF on creation */
PSP_THREAD_ATTR_NO_FILLSTACK = 0x00100000,
/** Clear the stack when the thread is deleted */
PSP_THREAD_ATTR_CLEAR_STACK = 0x00200000,
};
/* Maintained for compatibility with older versions of PSPSDK. */
#define THREAD_ATTR_VFPU PSP_THREAD_ATTR_VFPU
#define THREAD_ATTR_USER PSP_THREAD_ATTR_USER
/* Threads. */
typedef int (*SceKernelThreadEntry)(SceSize args, void *argp);
/** Additional options used when creating threads. */
typedef struct SceKernelThreadOptParam {
/** Size of the ::SceKernelThreadOptParam structure. */
SceSize size;
/** UID of the memory block (?) allocated for the thread's stack. */
SceUID stackMpid;
} SceKernelThreadOptParam;
/** Structure to hold the status information for a thread
* @see sceKernelReferThreadStatus
*/
typedef struct SceKernelThreadInfo {
/** Size of the structure */
SceSize size;
/** Nul terminated name of the thread */
char name[32];
/** Thread attributes */
SceUInt attr;
/** Thread status */
int status;
/** Thread entry point */
SceKernelThreadEntry entry;
/** Thread stack pointer */
void * stack;
/** Thread stack size */
int stackSize;
/** Pointer to the gp */
void * gpReg;
/** Initial priority */
int initPriority;
/** Current priority */
int currentPriority;
/** Wait type */
int waitType;
/** Wait id */
SceUID waitId;
/** Wakeup count */
int wakeupCount;
/** Exit status of the thread */
int exitStatus;
/** Number of clock cycles run */
SceKernelSysClock runClocks;
/** Interrupt preemption count */
SceUInt intrPreemptCount;
/** Thread preemption count */
SceUInt threadPreemptCount;
/** Release count */
SceUInt releaseCount;
} SceKernelThreadInfo;
/** Statistics about a running thread.
* @see sceKernelReferThreadRunStatus.
*/
typedef struct SceKernelThreadRunStatus {
SceSize size;
int status;
int currentPriority;
int waitType;
int waitId;
int wakeupCount;
SceKernelSysClock runClocks;
SceUInt intrPreemptCount;
SceUInt threadPreemptCount;
SceUInt releaseCount;
} SceKernelThreadRunStatus;
/* Sure there must be more than this, but haven't seen them */
enum PspThreadStatus
{
PSP_THREAD_RUNNING = 1,
PSP_THREAD_READY = 2,
PSP_THREAD_WAITING = 4,
PSP_THREAD_SUSPEND = 8,
PSP_THREAD_STOPPED = 16,
PSP_THREAD_KILLED = 32, /* Thread manager has killed the thread (stack overflow) */
};
/**
* Create a thread
*
* @par Example:
* @code
* SceUID thid;
* thid = sceKernelCreateThread("my_thread", threadFunc, 0x18, 0x10000, 0, NULL);
* @endcode
*
* @param name - An arbitrary thread name.
* @param entry - The thread function to run when started.
* @param initPriority - The initial priority of the thread. Less if higher priority.
* @param stackSize - The size of the initial stack.
* @param attr - The thread attributes, zero or more of ::PspThreadAttributes.
* @param option - Additional options specified by ::SceKernelThreadOptParam.
* @return UID of the created thread, or an error code.
*/
SceUID sceKernelCreateThread(const char *name, SceKernelThreadEntry entry, int initPriority,
int stackSize, SceUInt attr, SceKernelThreadOptParam *option);
/**
* Delate a thread
*
* @param thid - UID of the thread to be deleted.
*
* @return < 0 on error.
*/
int sceKernelDeleteThread(SceUID thid);
/**
* Start a created thread
*
* @param thid - Thread id from sceKernelCreateThread
* @param arglen - Length of the data pointed to by argp, in bytes
* @param argp - Pointer to the arguments.
*/
int sceKernelStartThread(SceUID thid, SceSize arglen, void *argp);
/**
* Exit a thread
*
* @param status - Exit status.
*/
int sceKernelExitThread(int status);
/**
* Exit a thread and delete itself.
*
* @param status - Exit status
*/
int sceKernelExitDeleteThread(int status);
/**
* Terminate a thread.
*
* @param thid - UID of the thread to terminate.
*
* @return Success if >= 0, an error if < 0.
*/
int sceKernelTerminateThread(SceUID thid);
/**
* Terminate and delete a thread.
*
* @param thid - UID of the thread to terminate and delete.
*
* @return Success if >= 0, an error if < 0.
*/
int sceKernelTerminateDeleteThread(SceUID thid);
/**
* Suspend the dispatch thread
*
* @return The current state of the dispatch thread, < 0 on error
*/
int sceKernelSuspendDispatchThread(void);
/**
* Resume the dispatch thread
*
* @param state - The state of the dispatch thread
* (from ::sceKernelSuspendDispatchThread)
*
* @return 0 on success, < 0 on error
*/
int sceKernelResumeDispatchThread(int state);
/**
* Sleep thread
*
* @return < 0 on error.
*/
int sceKernelSleepThread(void);
/**
* Sleep thread but service any callbacks as necessary
*
* @par Example:
* @code
* // Once all callbacks have been setup call this function
* sceKernelSleepThreadCB();
* @endcode
*/
int sceKernelSleepThreadCB(void);
/**
* Wake a thread previously put into the sleep state.
*
* @param thid - UID of the thread to wake.
*
* @return Success if >= 0, an error if < 0.
*/
int sceKernelWakeupThread(SceUID thid);
/**
* Cancel a thread that was to be woken with ::sceKernelWakeupThread.
*
* @param thid - UID of the thread to cancel.
*
* @return Success if >= 0, an error if < 0.
*/
int sceKernelCancelWakeupThread(SceUID thid);
/**
* Suspend a thread.
*
* @param thid - UID of the thread to suspend.
*
* @return Success if >= 0, an error if < 0.
*/
int sceKernelSuspendThread(SceUID thid);
/**
* Resume a thread previously put into a suspended state with ::sceKernelSuspendThread.
*
* @param thid - UID of the thread to resume.
*
* @return Success if >= 0, an error if < 0.
*/
int sceKernelResumeThread(SceUID thid);
/**
* Wait until a thread has ended.
*
* @param thid - Id of the thread to wait for.
* @param timeout - Timeout in microseconds (assumed).
*
* @return < 0 on error.
*/
int sceKernelWaitThreadEnd(SceUID thid, SceUInt *timeout);
/**
* Wait until a thread has ended and handle callbacks if necessary.
*
* @param thid - Id of the thread to wait for.
* @param timeout - Timeout in microseconds (assumed).
*
* @return < 0 on error.
*/
int sceKernelWaitThreadEndCB(SceUID thid, SceUInt *timeout);
/**
* Delay the current thread by a specified number of microseconds
*
* @param delay - Delay in microseconds.
*
* @par Example:
* @code
* sceKernelDelayThread(1000000); // Delay for a second
* @endcode
*/
int sceKernelDelayThread(SceUInt delay);
/**
* Delay the current thread by a specified number of microseconds and handle any callbacks.
*
* @param delay - Delay in microseconds.
*
* @par Example:
* @code
* sceKernelDelayThread(1000000); // Delay for a second
* @endcode
*/
int sceKernelDelayThreadCB(SceUInt delay);
/**
* Delay the current thread by a specified number of sysclocks
*
* @param delay - Delay in sysclocks
*
* @return 0 on success, < 0 on error
*/
int sceKernelDelaySysClockThread(SceKernelSysClock *delay);
/**
* Delay the current thread by a specified number of sysclocks handling callbacks
*
* @param delay - Delay in sysclocks
*
* @return 0 on success, < 0 on error
*
*/
int sceKernelDelaySysClockThreadCB(SceKernelSysClock *delay);
/**
* Modify the attributes of the current thread.
*
* @param unknown - Set to 0.
* @param attr - The thread attributes to modify. One of ::PspThreadAttributes.
*
* @return < 0 on error.
*/
int sceKernelChangeCurrentThreadAttr(int unknown, SceUInt attr);
/**
* Change the threads current priority.
*
* @param thid - The ID of the thread (from sceKernelCreateThread or sceKernelGetThreadId)
* @param priority - The new priority (the lower the number the higher the priority)
*
* @par Example:
* @code
* int thid = sceKernelGetThreadId();
* // Change priority of current thread to 16
* sceKernelChangeThreadPriority(thid, 16);
* @endcode
*
* @return 0 if successful, otherwise the error code.
*/
int sceKernelChangeThreadPriority(SceUID thid, int priority);
/**
* Rotate thread ready queue at a set priority
*
* @param priority - The priority of the queue
*
* @return 0 on success, < 0 on error.
*/
int sceKernelRotateThreadReadyQueue(int priority);
/**
* Release a thread in the wait state.
*
* @param thid - The UID of the thread.
*
* @return 0 on success, < 0 on error
*/
int sceKernelReleaseWaitThread(SceUID thid);
/**
* Get the current thread Id
*
* @return The thread id of the calling thread.
*/
int sceKernelGetThreadId(void);
/**
* Get the current priority of the thread you are in.
*
* @return The current thread priority
*/
int sceKernelGetThreadCurrentPriority(void);
/**
* Get the exit status of a thread.
*
* @param thid - The UID of the thread to check.
*
* @return The exit status
*/
int sceKernelGetThreadExitStatus(SceUID thid);
/**
* Check the thread stack?
*
* @return Unknown.
*/
int sceKernelCheckThreadStack(void);
/**
* Get the free stack size for a thread.
*
* @param thid - The thread ID. Seem to take current thread
* if set to 0.
*
* @return The free size.
*/
int sceKernelGetThreadStackFreeSize(SceUID thid);
/**
* Get the status information for the specified thread.
*
* @param thid - Id of the thread to get status
* @param info - Pointer to the info structure to receive the data.
* Note: The structures size field should be set to
* sizeof(SceKernelThreadInfo) before calling this function.
*
* @par Example:
* @code
* SceKernelThreadInfo status;
* status.size = sizeof(SceKernelThreadInfo);
* if(sceKernelReferThreadStatus(thid, &status) == 0)
* { Do something... }
* @endcode
* @return 0 if successful, otherwise the error code.
*/
int sceKernelReferThreadStatus(SceUID thid, SceKernelThreadInfo *info);
/**
* Retrive the runtime status of a thread.
*
* @param thid - UID of the thread to retrive status.
* @param status - Pointer to a ::SceKernelThreadRunStatus struct to receive the runtime status.
*
* @return 0 if successful, otherwise the error code.
*/
int sceKernelReferThreadRunStatus(SceUID thid, SceKernelThreadRunStatus *status);
/* Semaphores. */
/** Additional options used when creating semaphores. */
typedef struct SceKernelSemaOptParam {
/** Size of the ::SceKernelSemaOptParam structure. */
SceSize size;
} SceKernelSemaOptParam;
/** Current state of a semaphore.
* @see sceKernelReferSemaStatus.
*/
typedef struct SceKernelSemaInfo {
/** Size of the ::SceKernelSemaInfo structure. */
SceSize size;
/** NUL-terminated name of the semaphore. */
char name[32];
/** Attributes. */
SceUInt attr;
/** The initial count the semaphore was created with. */
int initCount;
/** The current count. */
int currentCount;
/** The maximum count. */
int maxCount;
/** The number of threads waiting on the semaphore. */
int numWaitThreads;
} SceKernelSemaInfo;
/**
* Creates a new semaphore
*
* @par Example:
* @code
* int semaid;
* semaid = sceKernelCreateSema("MyMutex", 0, 1, 1, 0);
* @endcode
*
* @param name - Specifies the name of the sema
* @param attr - Sema attribute flags (normally set to 0)
* @param initVal - Sema initial value
* @param maxVal - Sema maximum value
* @param option - Sema options (normally set to 0)
* @return A semaphore id
*/
SceUID sceKernelCreateSema(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option);
/**
* Destroy a semaphore
*
* @param semaid - The semaid returned from a previous create call.
* @return Returns the value 0 if its succesful otherwise -1
*/
int sceKernelDeleteSema(SceUID semaid);
/**
* Send a signal to a semaphore
*
* @par Example:
* @code
* // Signal the sema
* sceKernelSignalSema(semaid, 1);
* @endcode
*
* @param semaid - The sema id returned from sceKernelCreateSema
* @param signal - The amount to signal the sema (i.e. if 2 then increment the sema by 2)
*
* @return < 0 On error.
*/
int sceKernelSignalSema(SceUID semaid, int signal);
/**
* Lock a semaphore
*
* @par Example:
* @code
* sceKernelWaitSema(semaid, 1, 0);
* @endcode
*
* @param semaid - The sema id returned from sceKernelCreateSema
* @param signal - The value to wait for (i.e. if 1 then wait till reaches a signal state of 1)
* @param timeout - Timeout in microseconds (assumed).
*
* @return < 0 on error.
*/
int sceKernelWaitSema(SceUID semaid, int signal, SceUInt *timeout);
/**
* Lock a semaphore a handle callbacks if necessary.
*
* @par Example:
* @code
* sceKernelWaitSemaCB(semaid, 1, 0);
* @endcode
*
* @param semaid - The sema id returned from sceKernelCreateSema
* @param signal - The value to wait for (i.e. if 1 then wait till reaches a signal state of 1)
* @param timeout - Timeout in microseconds (assumed).
*
* @return < 0 on error.
*/
int sceKernelWaitSemaCB(SceUID semaid, int signal, SceUInt *timeout);
/**
* Poll a sempahore.
*
* @param semaid - UID of the semaphore to poll.
* @param signal - The value to test for.
*
* @return < 0 on error.
*/
int sceKernelPollSema(SceUID semaid, int signal);
/**
* Retrieve information about a semaphore.
*
* @param semaid - UID of the semaphore to retrieve info for.
* @param info - Pointer to a ::SceKernelSemaInfo struct to receive the info.
*
* @return < 0 on error.
*/
int sceKernelReferSemaStatus(SceUID semaid, SceKernelSemaInfo *info);
/** Attribute for lightweight mutex. */
enum PspLwMutexAttributes
{
/** The wait thread is queued using FIFO. */
PSP_LW_MUTEX_ATTR_THFIFO = 0x0000U,
/** The wait thread is queued by thread priority . */
PSP_LW_MUTEX_ATTR_THPRI = 0x0100U,
/** A recursive lock is allowed by the thread that acquired the lightweight mutex */
PSP_LW_MUTEX_ATTR_RECURSIVE = 0x0200U
};
/** Struct as workarea for lightweight mutex */
typedef struct {
/** Count */
int lockLevel;
/** Locking thread */
SceUID lockThread;
/** Attribute */
int attr;
/** Number of waiting threads */
int numWaitThreads;
/** UID */
SceUID uid;
/** Padding */
int pad[3];
} SceLwMutexWorkarea;
/**
* Create a lightweight mutex
*
* @param workarea - The pointer to the workarea
* @param name - The name of the lightweight mutex
* @param attr - The LwMutex attributes, zero or more of ::PspLwMutexAttributes.
* @param initialCount - THe inital value of the mutex
* @param optionsPTr - Other optioons for mutex
*
* @return 0 on success, otherwise one of ::PspKernelErrorCodes
*/
int sceKernelCreateLwMutex(SceLwMutexWorkarea *workarea, const char *name, SceUInt32 attr, int initialCount, u32 *optionsPtr);
/**
* Delete a lightweight mutex
*
* @param workarea - The pointer to the workarea
*
* @return 0 on success, otherwise one of ::PspKernelErrorCodes
*/
int sceKernelDeleteLwMutex(SceLwMutexWorkarea *workarea);
/**
* Try to lock a lightweight mutex
*
* @param workarea - The pointer to the workarea
* @param lockCount - value of increase the lock counter
*
* @return 0 on success, otherwise one of ::PspKernelErrorCodes
*/
int sceKernelTryLockLwMutex(SceLwMutexWorkarea *workarea, int lockCount);
/**
* Lock a lightweight mutex
*
* @param workarea - The pointer to the workarea
* @param lockCount - value of increase the lock counter
* @param pTimeout - The pointer for timeout waiting
*
* @return 0 on success, otherwise one of ::PspKernelErrorCodes
*/
int sceKernelLockLwMutex(SceLwMutexWorkarea *workarea, int lockCount, unsigned int *pTimeout);
/**
* Lock a lightweight mutex
*
* @param workarea - The pointer to the workarea
* @param name - The name of the lightweight mutex
* @param lockCount - value of decrease the lock counter
*
* @return 0 on success, otherwise one of ::PspKernelErrorCodes
*/
int sceKernelUnlockLwMutex(SceLwMutexWorkarea *workarea, int lockCount);
/* Event flags. */
/** Structure to hold the event flag information */
typedef struct SceKernelEventFlagInfo {
SceSize size;
char name[32];
SceUInt attr;
SceUInt initPattern;
SceUInt currentPattern;
int numWaitThreads;
} SceKernelEventFlagInfo;
struct SceKernelEventFlagOptParam {
SceSize size;
};
typedef struct SceKernelEventFlagOptParam SceKernelEventFlagOptParam;
/** Event flag creation attributes */
enum PspEventFlagAttributes
{
/** Allow the event flag to be waited upon by multiple threads */
PSP_EVENT_WAITMULTIPLE = 0x200
};
/** Event flag wait types */
enum PspEventFlagWaitTypes
{
/** Wait for all bits in the pattern to be set */
PSP_EVENT_WAITAND = 0,
/** Wait for one or more bits in the pattern to be set */
PSP_EVENT_WAITOR = 1,
/** Clear the wait pattern when it matches */
PSP_EVENT_WAITCLEAR = 0x20
};
/**
* Create an event flag.
*
* @param name - The name of the event flag.
* @param attr - Attributes from ::PspEventFlagAttributes
* @param bits - Initial bit pattern.
* @param opt - Options, set to NULL
* @return < 0 on error. >= 0 event flag id.
*
* @par Example:
* @code
* int evid;
* evid = sceKernelCreateEventFlag("wait_event", 0, 0, 0);
* @endcode
*/
SceUID sceKernelCreateEventFlag(const char *name, int attr, int bits, SceKernelEventFlagOptParam *opt);
/**
* Set an event flag bit pattern.
*
* @param evid - The event id returned by sceKernelCreateEventFlag.
* @param bits - The bit pattern to set.
*
* @return < 0 On error
*/
int sceKernelSetEventFlag(SceUID evid, u32 bits);
/**
* Clear a event flag bit pattern
*
* @param evid - The event id returned by ::sceKernelCreateEventFlag
* @param bits - The bits to clean
*
* @return < 0 on Error
*/
int sceKernelClearEventFlag(SceUID evid, u32 bits);
/**
* Poll an event flag for a given bit pattern.
*
* @param evid - The event id returned by sceKernelCreateEventFlag.
* @param bits - The bit pattern to poll for.
* @param wait - Wait type, one or more of ::PspEventFlagWaitTypes or'ed together
* @param outBits - The bit pattern that was matched.
* @return < 0 On error
*/
int sceKernelPollEventFlag(int evid, u32 bits, u32 wait, u32 *outBits);
/**
* Wait for an event flag for a given bit pattern.
*
* @param evid - The event id returned by sceKernelCreateEventFlag.
* @param bits - The bit pattern to poll for.
* @param wait - Wait type, one or more of ::PspEventFlagWaitTypes or'ed together
* @param outBits - The bit pattern that was matched.
* @param timeout - Timeout in microseconds
* @return < 0 On error
*/
int sceKernelWaitEventFlag(int evid, u32 bits, u32 wait, u32 *outBits, SceUInt *timeout);
/**
* Wait for an event flag for a given bit pattern with callback.
*
* @param evid - The event id returned by sceKernelCreateEventFlag.
* @param bits - The bit pattern to poll for.
* @param wait - Wait type, one or more of ::PspEventFlagWaitTypes or'ed together
* @param outBits - The bit pattern that was matched.
* @param timeout - Timeout in microseconds
* @return < 0 On error
*/
int sceKernelWaitEventFlagCB(int evid, u32 bits, u32 wait, u32 *outBits, SceUInt *timeout);
/**
* Delete an event flag
*
* @param evid - The event id returned by sceKernelCreateEventFlag.
*
* @return < 0 On error
*/
int sceKernelDeleteEventFlag(int evid);
/**
* Get the status of an event flag.
*
* @param event - The UID of the event.
* @param status - A pointer to a ::SceKernelEventFlagInfo structure.
*
* @return < 0 on error.
*/
int sceKernelReferEventFlagStatus(SceUID event, SceKernelEventFlagInfo *status);
/* Message boxes. */
/** Additional options used when creating messageboxes. */
typedef struct SceKernelMbxOptParam {
/** Size of the ::SceKernelMbxOptParam structure. */
SceSize size;
} SceKernelMbxOptParam;
/** Current state of a messagebox.
* @see sceKernelReferMbxStatus.
*/
typedef struct SceKernelMbxInfo {
/** Size of the ::SceKernelMbxInfo structure. */
SceSize size;
/** NUL-terminated name of the messagebox. */
char name[32];
/** Attributes. */
SceUInt attr;
/** The number of threads waiting on the messagebox. */
int numWaitThreads;
/** Number of messages currently in the messagebox. */
int numMessages;
/** The message currently at the head of the queue. */
void *firstMessage;
} SceKernelMbxInfo;
/**
* Header for a message box packet
*/
typedef struct SceKernelMsgPacket {
/** Pointer to next msg (used by the kernel) */
struct SceKernelMsgPacket *next;
/** Priority ? */
SceUChar msgPriority;
SceUChar dummy[3];
/** After this can be any user defined data */
} SceKernelMsgPacket;
/**
* Creates a new messagebox
*
* @par Example:
* @code
* int mbxid;
* mbxid = sceKernelCreateMbx("MyMessagebox", 0, NULL);
* @endcode
*
* @param name - Specifies the name of the mbx
* @param attr - Mbx attribute flags (normally set to 0)
* @param option - Mbx options (normally set to NULL)
* @return A messagebox id
*/
SceUID sceKernelCreateMbx(const char *name, SceUInt attr, SceKernelMbxOptParam *option);
/**
* Destroy a messagebox
*
* @param mbxid - The mbxid returned from a previous create call.
* @return Returns the value 0 if its succesful otherwise an error code
*/
int sceKernelDeleteMbx(SceUID mbxid);
/**
* Send a message to a messagebox
*
* @par Example:
* @code
* struct MyMessage {
* SceKernelMsgPacket header;
* char text[8];
* };
*
* struct MyMessage msg = { {0}, "Hello" };
* // Send the message
* sceKernelSendMbx(mbxid, (void*) &msg);
* @endcode
*
* @param mbxid - The mbx id returned from sceKernelCreateMbx
* @param message - A message to be forwarded to the receiver.
* The start of the message should be the
* ::SceKernelMsgPacket structure, the rest
*
* @return < 0 On error.
*/
int sceKernelSendMbx(SceUID mbxid, void *message);
/**
* Wait for a message to arrive in a messagebox
*
* @par Example:
* @code
* void *msg;
* sceKernelReceiveMbx(mbxid, &msg, NULL);
* @endcode
*
* @param mbxid - The mbx id returned from sceKernelCreateMbx
* @param pmessage - A pointer to where a pointer to the
* received message should be stored
* @param timeout - Timeout in microseconds
*
* @return < 0 on error.
*/
int sceKernelReceiveMbx(SceUID mbxid, void **pmessage, SceUInt *timeout);
/**
* Wait for a message to arrive in a messagebox and handle callbacks if necessary.
*
* @par Example:
* @code
* void *msg;
* sceKernelReceiveMbxCB(mbxid, &msg, NULL);
* @endcode
*
* @param mbxid - The mbx id returned from sceKernelCreateMbx
* @param pmessage - A pointer to where a pointer to the
* received message should be stored
* @param timeout - Timeout in microseconds
*
* @return < 0 on error.
*/
int sceKernelReceiveMbxCB(SceUID mbxid, void **pmessage, SceUInt *timeout);
/**
* Check if a message has arrived in a messagebox
*
* @par Example:
* @code
* void *msg;
* sceKernelPollMbx(mbxid, &msg);
* @endcode
*
* @param mbxid - The mbx id returned from sceKernelCreateMbx
* @param pmessage - A pointer to where a pointer to the
* received message should be stored
*
* @return < 0 on error (SCE_KERNEL_ERROR_MBOX_NOMSG if the mbx is empty).
*/
int sceKernelPollMbx(SceUID mbxid, void **pmessage);
/**
* Abort all wait operations on a messagebox
*
* @par Example:
* @code
* sceKernelCancelReceiveMbx(mbxid, NULL);
* @endcode
*
* @param mbxid - The mbx id returned from sceKernelCreateMbx
* @param pnum - A pointer to where the number of threads which
* were waiting on the mbx should be stored (NULL
* if you don't care)
*
* @return < 0 on error
*/
int sceKernelCancelReceiveMbx(SceUID mbxid, int *pnum);
/**
* Retrieve information about a messagebox.
*
* @param mbxid - UID of the messagebox to retrieve info for.
* @param info - Pointer to a ::SceKernelMbxInfo struct to receive the info.
*
* @return < 0 on error.
*/
int sceKernelReferMbxStatus(SceUID mbxid, SceKernelMbxInfo *info);
/* Alarms. */
/** Prototype for alarm handlers. */
typedef SceUInt (*SceKernelAlarmHandler)(void *common);
/** Struct containing alarm info */
typedef struct SceKernelAlarmInfo {
/** Size of the structure (should be set before calling
* :: sceKernelReferAlarmStatus */
SceSize size;
/* The current schedule */
SceKernelSysClock schedule;
/** Pointer to the alarm handler */
SceKernelAlarmHandler handler;
/** Common pointer argument */
void * common;
} SceKernelAlarmInfo;
/**
* Set an alarm.
* @param clock - The number of micro seconds till the alarm occurrs.
* @param handler - Pointer to a ::SceKernelAlarmHandler
* @param common - Common pointer for the alarm handler
*
* @return A UID representing the created alarm, < 0 on error.
*/
SceUID sceKernelSetAlarm(SceUInt clock, SceKernelAlarmHandler handler, void *common);
/**
* Set an alarm using a ::SceKernelSysClock structure for the time
*
* @param clock - Pointer to a ::SceKernelSysClock structure
* @param handler - Pointer to a ::SceKernelAlarmHandler
* @param common - Common pointer for the alarm handler.
*
* @return A UID representing the created alarm, < 0 on error.
*/
SceUID sceKernelSetSysClockAlarm(SceKernelSysClock *clock, SceKernelAlarmHandler handler, void *common);
/**
* Cancel a pending alarm.
*
* @param alarmid - UID of the alarm to cancel.
*
* @return 0 on success, < 0 on error.
*/
int sceKernelCancelAlarm(SceUID alarmid);
/**
* Refer the status of a created alarm.
*
* @param alarmid - UID of the alarm to get the info of
* @param info - Pointer to a ::SceKernelAlarmInfo structure
*
* @return 0 on success, < 0 on error.
*/
int sceKernelReferAlarmStatus(SceUID alarmid, SceKernelAlarmInfo *info);
/* Callbacks. */
/** Callback function prototype */
typedef int (*SceKernelCallbackFunction)(int arg1, int arg2, void *arg);
/** Structure to hold the status information for a callback */
typedef struct SceKernelCallbackInfo {
/** Size of the structure (i.e. sizeof(SceKernelCallbackInfo)) */
SceSize size;
/** The name given to the callback */
char name[32];
/** The thread id associated with the callback */
SceUID threadId;
/** Pointer to the callback function */
SceKernelCallbackFunction callback;
/** User supplied argument for the callback */
void * common;
/** Unknown */
int notifyCount;
/** Unknown */
int notifyArg;
} SceKernelCallbackInfo;
/**
* Create callback
*
* @par Example:
* @code
* int cbid;
* cbid = sceKernelCreateCallback("Exit Callback", exit_cb, NULL);
* @endcode
*
* @param name - A textual name for the callback
* @param func - A pointer to a function that will be called as the callback
* @param arg - Argument for the callback ?
*
* @return >= 0 A callback id which can be used in subsequent functions, < 0 an error.
*/
int sceKernelCreateCallback(const char *name, SceKernelCallbackFunction func, void *arg);
/**
* Gets the status of a specified callback.
*
* @param cb - The UID of the callback to refer.
* @param status - Pointer to a status structure. The size parameter should be
* initialised before calling.
*
* @return < 0 on error.
*/
int sceKernelReferCallbackStatus(SceUID cb, SceKernelCallbackInfo *status);
/**
* Delete a callback
*
* @param cb - The UID of the specified callback
*
* @return 0 on success, < 0 on error
*/
int sceKernelDeleteCallback(SceUID cb);
/**
* Notify a callback
*
* @param cb - The UID of the specified callback
* @param arg2 - Passed as arg2 into the callback function
*
* @return 0 on success, < 0 on error
*/
int sceKernelNotifyCallback(SceUID cb, int arg2);
/**
* Cancel a callback ?
*
* @param cb - The UID of the specified callback
*
* @return 0 on succes, < 0 on error
*/
int sceKernelCancelCallback(SceUID cb);
/**
* Get the callback count
*
* @param cb - The UID of the specified callback
*
* @return The callback count, < 0 on error
*/
int sceKernelGetCallbackCount(SceUID cb);
/**
* Check callback ?
*
* @return Something or another
*/
int sceKernelCheckCallback(void);
/* Misc. */
/** Threadman types for ::sceKernelGetThreadmanIdList */
enum SceKernelIdListType
{
SCE_KERNEL_TMID_Thread = 1,
SCE_KERNEL_TMID_Semaphore = 2,
SCE_KERNEL_TMID_EventFlag = 3,
SCE_KERNEL_TMID_Mbox = 4,
SCE_KERNEL_TMID_Vpl = 5,
SCE_KERNEL_TMID_Fpl = 6,
SCE_KERNEL_TMID_Mpipe = 7,
SCE_KERNEL_TMID_Callback = 8,
SCE_KERNEL_TMID_ThreadEventHandler = 9,
SCE_KERNEL_TMID_Alarm = 10,
SCE_KERNEL_TMID_VTimer = 11,
SCE_KERNEL_TMID_SleepThread = 64,
SCE_KERNEL_TMID_DelayThread = 65,
SCE_KERNEL_TMID_SuspendThread = 66,
SCE_KERNEL_TMID_DormantThread = 67,
};
/**
* Get a list of UIDs from threadman. Allows you to enumerate
* resources such as threads or semaphores.
*
* @param type - The type of resource to list, one of ::SceKernelIdListType.
* @param readbuf - A pointer to a buffer to store the list.
* @param readbufsize - The size of the buffer in SceUID units.
* @param idcount - Pointer to an integer in which to return the number of ids in the list.
*
* @return < 0 on error. Either 0 or the same as idcount on success.
*/
int sceKernelGetThreadmanIdList(enum SceKernelIdListType type, SceUID *readbuf, int readbufsize, int *idcount);
/** Structure to contain the system status returned by ::sceKernelReferSystemStatus */
typedef struct SceKernelSystemStatus {
/** Size of the structure (should be set prior to the call) */
SceSize size;
/** The status ? */
SceUInt status;
/** The number of cpu clocks in the idle thread */
SceKernelSysClock idleClocks;
/** Number of times we resumed from idle */
SceUInt comesOutOfIdleCount;
/** Number of thread context switches */
SceUInt threadSwitchCount;
/** Number of vfpu switches ? */
SceUInt vfpuSwitchCount;
} SceKernelSystemStatus;
/**
* Get the current system status.
*
* @param status - Pointer to a ::SceKernelSystemStatus structure.
*
* @return < 0 on error.
*/
int sceKernelReferSystemStatus(SceKernelSystemStatus *status);
/**
* Create a message pipe
*
* @param name - Name of the pipe
* @param part - ID of the memory partition
* @param attr - Set to 0?
* @param unk1 - Unknown
* @param opt - Message pipe options (set to NULL)
*
* @return The UID of the created pipe, < 0 on error
*/
SceUID sceKernelCreateMsgPipe(const char *name, int part, int attr, void *unk1, void *opt);
/**
* Delete a message pipe
*
* @param uid - The UID of the pipe
*
* @return 0 on success, < 0 on error
*/
int sceKernelDeleteMsgPipe(SceUID uid);
/**
* Send a message to a pipe
*
* @param uid - The UID of the pipe
* @param message - Pointer to the message
* @param size - Size of the message
* @param unk1 - Unknown
* @param unk2 - Unknown
* @param timeout - Timeout for send
*
* @return 0 on success, < 0 on error
*/
int sceKernelSendMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
/**
* Send a message to a pipe (with callback)
*
* @param uid - The UID of the pipe
* @param message - Pointer to the message
* @param size - Size of the message
* @param unk1 - Unknown
* @param unk2 - Unknown
* @param timeout - Timeout for send
*
* @return 0 on success, < 0 on error
*/
int sceKernelSendMsgPipeCB(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
/**
* Try to send a message to a pipe
*
* @param uid - The UID of the pipe
* @param message - Pointer to the message
* @param size - Size of the message
* @param unk1 - Unknown
* @param unk2 - Unknown
*
* @return 0 on success, < 0 on error
*/
int sceKernelTrySendMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2);
/**
* Receive a message from a pipe
*
* @param uid - The UID of the pipe
* @param message - Pointer to the message
* @param size - Size of the message
* @param unk1 - Unknown
* @param unk2 - Unknown
* @param timeout - Timeout for receive
*
* @return 0 on success, < 0 on error
*/
int sceKernelReceiveMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
/**
* Receive a message from a pipe (with callback)
*
* @param uid - The UID of the pipe
* @param message - Pointer to the message
* @param size - Size of the message
* @param unk1 - Unknown
* @param unk2 - Unknown
* @param timeout - Timeout for receive
*
* @return 0 on success, < 0 on error
*/
int sceKernelReceiveMsgPipeCB(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
/**
* Receive a message from a pipe
*
* @param uid - The UID of the pipe
* @param message - Pointer to the message
* @param size - Size of the message
* @param unk1 - Unknown
* @param unk2 - Unknown
*
* @return 0 on success, < 0 on error
*/
int sceKernelTryReceiveMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2);
/**
* Cancel a message pipe
*
* @param uid - UID of the pipe to cancel
* @param psend - Receive number of sending threads?
* @param precv - Receive number of receiving threads?
*
* @return 0 on success, < 0 on error
*/
int sceKernelCancelMsgPipe(SceUID uid, int *psend, int *precv);
/** Message Pipe status info */
typedef struct SceKernelMppInfo {
SceSize size;
char name[32];
SceUInt attr;
int bufSize;
int freeSize;
int numSendWaitThreads;
int numReceiveWaitThreads;
} SceKernelMppInfo;
/**
* Get the status of a Message Pipe
*
* @param uid - The uid of the Message Pipe
* @param info - Pointer to a ::SceKernelMppInfo structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelReferMsgPipeStatus(SceUID uid, SceKernelMppInfo *info);
/* VPL Functions */
struct SceKernelVplOptParam {
SceSize size;
};
/**
* Create a variable pool
*
* @param name - Name of the pool
* @param part - The memory partition ID
* @param attr - Attributes
* @param size - Size of pool
* @param opt - Options (set to NULL)
*
* @return The UID of the created pool, < 0 on error.
*/
SceUID sceKernelCreateVpl(const char *name, int part, int attr, unsigned int size, struct SceKernelVplOptParam *opt);
/**
* Delete a variable pool
*
* @param uid - The UID of the pool
*
* @return 0 on success, < 0 on error
*/
int sceKernelDeleteVpl(SceUID uid);
/**
* Allocate from the pool
*
* @param uid - The UID of the pool
* @param size - The size to allocate
* @param data - Receives the address of the allocated data
* @param timeout - Amount of time to wait for allocation?
*
* @return 0 on success, < 0 on error
*/
int sceKernelAllocateVpl(SceUID uid, unsigned int size, void **data, unsigned int *timeout);
/**
* Allocate from the pool (with callback)
*
* @param uid - The UID of the pool
* @param size - The size to allocate
* @param data - Receives the address of the allocated data
* @param timeout - Amount of time to wait for allocation?
*
* @return 0 on success, < 0 on error
*/
int sceKernelAllocateVplCB(SceUID uid, unsigned int size, void **data, unsigned int *timeout);
/**
* Try to allocate from the pool
*
* @param uid - The UID of the pool
* @param size - The size to allocate
* @param data - Receives the address of the allocated data
*
* @return 0 on success, < 0 on error
*/
int sceKernelTryAllocateVpl(SceUID uid, unsigned int size, void **data);
/**
* Free a block
*
* @param uid - The UID of the pool
* @param data - The data block to deallocate
*
* @return 0 on success, < 0 on error
*/
int sceKernelFreeVpl(SceUID uid, void *data);
/**
* Cancel a pool
*
* @param uid - The UID of the pool
* @param pnum - Receives the number of waiting threads
*
* @return 0 on success, < 0 on error
*/
int sceKernelCancelVpl(SceUID uid, int *pnum);
/** Variable pool status info */
typedef struct SceKernelVplInfo {
SceSize size;
char name[32];
SceUInt attr;
int poolSize;
int freeSize;
int numWaitThreads;
} SceKernelVplInfo;
/**
* Get the status of an VPL
*
* @param uid - The uid of the VPL
* @param info - Pointer to a ::SceKernelVplInfo structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelReferVplStatus(SceUID uid, SceKernelVplInfo *info);
/* FPL Functions */
struct SceKernelFplOptParam {
SceSize size;
};
/**
* Create a fixed pool
*
* @param name - Name of the pool
* @param part - The memory partition ID
* @param attr - Attributes
* @param size - Size of pool block
* @param blocks - Number of blocks to allocate
* @param opt - Options (set to NULL)
*
* @return The UID of the created pool, < 0 on error.
*/
int sceKernelCreateFpl(const char *name, int part, int attr, unsigned int size, unsigned int blocks, struct SceKernelFplOptParam *opt);
/**
* Delete a fixed pool
*
* @param uid - The UID of the pool
*
* @return 0 on success, < 0 on error
*/
int sceKernelDeleteFpl(SceUID uid);
/**
* Allocate from the pool
*
* @param uid - The UID of the pool
* @param data - Receives the address of the allocated data
* @param timeout - Amount of time to wait for allocation?
*
* @return 0 on success, < 0 on error
*/
int sceKernelAllocateFpl(SceUID uid, void **data, unsigned int *timeout);
/**
* Allocate from the pool (with callback)
*
* @param uid - The UID of the pool
* @param data - Receives the address of the allocated data
* @param timeout - Amount of time to wait for allocation?
*
* @return 0 on success, < 0 on error
*/
int sceKernelAllocateFplCB(SceUID uid, void **data, unsigned int *timeout);
/**
* Try to allocate from the pool
*
* @param uid - The UID of the pool
* @param data - Receives the address of the allocated data
*
* @return 0 on success, < 0 on error
*/
int sceKernelTryAllocateFpl(SceUID uid, void **data);
/**
* Free a block
*
* @param uid - The UID of the pool
* @param data - The data block to deallocate
*
* @return 0 on success, < 0 on error
*/
int sceKernelFreeFpl(SceUID uid, void *data);
/**
* Cancel a pool
*
* @param uid - The UID of the pool
* @param pnum - Receives the number of waiting threads
*
* @return 0 on success, < 0 on error
*/
int sceKernelCancelFpl(SceUID uid, int *pnum);
/** Fixed pool status information */
typedef struct SceKernelFplInfo {
SceSize size;
char name[32];
SceUInt attr;
int blockSize;
int numBlocks;
int freeBlocks;
int numWaitThreads;
} SceKernelFplInfo;
/**
* Get the status of an FPL
*
* @param uid - The uid of the FPL
* @param info - Pointer to a ::SceKernelFplInfo structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelReferFplStatus(SceUID uid, SceKernelFplInfo *info);
/**
* Return from a timer handler (doesn't seem to do alot)
*/
void _sceKernelReturnFromTimerHandler(void);
/**
* Return from a callback (used as a syscall for the return
* of the callback function)
*/
void _sceKernelReturnFromCallback(void);
/**
* Convert a number of microseconds to a ::SceKernelSysClock structure
*
* @param usec - Number of microseconds
* @param clock - Pointer to a ::SceKernelSysClock structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelUSec2SysClock(unsigned int usec, SceKernelSysClock *clock);
/**
* Convert a number of microseconds to a wide time
*
* @param usec - Number of microseconds.
*
* @return The time
*/
SceInt64 sceKernelUSec2SysClockWide(unsigned int usec);
/**
* Convert a ::SceKernelSysClock structure to microseconds
*
* @param clock - Pointer to a ::SceKernelSysClock structure
* @param low - Pointer to the low part of the time
* @param high - Pointer to the high part of the time
*
* @return 0 on success, < 0 on error
*/
int sceKernelSysClock2USec(SceKernelSysClock *clock, unsigned int *low, unsigned int *high);
/**
* Convert a wide time to microseconds
*
* @param clock - Wide time
* @param low - Pointer to the low part of the time
* @param high - Pointer to the high part of the time
*
* @return 0 on success, < 0 on error
*/
int sceKernelSysClock2USecWide(SceInt64 clock, unsigned *low, unsigned int *high);
/**
* Get the system time
*
* @param time - Pointer to a ::SceKernelSysClock structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelGetSystemTime(SceKernelSysClock *time);
/**
* Get the system time (wide version)
*
* @return The system time
*/
SceInt64 sceKernelGetSystemTimeWide(void);
/**
* Get the low 32bits of the current system time
*
* @return The low 32bits of the system time
*/
unsigned int sceKernelGetSystemTimeLow(void);
struct SceKernelVTimerOptParam {
SceSize size;
};
/**
* Create a virtual timer
*
* @param name - Name for the timer.
* @param opt - Pointer to an ::SceKernelVTimerOptParam (pass NULL)
*
* @return The VTimer's UID or < 0 on error.
*/
SceUID sceKernelCreateVTimer(const char *name, struct SceKernelVTimerOptParam *opt);
/**
* Delete a virtual timer
*
* @param uid - The UID of the timer
*
* @return < 0 on error.
*/
int sceKernelDeleteVTimer(SceUID uid);
/**
* Get the timer base
*
* @param uid - UID of the vtimer
* @param base - Pointer to a ::SceKernelSysClock structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelGetVTimerBase(SceUID uid, SceKernelSysClock *base);
/**
* Get the timer base (wide format)
*
* @param uid - UID of the vtimer
*
* @return The 64bit timer base
*/
SceInt64 sceKernelGetVTimerBaseWide(SceUID uid);
/**
* Get the timer time
*
* @param uid - UID of the vtimer
* @param time - Pointer to a ::SceKernelSysClock structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelGetVTimerTime(SceUID uid, SceKernelSysClock *time);
/**
* Get the timer time (wide format)
*
* @param uid - UID of the vtimer
*
* @return The 64bit timer time
*/
SceInt64 sceKernelGetVTimerTimeWide(SceUID uid);
/**
* Set the timer time
*
* @param uid - UID of the vtimer
* @param time - Pointer to a ::SceKernelSysClock structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelSetVTimerTime(SceUID uid, SceKernelSysClock *time);
/**
* Set the timer time (wide format)
*
* @param uid - UID of the vtimer
* @param time - Pointer to a ::SceKernelSysClock structure
*
* @return Possibly the last time
*/
SceInt64 sceKernelSetVTimerTimeWide(SceUID uid, SceInt64 time);
/**
* Start a virtual timer
*
* @param uid - The UID of the timer
*
* @return < 0 on error
*/
int sceKernelStartVTimer(SceUID uid);
/**
* Stop a virtual timer
*
* @param uid - The UID of the timer
*
* @return < 0 on error
*/
int sceKernelStopVTimer(SceUID uid);
typedef SceUInt (*SceKernelVTimerHandler)(SceUID uid, SceKernelSysClock *, SceKernelSysClock *, void *);
typedef SceUInt (*SceKernelVTimerHandlerWide)(SceUID uid, SceInt64, SceInt64, void *);
/**
* Set the timer handler
*
* @param uid - UID of the vtimer
* @param time - Time to call the handler?
* @param handler - The timer handler
* @param common - Common pointer
*
* @return 0 on success, < 0 on error
*/
int sceKernelSetVTimerHandler(SceUID uid, SceKernelSysClock *time, SceKernelVTimerHandler handler, void *common);
/**
* Set the timer handler (wide mode)
*
* @param uid - UID of the vtimer
* @param time - Time to call the handler?
* @param handler - The timer handler
* @param common - Common pointer
*
* @return 0 on success, < 0 on error
*/
int sceKernelSetVTimerHandlerWide(SceUID uid, SceInt64 time, SceKernelVTimerHandlerWide handler, void *common);
/**
* Cancel the timer handler
*
* @param uid - The UID of the vtimer
*
* @return 0 on success, < 0 on error
*/
int sceKernelCancelVTimerHandler(SceUID uid);
typedef struct SceKernelVTimerInfo {
SceSize size;
char name[32];
int active;
SceKernelSysClock base;
SceKernelSysClock current;
SceKernelSysClock schedule;
SceKernelVTimerHandler handler;
void * common;
} SceKernelVTimerInfo;
/**
* Get the status of a VTimer
*
* @param uid - The uid of the VTimer
* @param info - Pointer to a ::SceKernelVTimerInfo structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelReferVTimerStatus(SceUID uid, SceKernelVTimerInfo *info);
/**
* Exit the thread (probably used as the syscall when the main thread
* returns
*/
void _sceKernelExitThread(void);
/**
* Get the type of a threadman uid
*
* @param uid - The uid to get the type from
*
* @return The type, < 0 on error
*/
enum SceKernelIdListType sceKernelGetThreadmanIdType(SceUID uid);
typedef int (*SceKernelThreadEventHandler)(int mask, SceUID thid, void *common);
/** Struct for event handler info */
typedef struct SceKernelThreadEventHandlerInfo {
SceSize size;
char name[32];
SceUID threadId;
int mask;
SceKernelThreadEventHandler handler;
void * common;
} SceKernelThreadEventHandlerInfo;
enum ThreadEventIds
{
THREADEVENT_ALL = 0xFFFFFFFF,
THREADEVENT_KERN = 0xFFFFFFF8,
THREADEVENT_USER = 0xFFFFFFF0,
THREADEVENT_CURRENT = 0
};
enum ThreadEvents
{
THREAD_CREATE = 1,
THREAD_START = 2,
THREAD_EXIT = 4,
THREAD_DELETE = 8,
};
/**
* Register a thread event handler
*
* @param name - Name for the thread event handler
* @param threadID - Thread ID to monitor
* @param mask - Bit mask for what events to handle (only lowest 4 bits valid)
* @param handler - Pointer to a ::SceKernelThreadEventHandler function
* @param common - Common pointer
*
* @return The UID of the create event handler, < 0 on error
*/
SceUID sceKernelRegisterThreadEventHandler(const char *name, SceUID threadID, int mask, SceKernelThreadEventHandler handler, void *common);
/**
* Release a thread event handler.
*
* @param uid - The UID of the event handler
*
* @return 0 on success, < 0 on error
*/
int sceKernelReleaseThreadEventHandler(SceUID uid);
/**
* Refer the status of an thread event handler
*
* @param uid - The UID of the event handler
* @param info - Pointer to a ::SceKernelThreadEventHandlerInfo structure
*
* @return 0 on success, < 0 on error
*/
int sceKernelReferThreadEventHandlerStatus(SceUID uid, struct SceKernelThreadEventHandlerInfo *info);
/**
* Get the thread profiler registers.
* @return Pointer to the registers, NULL on error
*/
PspDebugProfilerRegs *sceKernelReferThreadProfiler(void);
/**
* Get the globile profiler registers.
* @return Pointer to the registers, NULL on error
*/
PspDebugProfilerRegs *sceKernelReferGlobalProfiler(void);
/**@}*/
#ifdef __cplusplus
}
#endif
#endif