Skip to content

Commit 7c9ab1d

Browse files
committed
replace malloc with calloc for array allocation for JuliaLang#9147
1 parent 40fc56b commit 7c9ab1d

File tree

3 files changed

+23
-25
lines changed

3 files changed

+23
-25
lines changed

src/array.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ static jl_array_t *_new_array_(jl_value_t *atype, uint32_t ndims, size_t *dims,
8181
a->type = atype;
8282
a->how = 0;
8383
data = (char*)a + doffs;
84-
if (tot > 0 && !isunboxed) {
84+
if (tot > 0) {
8585
memset(data, 0, tot);
8686
}
8787
}
@@ -95,8 +95,6 @@ static jl_array_t *_new_array_(jl_value_t *atype, uint32_t ndims, size_t *dims,
9595
a->how = 2;
9696
data = jl_gc_managed_malloc(tot);
9797
jl_gc_track_malloced_array(a);
98-
if (!isunboxed)
99-
memset(data, 0, tot);
10098
JL_GC_POP();
10199
}
102100

src/gc.c

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -111,27 +111,27 @@ static size_t total_freed_bytes=0;
111111
// malloc wrappers, aligned allocation
112112

113113
#ifdef _P64
114-
#define malloc_a16(sz) malloc(((sz)+15)&-16)
114+
#define calloc_a16(sz) calloc(1,((sz)+15)&-16)
115115
#define free_a16(p) free(p)
116116

117-
#elif defined(_OS_WINDOWS_) /* 32-bit OS is implicit here. */
118-
#define malloc_a16(sz) _aligned_malloc(sz?((sz)+15)&-16:1, 16)
119-
#define free_a16(p) _aligned_free(p)
120-
121117
#elif defined(__APPLE__)
122-
#define malloc_a16(sz) malloc(((sz)+15)&-16)
118+
#define calloc_a16(sz) calloc(1,((sz)+15)&-16)
123119
#define free_a16(p) free(p)
124120

125121
#else
126-
static inline void *malloc_a16(size_t sz)
122+
static inline void *calloc_a16(size_t n)
127123
{
128-
void *ptr;
129-
if (posix_memalign(&ptr, 16, (sz+15)&-16))
130-
return NULL;
131-
return ptr;
124+
p = (void *) (((uintptr_t) p0 + 16) & (~((uintptr_t) (16 - 1))));
125+
*((void **) p - 1) = p0;
126+
return p;
127+
}
128+
static inline void *realloc_a16(void *p, size_t n)
129+
{
130+
}
131+
static inline void free_a16(void *p)
132+
{
133+
if (p) free(*((void **) p - 1));
132134
}
133-
#define free_a16(p) free(p)
134-
135135
#endif
136136

137137
DLLEXPORT void *jl_gc_counted_malloc(size_t sz)
@@ -168,7 +168,7 @@ void *jl_gc_managed_malloc(size_t sz)
168168
if (allocd_bytes > collect_interval)
169169
jl_gc_collect();
170170
sz = (sz+15) & -16;
171-
void *b = malloc_a16(sz);
171+
void *b = calloc_a16(sz);
172172
if (b == NULL)
173173
jl_throw(jl_memory_exception);
174174
allocd_bytes += sz;
@@ -183,16 +183,11 @@ void *jl_gc_managed_realloc(void *d, size_t sz, size_t oldsz, int isaligned)
183183
void *b;
184184
#ifdef _P64
185185
b = realloc(d, sz);
186-
#elif defined(_OS_WINDOWS_)
187-
if (isaligned)
188-
b = _aligned_realloc(d, sz, 16);
189-
else
190-
b = realloc(d, sz);
191186
#elif defined(__APPLE__)
192187
b = realloc(d, sz);
193188
#else
194189
// TODO better aligned realloc here
195-
b = malloc_a16(sz);
190+
b = calloc_a16(sz);
196191
if (b != NULL) {
197192
memcpy(b, d, oldsz);
198193
if (isaligned) free_a16(d); else free(d);
@@ -348,7 +343,7 @@ static void *alloc_big(size_t sz)
348343
if (sz+offs+15 < offs+15) // overflow in adding offs, size was "negative"
349344
jl_throw(jl_memory_exception);
350345
size_t allocsz = (sz+offs+15) & -16;
351-
bigval_t *v = (bigval_t*)malloc_a16(allocsz);
346+
bigval_t *v = (bigval_t*)calloc_a16(allocsz);
352347
allocd_bytes += allocsz;
353348
if (v == NULL)
354349
jl_throw(jl_memory_exception);
@@ -462,7 +457,7 @@ static void add_page(pool_t *p)
462457
gcpage_t *pg = (gcpage_t*)mmap(NULL, sizeof(gcpage_t), PROT_READ|PROT_WRITE,
463458
MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
464459
#else
465-
gcpage_t *pg = (gcpage_t*)malloc_a16(sizeof(gcpage_t));
460+
gcpage_t *pg = (gcpage_t*)calloc_a16(sizeof(gcpage_t));
466461
#endif
467462
if (pg == NULL)
468463
jl_throw(jl_memory_exception);

test/core.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,3 +1962,8 @@ function f9134()
19621962
end
19631963
end
19641964
@test_throws UndefVarError f9134()
1965+
1966+
# issue #9147
1967+
for n = 1:1000
1968+
@test all(Array(Int, n) .== 0)
1969+
end

0 commit comments

Comments
 (0)