Browse Source

Keep retrying indefinitely with backoff after a malloc failure instead of quitting, with a message directly to stderr

master
Con Kolivas 10 years ago
parent
commit
11208274b1
  1. 47
      src/libckpool.c

47
src/libckpool.c

@ -1203,9 +1203,13 @@ void align_len(size_t *len)
*len += 4 - (*len % 4); *len += 4 - (*len % 4);
} }
/* Malloc failure should be fatal but keep backing off and retrying as the OS
* will kill us eventually if it can't recover. */
void realloc_strcat(char **ptr, const char *s) void realloc_strcat(char **ptr, const char *s)
{ {
size_t old, new, len; size_t old, new, len;
int backoff = 1;
void *new_ptr;
char *ofs; char *ofs;
if (unlikely(!*s)) { if (unlikely(!*s)) {
@ -1223,9 +1227,16 @@ void realloc_strcat(char **ptr, const char *s)
old = strlen(*ptr); old = strlen(*ptr);
len = old + new + 1; len = old + new + 1;
align_len(&len); align_len(&len);
*ptr = realloc(*ptr, len); while (42) {
if (!*ptr) new_ptr = realloc(*ptr, len);
quit(1, "Failed to realloc ptr of size %d in realloc_strcat", (int)len); if (likely(new_ptr))
break;
if (backoff == 1)
fprintf(stderr, "Failed to realloc %d, retrying\n", (int)len);
cksleep_ms(backoff);
backoff <<= 1;
}
*ptr = new_ptr;
ofs = *ptr + old; ofs = *ptr + old;
sprintf(ofs, "%s", s); sprintf(ofs, "%s", s);
} }
@ -1241,23 +1252,41 @@ void trail_slash(char **buf)
void *_ckalloc(size_t len, const char *file, const char *func, const int line) void *_ckalloc(size_t len, const char *file, const char *func, const int line)
{ {
int backoff = 1;
void *ptr; void *ptr;
align_len(&len); align_len(&len);
ptr = malloc(len); while (42) {
if (unlikely(!ptr)) ptr = malloc(len);
quitfrom(1, file, func, line, "Failed to ckalloc!"); if (likely(ptr))
break;
if (backoff == 1) {
fprintf(stderr, "Failed to ckalloc %d, retrying from %s %s:%d\n",
(int)len, file, func, line);
}
cksleep_ms(backoff);
backoff <<= 1;
}
return ptr; return ptr;
} }
void *_ckzalloc(size_t len, const char *file, const char *func, const int line) void *_ckzalloc(size_t len, const char *file, const char *func, const int line)
{ {
int backoff = 1;
void *ptr; void *ptr;
align_len(&len); align_len(&len);
ptr = calloc(len, 1); while (42) {
if (unlikely(!ptr)) ptr = calloc(len, 1);
quitfrom(1, file, func, line, "Failed to ckalloc!"); if (likely(ptr))
break;
if (backoff == 1) {
fprintf(stderr, "Failed to ckzalloc %d, retrying from %s %s:%d\n",
(int)len, file, func, line);
}
cksleep_ms(backoff);
backoff <<= 1;
}
return ptr; return ptr;
} }

Loading…
Cancel
Save