COVERAGE_DEFINE(util_xalloc);
/* argv[0] without directory names. */
-const char *program_name;
+char *program_name;
/* Name for the currently running thread or process, for log messages, process
* listings, and debuggers. */
void *
xmalloc_cacheline(size_t size)
{
+#ifdef HAVE_POSIX_MEMALIGN
+ void *p;
+ int error;
+
+ COVERAGE_INC(util_xalloc);
+ error = posix_memalign(&p, CACHE_LINE_SIZE, size ? size : 1);
+ if (error != 0) {
+ out_of_memory();
+ }
+ return p;
+#else
void **payload;
void *base;
*payload = base;
return (char *) payload + MEM_ALIGN;
+#endif
}
/* Like xmalloc_cacheline() but clears the allocated memory to all zero
void
free_cacheline(void *p)
{
+#ifdef HAVE_POSIX_MEMALIGN
+ free(p);
+#else
if (p) {
free(*(void **) ((uintptr_t) p - MEM_ALIGN));
}
+#endif
}
char *
set_program_name__(const char *argv0, const char *version, const char *date,
const char *time)
{
-#ifdef _WIN32
char *basename;
+#ifdef _WIN32
size_t max_len = strlen(argv0) + 1;
- if (program_name) {
- return;
- }
+ SetErrorMode(GetErrorMode() | SEM_NOGPFAULTERRORBOX);
+
basename = xmalloc(max_len);
_splitpath_s(argv0, NULL, 0, NULL, 0, basename, max_len, NULL, 0);
- assert_single_threaded();
- program_name = basename;
#else
const char *slash = strrchr(argv0, '/');
- assert_single_threaded();
- program_name = slash ? slash + 1 : argv0;
+ basename = xstrdup(slash ? slash + 1 : argv0);
#endif
+ assert_single_threaded();
+ free(program_name);
+ program_name = basename;
free(program_version);
if (!strcmp(version, VERSION)) {