Skip to content
This repository was archived by the owner on Dec 16, 2022. It is now read-only.

Commit 22a2dd0

Browse files
committed
WINDOWS: fix JuliaLang#1822
1 parent 3d43049 commit 22a2dd0

File tree

3 files changed

+33
-14
lines changed

3 files changed

+33
-14
lines changed

src/array.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ jl_array_t *jl_ptr_to_array_1d(jl_value_t *atype, void *data, size_t nel,
231231

232232
if (own_buffer) {
233233
a->ismalloc = 1;
234-
jl_array_data_owner(a) = (jl_value_t*)jl_gc_acquire_buffer(data,nel*elsz);
234+
jl_array_data_owner(a) = (jl_value_t*)jl_gc_acquire_buffer(data,nel*elsz,0);
235235
}
236236
else {
237237
a->ismalloc = 0;
@@ -277,7 +277,7 @@ jl_array_t *jl_ptr_to_array(jl_value_t *atype, void *data, jl_tuple_t *dims,
277277

278278
if (own_buffer) {
279279
a->ismalloc = 1;
280-
jl_array_data_owner(a) = (jl_value_t*)jl_gc_acquire_buffer(data,nel*elsz);
280+
jl_array_data_owner(a) = (jl_value_t*)jl_gc_acquire_buffer(data,nel*elsz,0);
281281
}
282282
else {
283283
a->ismalloc = 0;

src/gc.c

+27-11
Original file line numberDiff line numberDiff line change
@@ -223,15 +223,17 @@ static int szclass(size_t sz)
223223
return 41;
224224
}
225225

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
231227
#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)
232233

233234
#elif defined(__APPLE__)
234235
#define malloc_a16(sz) malloc(((sz)+15)&-16)
236+
#define free_a16(p) free(p)
235237

236238
#else
237239
static inline void *malloc_a16(size_t sz)
@@ -241,7 +243,8 @@ static inline void *malloc_a16(size_t sz)
241243
return NULL;
242244
return ptr;
243245
}
244-
#endif
246+
#define free_a16(p) free(p)
247+
245248
#endif
246249

247250
static void *alloc_big(size_t sz)
@@ -280,13 +283,13 @@ static void sweep_big(void)
280283
#ifdef MEMDEBUG
281284
memset(v, 0xbb, v->sz+BVOFFS*sizeof(void*));
282285
#endif
283-
free(v);
286+
free_a16(v);
284287
}
285288
v = nxt;
286289
}
287290
}
288291

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)
290293
{
291294
jl_mallocptr_t *mp;
292295
if (malloc_ptrs_freelist == NULL) {
@@ -296,6 +299,11 @@ jl_mallocptr_t *jl_gc_acquire_buffer(void *b, size_t sz)
296299
mp = malloc_ptrs_freelist;
297300
malloc_ptrs_freelist = malloc_ptrs_freelist->next;
298301
}
302+
#if defined(_WIN32) && !defined(_WIN64)
303+
mp->isaligned = isaligned;
304+
#else
305+
(void)isaligned;
306+
#endif
299307
mp->sz = sz;
300308
mp->ptr = b;
301309
mp->next = malloc_ptrs;
@@ -313,7 +321,7 @@ jl_mallocptr_t *jl_gc_managed_malloc(size_t sz)
313321
if (b == NULL)
314322
jl_throw(jl_memory_exception);
315323
allocd_bytes += sz;
316-
return jl_gc_acquire_buffer(b, sz);
324+
return jl_gc_acquire_buffer(b, sz, 1);
317325
}
318326

319327
static void sweep_malloc_ptrs(void)
@@ -330,7 +338,15 @@ static void sweep_malloc_ptrs(void)
330338
*pmp = nxt;
331339
if (mp->ptr) {
332340
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
334350
}
335351
mp->next = malloc_ptrs_freelist;
336352
malloc_ptrs_freelist = mp;
@@ -425,7 +441,7 @@ static void sweep_pool(pool_t *p)
425441
#ifdef MEMDEBUG
426442
memset(pg, 0xbb, sizeof(gcpage_t));
427443
#endif
428-
free(pg);
444+
free_a16(pg);
429445
//freed_bytes += GC_PAGE_SZ;
430446
}
431447
else {

src/julia.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ typedef struct _jl_mallocptr_t {
8686
struct _jl_mallocptr_t *next;
8787
size_t sz;
8888
void *ptr;
89+
#if defined(_WIN32) && !defined(_WIN64)
90+
int isaligned;
91+
#endif
8992
} jl_mallocptr_t;
9093

9194
// how much space we're willing to waste if an array outgrows its
@@ -1080,7 +1083,7 @@ void jl_gc_unpreserve(void);
10801083
int jl_gc_n_preserved_values(void);
10811084
DLLEXPORT void jl_gc_add_finalizer(jl_value_t *v, jl_function_t *f);
10821085
jl_weakref_t *jl_gc_new_weakref(jl_value_t *value);
1083-
jl_mallocptr_t *jl_gc_acquire_buffer(void *b, size_t sz);
1086+
jl_mallocptr_t *jl_gc_acquire_buffer(void *b, size_t sz, int isaligned);
10841087
jl_mallocptr_t *jl_gc_managed_malloc(size_t sz);
10851088
void *alloc_2w(void);
10861089
void *alloc_3w(void);

0 commit comments

Comments
 (0)