vm: Add threadsafe_sterror to the vm.
parent
91b16d7ed1
commit
69262be4d8
32
vm/image.cpp
32
vm/image.cpp
|
@ -200,12 +200,26 @@ bool factor_vm::read_embedded_image_footer(FILE* file,
|
||||||
return footer->magic == image_magic;
|
return footer->magic == image_magic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *threadsafe_strerror(int errnum) {
|
||||||
|
char *buf = (char *) malloc(STRERROR_BUFFER_SIZE);
|
||||||
|
if(!buf) {
|
||||||
|
fatal_error("Out of memory in threadsafe_strerror", 0);
|
||||||
|
}
|
||||||
|
int ret = THREADSAFE_STRERROR(errnum, buf, STRERROR_BUFFER_SIZE);
|
||||||
|
if(ret != 0) {
|
||||||
|
std::cout << "Truncated output from THREADSAFE_STRERROR, error code:" << errnum << ", ret: " << ret << std::endl;
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
FILE* factor_vm::open_image(vm_parameters* p) {
|
FILE* factor_vm::open_image(vm_parameters* p) {
|
||||||
if (p->embedded_image) {
|
if (p->embedded_image) {
|
||||||
FILE* file = OPEN_READ(p->executable_path);
|
FILE* file = OPEN_READ(p->executable_path);
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
std::cout << "Cannot open embedded image" << std::endl;
|
std::cout << "Cannot open embedded image" << std::endl;
|
||||||
std::cout << strerror(errno) << std::endl;
|
char *msg = threadsafe_strerror(errno);
|
||||||
|
std::cout << "strerror: " << msg << std::endl;
|
||||||
|
free(msg);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
embedded_image_footer footer;
|
embedded_image_footer footer;
|
||||||
|
@ -225,7 +239,9 @@ void factor_vm::load_image(vm_parameters* p) {
|
||||||
FILE* file = open_image(p);
|
FILE* file = open_image(p);
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
std::cout << "Cannot open image file: " << p->image_path << std::endl;
|
std::cout << "Cannot open image file: " << p->image_path << std::endl;
|
||||||
std::cout << strerror(errno) << std::endl;
|
char *msg = threadsafe_strerror(errno);
|
||||||
|
std::cout << "strerror: " << msg << std::endl;
|
||||||
|
free(msg);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,7 +281,9 @@ bool factor_vm::save_image(const vm_char* saving_filename,
|
||||||
file = OPEN_WRITE(saving_filename);
|
file = OPEN_WRITE(saving_filename);
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
std::cout << "Cannot open image file for writing: " << saving_filename << std::endl;
|
std::cout << "Cannot open image file for writing: " << saving_filename << std::endl;
|
||||||
std::cout << strerror(errno) << std::endl;
|
char *msg = threadsafe_strerror(errno);
|
||||||
|
std::cout << "strerror: " << msg << std::endl;
|
||||||
|
free(msg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,8 +313,12 @@ bool factor_vm::save_image(const vm_char* saving_filename,
|
||||||
ok = false;
|
ok = false;
|
||||||
safe_fclose(file);
|
safe_fclose(file);
|
||||||
|
|
||||||
if (!ok)
|
if (!ok) {
|
||||||
std::cout << "save-image failed: " << strerror(errno) << std::endl;
|
std::cout << "save-image failed." << std::endl;
|
||||||
|
char *msg = threadsafe_strerror(errno);
|
||||||
|
std::cout << "strerror: " << msg << std::endl;
|
||||||
|
free(msg);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
move_file(saving_filename, filename);
|
move_file(saving_filename, filename);
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@ namespace factor {
|
||||||
static const cell image_magic = 0x0f0e0d0c;
|
static const cell image_magic = 0x0f0e0d0c;
|
||||||
static const cell image_version = 4;
|
static const cell image_version = 4;
|
||||||
|
|
||||||
|
const size_t STRERROR_BUFFER_SIZE = 1024;
|
||||||
|
|
||||||
struct embedded_image_footer {
|
struct embedded_image_footer {
|
||||||
cell magic;
|
cell magic;
|
||||||
cell image_offset;
|
cell image_offset;
|
||||||
|
|
|
@ -5,5 +5,4 @@ namespace factor {
|
||||||
void early_init();
|
void early_init();
|
||||||
const char* vm_executable_path();
|
const char* vm_executable_path();
|
||||||
const char* default_image_path();
|
const char* default_image_path();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -502,4 +502,8 @@ void abort() {
|
||||||
::abort();
|
::abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int THREADSAFE_STRERROR(int errnum, char *buf, size_t buflen) {
|
||||||
|
return strerror_r(errnum, buf, buflen);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,4 +46,6 @@ void move_file(const vm_char* path1, const vm_char* path2);
|
||||||
|
|
||||||
static inline void breakpoint() { __builtin_trap(); }
|
static inline void breakpoint() { __builtin_trap(); }
|
||||||
|
|
||||||
|
int THREADSAFE_STRERROR(int errnum, char *buf, size_t buflen);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -373,4 +373,6 @@ void factor_vm::end_sampling_profiler_timer() {
|
||||||
|
|
||||||
void abort() { ::abort(); }
|
void abort() { ::abort(); }
|
||||||
|
|
||||||
|
int THREADSAFE_STRERROR(int errnum, char *buf, size_t buflen) {
|
||||||
|
return strerror_s(buf, buflen, errnum);
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,4 +93,6 @@ inline static void breakpoint() { DebugBreak(); }
|
||||||
#define FUNCTION_TOC_POINTER(ptr) ptr
|
#define FUNCTION_TOC_POINTER(ptr) ptr
|
||||||
|
|
||||||
extern HANDLE boot_thread;
|
extern HANDLE boot_thread;
|
||||||
|
|
||||||
|
int THREADSAFE_STRERROR(int errnum, char *buf, size_t buflen);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue