return next_token_internal_talloc(ctx, ptr, pp_buff, sep, false);
}
+struct anonymous_shared_header {
+ union {
+ size_t length;
+ uint8_t pad[16];
+ } u;
+};
+
/* Map a shared memory buffer of at least nelem counters. */
void *anonymous_shared_allocate(size_t bufsz)
{
+ void *ptr;
void *buf;
size_t pagesz = getpagesize();
+ struct anonymous_shared_header *hdr;
+
+ bufsz += sizeof(*hdr);
if (bufsz % pagesz) {
bufsz = (bufsz + pagesz) % pagesz; /* round up to pagesz */
return NULL;
}
- return buf;
+ hdr = (struct anonymous_shared_header *)buf;
+ hdr->u.length = bufsz;
+
+ ptr = (void *)(&hdr[1]);
+
+ return ptr;
+}
+
+void anonymous_shared_free(void *ptr)
+{
+ struct anonymous_shared_header *hdr;
+
+ if (ptr == NULL) {
+ return;
+ }
+
+ hdr = (struct anonymous_shared_header *)ptr;
+
+ hdr--;
+ munmap(hdr, hdr->u.length);
}
#ifdef DEVELOPER
* Allocate anonymous shared memory of the given size
*/
void *anonymous_shared_allocate(size_t bufsz);
+void anonymous_shared_free(void *ptr);
/*
run a command as a child process, with a timeout.