1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <assert.h>
typedef uint64_t Size;
typedef uint8_t MemoryContextMethodID;
typedef struct MemoryChunk
{
uint64_t hdrmask;
} MemoryChunk;
#define MEMORY_CONTEXT_METHODID_BITS 8
#define MEMORYCHUNK_EXTERNAL_BASEBIT MEMORY_CONTEXT_METHODID_BITS
#define MEMORYCHUNK_VALUE_BASEBIT (MEMORYCHUNK_EXTERNAL_BASEBIT + 1)
#define MEMORYCHUNK_BLOCKOFFSET_BASEBIT (MEMORYCHUNK_VALUE_BASEBIT + 30)
#define UINT64CONST(x) (x##ULL)
#define MEMORYCHUNK_MAGIC (UINT64CONST(0xB1A8DB858EB6EFBA) >> MEMORYCHUNK_VALUE_BASEBIT << MEMORYCHUNK_VALUE_BASEBIT)
#define METHOD_ID 0x01
static inline void
MemoryChunkSetHdrMask(MemoryChunk *chunk, void *block,
Size value, MemoryContextMethodID methodid)
{
Size blockoffset = (char *)chunk - (char *)block;
chunk->hdrmask = (((uint64_t)blockoffset) << 34) |
(((uint64_t)value) << 4) |
methodid;
}
static inline void
MemoryChunkSetHdrMaskExternal(MemoryChunk *chunk,
MemoryContextMethodID methodid)
{
chunk->hdrmask = MEMORYCHUNK_MAGIC |
(((uint64_t)1) << MEMORYCHUNK_EXTERNAL_BASEBIT) |
methodid;
}
int main() {
void *block = malloc(1024);
MemoryChunk *chunk = (MemoryChunk *)((char *)block + 64); // Example offset
Size value = 0x12345;
MemoryContextMethodID methodid = METHOD_ID;
MemoryChunkSetHdrMask(chunk, block, value, methodid);
printf("Internal hdrmask: 0x%016lx\n", chunk->hdrmask);
// Check that hdrmask is not null
assert(chunk->hdrmask != 0);
MemoryChunkSetHdrMaskExternal(chunk, methodid);
printf("External hdrmask: 0x%016lx\n", chunk->hdrmask);
// Check that hdrmask is not null
assert(chunk->hdrmask != 0);
free(block);
return 0;
}
|