diff options
| author | Michael Bebenita <mbebenita@mozilla.com> | 2010-08-16 14:13:08 -0700 |
|---|---|---|
| committer | Michael Bebenita <mbebenita@mozilla.com> | 2010-08-16 15:05:57 -0700 |
| commit | b40a9fa787dd3b7d979cdf3e156284d6667fe9d2 (patch) | |
| tree | 27b18e7280feed3adc368a0d98053f84d4fe2215 /src/rt/rust_srv.cpp | |
| parent | 7e62aa68018c94bcfc3fd6beab90cf7b87f91cbf (diff) | |
| download | rust-b40a9fa787dd3b7d979cdf3e156284d6667fe9d2.tar.gz rust-b40a9fa787dd3b7d979cdf3e156284d6667fe9d2.zip | |
Pulled rust_srv in its own file. Some cleanup, and added varargs to assertion macros.
Diffstat (limited to 'src/rt/rust_srv.cpp')
| -rw-r--r-- | src/rt/rust_srv.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/rt/rust_srv.cpp b/src/rt/rust_srv.cpp new file mode 100644 index 00000000000..9239f643ebe --- /dev/null +++ b/src/rt/rust_srv.cpp @@ -0,0 +1,121 @@ +/* + * + */ + +#include "rust_internal.h" +#include "rust_srv.h" + +#define TRACK_ALLOCATIONS + +rust_srv::rust_srv() : _live_allocations(0) { + // Nop. +} + +rust_srv::~rust_srv() { + if (_live_allocations != 0) { + char msg[128]; + snprintf(msg, sizeof(msg), + "leaked memory in rust main loop (%" PRIuPTR " objects)", + _live_allocations); +#ifdef TRACK_ALLOCATIONS + for (size_t i = 0; i < _allocation_list.size(); i++) { + if (_allocation_list[i] != NULL) { + printf("allocation 0x%" PRIxPTR " was not freed\n", + (uintptr_t) _allocation_list[i]); + } + } +#endif + fatal(msg, __FILE__, __LINE__, ""); + } +} + +void * +rust_srv::malloc(size_t bytes) { + ++_live_allocations; + void * val = ::malloc(bytes); +#ifdef TRACK_ALLOCATIONS + _allocation_list.append(val); +#endif + return val; +} + +void * +rust_srv::realloc(void *p, size_t bytes) { + if (!p) { + _live_allocations++; + } + void * val = ::realloc(p, bytes); +#ifdef TRACK_ALLOCATIONS + if (_allocation_list.replace(p, val) == false) { + printf("realloc: ptr 0x%" PRIxPTR " is not in allocation_list\n", + (uintptr_t) p); + fatal("not in allocation_list", __FILE__, __LINE__, ""); + } +#endif + return val; +} + +void +rust_srv::free(void *p) { +#ifdef TRACK_ALLOCATIONS + if (_allocation_list.replace(p, NULL) == false) { + printf("free: ptr 0x%" PRIxPTR " is not in allocation_list\n", + (uintptr_t) p); + fatal("not in allocation_list", __FILE__, __LINE__, ""); + } +#endif + if (_live_allocations < 1) { + fatal("live_allocs < 1", __FILE__, __LINE__, ""); + } + _live_allocations--; + ::free(p); +} + +void +rust_srv::log(char const *msg) { + printf("rt: %s\n", msg); +} + +void +rust_srv::fatal(const char *expression, + const char *file, + size_t line, + const char *format, + ...) { + char buf[1024]; + va_list args; + va_start(args, format); + vsnprintf(buf, sizeof(buf), format, args); + va_end(args); + + char msg[1024]; + snprintf(msg, sizeof(msg), + "fatal, '%s' failed, %s:%d %s", + expression, file, (int)line, buf); + log(msg); + exit(1); +} + +void +rust_srv::warning(char const *expression, + char const *file, + size_t line, + const char *format, + ...) { + char buf[1024]; + va_list args; + va_start(args, format); + vsnprintf(buf, sizeof(buf), format, args); + va_end(args); + + char msg[1024]; + snprintf(msg, sizeof(msg), + "warning: '%s', at: %s:%d %s", + expression, file, (int)line, buf); + log(msg); +} + +rust_srv * +rust_srv::clone() { + return new rust_srv(); +} |
