+ if ((size_t)region & (sz - 1)) {
+ TRACE("m0", "get_new_region: region not aligned", 0, 0);
+ munmap(region, sz);
+ region = mmap(NULL, sz * 2, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
+ if (region == (void *)-1) {
+ perror("get_new_region: mmap");
+ exit(-1);
+ }
+ TRACE("m0", "get_new_region: mmapped new region %p (size %p)", region, sz * 2);
+ void *aligned = (void *)(((size_t)region + sz) & ~(sz - 1));
+ size_t extra = (char *)aligned - (char *)region;
+ if (extra) {
+ munmap(region, extra);
+ TRACE("m0", "get_new_region: unmapped extra memory %p (size %p)", region, extra);
+ }
+ extra = ((char *)region + sz) - (char *)aligned;
+ if (extra) {
+ munmap((char *)aligned + sz, extra);
+ TRACE("m0", "get_new_region: unmapped extra memory %p (size %p)", (char *)aligned + sz, extra);
+ }
+ region = aligned;
+ }