Sto cercando di contrassegnare e deselezionare i puntatori in modo da poter implementare elenchi collegati non bloccanti. Ho verificato che sul codice l'ultimo bit non viene mai utilizzato, quindi sto provando a modificarlo per contrassegnare/deselezionare i puntatori.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
//This produces segfault, for some reason
//#define unmark(x) (x & (uintptr_t) 0xfffffffe)
//#define mark(x) (x | (uintptr_t) 0x00000001)
#define is_marked(x) ((long) x & 0x00000001)
#define mark(x) x + 1
#define unmark(x) x - 1
struct Example {
long x;
long y;
};
int main() {
struct Example *x = malloc(sizeof(struct Example));
x->x = 10;
x->y = 20;
uintptr_t p = (uintptr_t)(void*) x;
printf("%ld\n", ((struct Example *) (void*) p)->y);
printf("%04x\n", p);
printf("Is marked: %d\n", is_marked(p));
p = mark(p);
printf("%04x\n", p);
printf("Is marked: %d\n", is_marked(p));
p = unmark(p);
printf("%04x\n", p);
printf("Is marked: %d\n", is_marked(p));
printf("%ld\n", ((struct Example *) (void*) p)->y);
return 0;
}
Più nel dettagio,
#define unmark(x) (x & (uintptr_t) 0xfffffffe) è ciò che sta causando l'errore di segmentazione. Se non lo uso (e uso invece
#define unmark(x) x - 1) il programma funziona.