-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Am 2013-08-19 14:34, schrieb Henri Verbeet: > On 19 August 2013 14:20, Stefan Dösinger > <stefandoesin...@gmail.com> wrote: >> Am 2013-08-19 13:53, schrieb Henri Verbeet: >>> That's actually a bug in what I posted. >> What's your suggested fix? Allocating size + align + alignment, >> and adding alignment to mem if mem happens to be already >> aligned? >> > I think it needs to be "align = max(sizeof(*p), alignment);", but > that's actually for the aligned + 1 case. With some inspiration from _aligned_offset_malloc in msvcrt I came up with this:
void *wined3d_alloc_resource_mem(SIZE_T size) { void **p; SIZE_T align = RESOURCE_ALIGNMENT - 1 + sizeof(*p); void *mem; if (!(mem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size + align))) return NULL; p = (void **)(((ULONG_PTR)mem + align) & ~(RESOURCE_ALIGNMENT - 1)) - 1; *p = mem; return ++p; } void wined3d_free_resource_mem(void *mem) { void **p = mem; if (!mem) return; HeapFree(GetProcessHeap(), 0, *(--p)); } I'm not entirely sure about the SIZE_T align = RESOURCE_ALIGNMENT - 1 + sizeof(*p); line though. Msvcrt doesn't have the - 1, and allocating size + RESOURCE_ALIGNMENT bytes might be enough. msvcrt allocates the equivalent of size + RESOURCE_ALIGNMENT + sizeof(void *). -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.20 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJSEjTlAAoJEN0/YqbEcdMwHhsP/3jldV7GHrhg8Asj1wxksNbz vXorIHDwBQQQFmcj4d5o7zyXsMho/SfebMeesmtJCtmfZeOasWjE02vgnbZSbU1T OA4Aow7orGeGWUCYddtJYLoDwC4HSaIXb/8HO5rCNnM1tVboHn0XXBM5q24t+fZo jbmX6Ma6QtD/b6dV+TCvh8YUih5Yy/lTr0Fq1c3nrodz7JTbHqu7qfdpK2QPqB4P ekRtHofPTLKLAxwZFw5Vc5hdUZ1xfejUuKgzQWnPFbb/jHFdN9gC+2mZdn0YbyEs hATXQX8N2oakjgzkBg1eyZInhPLHFTNrz5EfR0tolv+ytXdy0YfcOjSYkYOODkNb bUr1l1uTBw2trVYFtx52XqkhuoXZhj2DAbGtM2vmd81Sttce1CnZd08jcedDllon sSZ28lkvwxVL6N6pNkrpTWjaKj3RcaAhqJm5zj+MHX95w8gPl6oFps1lCrLXVaDP gsC9FeHL3QPf7Hb5arJvcxbH17CVRi+i4irJIgnOgJMLkZGK3+jbadKHPHA0D2i8 lTewyhf70+FJd04yZ0yoiXTYcJbZU9BkQMKxbTpywoUP8+3ZJ3n7PMe+CoFyphr1 fzZFR0sV/T4kCLBbH8YeTsiWluB0ioOCsh9cyNZrz6C2Dy5PmNmwTN0dWpi7LukF tamCuVqBu//pY5YUuq9d =7d25 -----END PGP SIGNATURE-----