DosAllocThreadLocalMemory: Difference between revisions
mNo edit summary |
m Ak120 moved page OS2 API:CPI:DosAllocThreadLocalMemory to DosAllocThreadLocalMemory |
(No difference)
|
Revision as of 20:40, 26 November 2016
Description
Allocates a block of memory that is unique, or local, to a thread.
Syntax
#define INCL_DOSPROCESS #include <os2.h> ULONG cb; /* Number of 4-byte DWORDs to allocate. */ PULONG *p; /* Address of the memory block returned by the function. */ APIRET rc; /* Return Code. */ rc = DosAllocThreadLocalMemory(cb, p);
Parameters
- cb (ULONG) - input
- Number of 4-byte DWORDs to allocate.
- Up to 8 DWORDs (32 bytes) can be requested each time this function is called. A maximum of 32 DWORDs (128 bytes) can be allocated in total.
- p (PULONG *) - output
- Address of the memory block returned by the function.
Return Code
rc (APIRET) - returns
This function returns one of the following values:
- 0 NO_ERROR
- 8 ERROR_NOT_ENOUGH_MEMORY
- 87 ERROR_INVALID_PARAMETER
Remarks
When a process is started, a small block of memory is set aside to be used as a thread-local memory area. This memory is at the same virtual address for each thread, but is backed by different physical memory. This permits each thread to have a small block of memory that is unique, or local, to that thread.
The thread-local memory area consists of 32 DWORDs (128 bytes), each DWORD being 4 bytes in size. Up to 8 DWORDs (32 bytes) can be requested each time this function is called. If you want to allocate more than 8 DWORDs, you must call this function more than once.
Allocation is by DWORD only. If you want to store a BYTE in the thread-local memory area, you would still allocate a DWORD, then store the BYTE in it.
Example Code
This example shows how to allocate and free 3 WORDs of local thread memory.
#define INCL_DOSPROCESS #define INCL_DOSERRORS #include <os2.h> #include <stdio.h> /* Needed for printf */ PULONG pulThreadDWords = NULL; /* Pointer to thread DWORDs returned */ APIRET rc = NO_ERROR; /* Return code */ int main(VOID) { /* Allocate 3 DWORDs of local thread memory */ rc = DosAllocThreadLocalMemory(3, /* Number of DWORDs */ &pulThreadDWords); /* Address returned */ if (rc != NO_ERROR) { printf("DosAllocThreadLocalMemory error: return code = %u\n", rc); return 1; } /* ... Use the thread-local memory ... */ rc = DosFreeThreadLocalMemory(pulThreadDWords); /* Free the DWORDs */ if (rc != NO_ERROR) { printf("DosFreeThreadLocalMemory error: return code = %u\n", rc); return 1; } return NO_ERROR; }