All pastes #148246 Raw Edit

codechunk

public text v1 · immutable
#148246 ·published 2006-08-25 00:04 UTC
rendered paste body
	/* does it make sense to use the mmap-like API? */
	if (flags == CODE_FLAG_MALLOC) {
		ptr = malloc (chunk_size);
		if (!ptr)
			return NULL;

	}
	else {
#ifndef FORCE_MALLOC
		ptr = mmap (0, chunk_size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|ARCH_MAP_FLAGS, -1, 0);
		if (ptr == (void*)-1) {
			int fd = open ("/dev/zero", O_RDONLY);
			if (fd != -1) {
				ptr = mmap (0, chunk_size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|ARCH_MAP_FLAGS, fd, 0);
				close (fd);
			}
			if (ptr == (void*)-1) {
				ptr = malloc (chunk_size);
				if (!ptr)
					return NULL;
				flags = CODE_FLAG_MALLOC;
			}
		}
#else
		return NULL;
#endif
	}

	if (flags == CODE_FLAG_MALLOC) {
		/*
		 * AMD64 processors maintain icache coherency only for pages which are 
		 * marked executable.
		 */
#ifndef PLATFORM_WIN32
		{
			char *page_start = (char *) (((gssize) (ptr)) & ~ (pagesize - 1));
			int pages = ((char*)ptr + chunk_size - page_start + pagesize - 1) / pagesize;
			int err = mprotect (page_start, pages * pagesize, PROT_READ | PROT_WRITE | PROT_EXEC);
>>>>line 257		assert (!err);
		}
#else
		{
			DWORD oldp;
			int err = VirtualProtect (ptr, chunk_size, PAGE_EXECUTE_READWRITE, &oldp);
			assert (err);
		}
#endif

#ifdef BIND_ROOM
			/* Make sure the thunks area is zeroed */
			memset (ptr, 0, bsize);
#endif
	}

	chunk = malloc (sizeof (CodeChunk));
	if (!chunk) {
		if (flags == CODE_FLAG_MALLOC)
			free (ptr);
#ifndef FORCE_MALLOC
		else
			munmap (ptr, chunk_size);
#endif
		return NULL;
	}
	chunk->next = NULL;
	chunk->size = chunk_size;
	chunk->data = ptr;
	chunk->flags = flags;
	chunk->pos = bsize;
	chunk->bsize = bsize;

	/*printf ("code chunk at: %p\n", ptr);*/
	return chunk;
}