shared: rewrite fail_on_null() as abort_oom_if_null()
Recently I learnt that fprintf() is not async-signal-safe. Maybe it also attempts to allocate memory sometimes. Hence, using it when we presumably are out of memory is wishful thinking. Therefore replace that with async-signal-safe code. If you have to check pointers from traditional signal handlers, now you could do that too! While doing this, we also lose the string formatting for line number. I would argue that printing file and line number is not that useful, if the system really is out of memory. If not out of memory, a core dump would give us much more detailed information about what went wrong. clients/window.c had some calls to fail_on_null() and these are simply replaced. They were used for checking that creating new wl_proxy by issuing a protocol request worked, and IIRC that only fails on out-of-memory, so the same rationale applies here. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This commit is contained in:
+17
-19
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright © 2008 Kristian Høgsberg
|
||||
* Copyright 2022 Collabora, Ltd.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
@@ -31,35 +32,32 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <libweston/zalloc.h>
|
||||
|
||||
|
||||
static inline void *
|
||||
fail_on_null(void *p, size_t size, char *file, int32_t line)
|
||||
abort_oom_if_null(void *p)
|
||||
{
|
||||
if (p == NULL) {
|
||||
fprintf(stderr, "[%s] ", program_invocation_short_name);
|
||||
if (file)
|
||||
fprintf(stderr, "%s:%d: ", file, line);
|
||||
fprintf(stderr, "out of memory");
|
||||
if (size)
|
||||
fprintf(stderr, " (%zd)", size);
|
||||
fprintf(stderr, "\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
static const char oommsg[] = ": out of memory\n";
|
||||
|
||||
return p;
|
||||
if (p)
|
||||
return p;
|
||||
|
||||
write(STDERR_FILENO, program_invocation_short_name,
|
||||
strlen(program_invocation_short_name));
|
||||
write(STDERR_FILENO, oommsg, strlen(oommsg));
|
||||
|
||||
abort();
|
||||
}
|
||||
|
||||
#define xmalloc(s) (fail_on_null(malloc(s), (s), __FILE__, __LINE__))
|
||||
#define xzalloc(s) (fail_on_null(zalloc(s), (s), __FILE__, __LINE__))
|
||||
#define xcalloc(n, s) (fail_on_null(calloc(n, s), (n) * (s), __FILE__, __LINE__))
|
||||
#define xstrdup(s) (fail_on_null(strdup(s), 0, __FILE__, __LINE__))
|
||||
#define xrealloc(p, s) (fail_on_null(realloc(p, s), (s), __FILE__, __LINE__))
|
||||
#define xmalloc(s) (abort_oom_if_null(malloc(s)))
|
||||
#define xzalloc(s) (abort_oom_if_null(zalloc(s)))
|
||||
#define xcalloc(n, s) (abort_oom_if_null(calloc(n, s)))
|
||||
#define xstrdup(s) (abort_oom_if_null(strdup(s)))
|
||||
#define xrealloc(p, s) (abort_oom_if_null(realloc(p, s)))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user