@@ -223,15 +223,17 @@ static int szclass(size_t sz)
223
223
return 41 ;
224
224
}
225
225
226
- #ifdef __LP64__
227
- #define malloc_a16 (sz ) malloc(((sz)+15)&-16)
228
- #else
229
- #if defined(WIN32 )
230
- // TODO - use _aligned_malloc, which requires _aligned_free
226
+ #ifdef _P64
231
227
#define malloc_a16 (sz ) malloc(((sz)+15)&-16)
228
+ #define free_a16 (p ) free(p)
229
+
230
+ #elif defined(_WIN32 ) //&& !defined(_WIN64) is implicit here
231
+ #define malloc_a16 (sz ) _aligned_malloc(sz?((sz)+15)&-16:1, 16)
232
+ #define free_a16 (p ) _aligned_free(p)
232
233
233
234
#elif defined(__APPLE__ )
234
235
#define malloc_a16 (sz ) malloc(((sz)+15)&-16)
236
+ #define free_a16 (p ) free(p)
235
237
236
238
#else
237
239
static inline void * malloc_a16 (size_t sz )
@@ -241,7 +243,8 @@ static inline void *malloc_a16(size_t sz)
241
243
return NULL ;
242
244
return ptr ;
243
245
}
244
- #endif
246
+ #define free_a16 (p ) free(p)
247
+
245
248
#endif
246
249
247
250
static void * alloc_big (size_t sz )
@@ -280,13 +283,13 @@ static void sweep_big(void)
280
283
#ifdef MEMDEBUG
281
284
memset (v , 0xbb , v -> sz + BVOFFS * sizeof (void * ));
282
285
#endif
283
- free (v );
286
+ free_a16 (v );
284
287
}
285
288
v = nxt ;
286
289
}
287
290
}
288
291
289
- jl_mallocptr_t * jl_gc_acquire_buffer (void * b , size_t sz )
292
+ jl_mallocptr_t * jl_gc_acquire_buffer (void * b , size_t sz , int isaligned )
290
293
{
291
294
jl_mallocptr_t * mp ;
292
295
if (malloc_ptrs_freelist == NULL ) {
@@ -296,6 +299,11 @@ jl_mallocptr_t *jl_gc_acquire_buffer(void *b, size_t sz)
296
299
mp = malloc_ptrs_freelist ;
297
300
malloc_ptrs_freelist = malloc_ptrs_freelist -> next ;
298
301
}
302
+ #if defined(_WIN32 ) && !defined(_WIN64 )
303
+ mp -> isaligned = isaligned ;
304
+ #else
305
+ (void )isaligned ;
306
+ #endif
299
307
mp -> sz = sz ;
300
308
mp -> ptr = b ;
301
309
mp -> next = malloc_ptrs ;
@@ -313,7 +321,7 @@ jl_mallocptr_t *jl_gc_managed_malloc(size_t sz)
313
321
if (b == NULL )
314
322
jl_throw (jl_memory_exception );
315
323
allocd_bytes += sz ;
316
- return jl_gc_acquire_buffer (b , sz );
324
+ return jl_gc_acquire_buffer (b , sz , 1 );
317
325
}
318
326
319
327
static void sweep_malloc_ptrs (void )
@@ -330,7 +338,15 @@ static void sweep_malloc_ptrs(void)
330
338
* pmp = nxt ;
331
339
if (mp -> ptr ) {
332
340
freed_bytes += mp -> sz ;
333
- free (mp -> ptr );
341
+ #if defined(_WIN32 ) && !defined(_WIN64 )
342
+ if (mp -> isaligned ) {
343
+ free_a16 (mp -> ptr );
344
+ } else {
345
+ free (mp -> ptr );
346
+ }
347
+ #else
348
+ free_a16 (mp -> ptr );
349
+ #endif
334
350
}
335
351
mp -> next = malloc_ptrs_freelist ;
336
352
malloc_ptrs_freelist = mp ;
@@ -425,7 +441,7 @@ static void sweep_pool(pool_t *p)
425
441
#ifdef MEMDEBUG
426
442
memset (pg , 0xbb , sizeof (gcpage_t ));
427
443
#endif
428
- free (pg );
444
+ free_a16 (pg );
429
445
//freed_bytes += GC_PAGE_SZ;
430
446
}
431
447
else {
0 commit comments