diff --git a/build/config_headers/paranoia_config.h b/build/config_headers/paranoia_config.h index b083ddebd0..c581bfcc66 100644 --- a/build/config_headers/paranoia_config.h +++ b/build/config_headers/paranoia_config.h @@ -4,7 +4,7 @@ // enable paranoia checks (0/1) #ifndef ENABLE_PARANOIA_CHECKS -# define ENABLE_PARANOIA_CHECKS 1 +# define ENABLE_PARANOIA_CHECKS 0 #endif // number of check slots (should depend on the components for which checks @@ -12,9 +12,15 @@ #define PARANOIA_SLOT_COUNT (32 * 1024) -// macros that enable paranoia checks for individual components +// macros that set the paranoia check level for individual components +// levels: +// * PARANOIA_NAIVE (checks disabled) +// * PARANOIA_SUSPICIOUS +// * PARANOIA_OBSESSIVE +// * PARANOIA_INSANE -//#define NET_BUFFER_PARANOIA 1 +#define NET_BUFFER_PARANOIA PARANOIA_NAIVE +#define OBJECT_CACHE_PARANOIA PARANOIA_NAIVE #endif // DEBUG_PARANOIA_CONFIG_H diff --git a/headers/private/kernel/debug_paranoia.h b/headers/private/kernel/debug_paranoia.h index 6d7d176dc8..821d1e030d 100644 --- a/headers/private/kernel/debug_paranoia.h +++ b/headers/private/kernel/debug_paranoia.h @@ -12,15 +12,21 @@ #include "paranoia_config.h" -// How to use: Include the header only from source files. Define -// ENABLE_PARANOIA_CHECK_COMPONENT (to 1 to enable) before. Use the macros -// defined below and the ParanoiaChecker class. +// How to use: Include the header only from source files. Set +// COMPONENT_PARANOIA_LEVEL before. Use the macros defined below and the +// ParanoiaChecker class. +// paranoia levels +#define PARANOIA_NAIVE 0 /* don't do any checks */ +#define PARANOIA_SUSPICIOUS 1 /* do some checks */ +#define PARANOIA_OBSESSIVE 2 /* do a lot of checks */ +#define PARANOIA_INSANE 3 /* do all checks, also very expensive ones */ +// mode for set_paranoia_check() enum paranoia_set_check_mode { - PARANOIA_DONT_FAIL, - PARANOIA_FAIL_IF_EXISTS, - PARANOIA_FAIL_IF_MISSING + PARANOIA_DONT_FAIL, // succeed, if check for address exists or not + PARANOIA_FAIL_IF_EXISTS, // fail, if check for address already exists + PARANOIA_FAIL_IF_MISSING // fail, if check for address doesn't exist yet }; @@ -45,10 +51,15 @@ void debug_paranoia_init(); __END_DECLS -#if ENABLE_PARANOIA_CHECK_COMPONENT +#if COMPONENT_PARANOIA_LEVEL # define PARANOIA_ONLY(x) x +# define PARANOIA_ONLY_LEVEL(level, x) \ + if ((level) <= (COMPONENT_PARANOIA_LEVEL)) { \ + x; \ + } #else # define PARANOIA_ONLY(x) +# define PARANOIA_ONLY_LEVEL(level, x) #endif #define CREATE_PARANOIA_CHECK_SET(object, description) \ @@ -57,17 +68,22 @@ __END_DECLS PARANOIA_ONLY(delete_paranoia_check_set((object))) #define RUN_PARANOIA_CHECKS(object) \ PARANOIA_ONLY(run_paranoia_checks((object))) -#define ADD_PARANOIA_CHECK(object, address, size) \ - PARANOIA_ONLY(set_paranoia_check((object), (address), (size), \ - PARANOIA_FAIL_IF_EXISTS)) -#define UPDATE_PARANOIA_CHECK(object, address, size) \ - PARANOIA_ONLY(set_paranoia_check((object), (address), (size), \ - PARANOIA_FAIL_IF_MISSING)) -#define SET_PARANOIA_CHECK(object, address, size) \ - PARANOIA_ONLY(set_paranoia_check((object), (address), (size), \ - PARANOIA_DONT_FAIL)) -#define REMOVE_PARANOIA_CHECK(object, address, size) \ - PARANOIA_ONLY(remove_paranoia_check((object), (address), (size))) + +#define ADD_PARANOIA_CHECK(level, object, address, size) \ + PARANOIA_ONLY_LEVEL((level), \ + set_paranoia_check((object), (address), (size), \ + PARANOIA_FAIL_IF_EXISTS)) +#define UPDATE_PARANOIA_CHECK(level, object, address, size) \ + PARANOIA_ONLY_LEVEL((level), \ + set_paranoia_check((object), (address), (size), \ + PARANOIA_FAIL_IF_MISSING)) +#define SET_PARANOIA_CHECK(level, object, address, size) \ + PARANOIA_ONLY_LEVEL((level), \ + set_paranoia_check((object), (address), (size), \ + PARANOIA_DONT_FAIL)) +#define REMOVE_PARANOIA_CHECK(level, object, address, size) \ + PARANOIA_ONLY_LEVEL((level), \ + remove_paranoia_check((object), (address), (size))) #ifdef __cplusplus diff --git a/src/add-ons/kernel/network/stack/net_buffer.cpp b/src/add-ons/kernel/network/stack/net_buffer.cpp index c0ff248715..94d9012c27 100644 --- a/src/add-ons/kernel/network/stack/net_buffer.cpp +++ b/src/add-ons/kernel/network/stack/net_buffer.cpp @@ -40,7 +40,7 @@ //#define ENABLE_DEBUGGER_COMMANDS 1 #define PARANOID_BUFFER_CHECK NET_BUFFER_PARANOIA -#define ENABLE_PARANOIA_CHECK_COMPONENT NET_BUFFER_PARANOIA +#define COMPONENT_PARANOIA_LEVEL NET_BUFFER_PARANOIA #include @@ -467,7 +467,8 @@ create_buffer(size_t headerSpace) CHECK_BUFFER(buffer); CREATE_PARANOIA_CHECK_SET(buffer, "net_buffer"); - SET_PARANOIA_CHECK(buffer, &buffer->size, sizeof(buffer->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, buffer, &buffer->size, + sizeof(buffer->size)); return buffer; } @@ -618,7 +619,8 @@ clone_buffer(net_buffer *_buffer, bool shareFreeSpace) copy_metadata(clone, buffer); CREATE_PARANOIA_CHECK_SET(clone, "net_buffer"); - SET_PARANOIA_CHECK(clone, &clone->size, sizeof(clone->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, clone, &clone->size, + sizeof(clone->size)); CHECK_BUFFER(buffer); CHECK_BUFFER(clone); @@ -739,7 +741,8 @@ merge_buffer(net_buffer *_buffer, net_buffer *_with, bool after) buffer->size += node->used; } - SET_PARANOIA_CHECK(buffer, &buffer->size, sizeof(buffer->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, buffer, &buffer->size, + sizeof(buffer->size)); // the data has been merged completely at this point free_buffer(with); @@ -915,7 +918,8 @@ prepend_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer) //dprintf(" prepend_size result:\n"); //dump_buffer(buffer); CHECK_BUFFER(buffer); - SET_PARANOIA_CHECK(buffer, &buffer->size, sizeof(buffer->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, buffer, &buffer->size, + sizeof(buffer->size)); return B_OK; } @@ -971,7 +975,8 @@ append_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer) node->tail_space = 0; node->used += previousTailSpace; buffer->size += previousTailSpace; - SET_PARANOIA_CHECK(buffer, &buffer->size, sizeof(buffer->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, buffer, &buffer->size, + sizeof(buffer->size)); // allocate all buffers @@ -998,7 +1003,8 @@ append_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer) buffer->size += sizeUsed; sizeAdded += sizeUsed; - SET_PARANOIA_CHECK(buffer, &buffer->size, sizeof(buffer->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, buffer, &buffer->size, + sizeof(buffer->size)); list_add_item(&buffer->buffers, node); @@ -1025,7 +1031,8 @@ append_size(net_buffer *_buffer, size_t size, void **_contiguousBuffer) node->used += size; buffer->size += size; - SET_PARANOIA_CHECK(buffer, &buffer->size, sizeof(buffer->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, buffer, &buffer->size, + sizeof(buffer->size)); //dprintf(" append result 2:\n"); //dump_buffer(buffer); @@ -1112,7 +1119,8 @@ remove_header(net_buffer *_buffer, size_t bytes) } buffer->size -= bytes; - SET_PARANOIA_CHECK(buffer, &buffer->size, sizeof(buffer->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, buffer, &buffer->size, + sizeof(buffer->size)); //dprintf(" remove result:\n"); //dump_buffer(buffer); @@ -1173,7 +1181,8 @@ trim_data(net_buffer *_buffer, size_t newSize) } buffer->size = newSize; - SET_PARANOIA_CHECK(buffer, &buffer->size, sizeof(buffer->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, buffer, &buffer->size, + sizeof(buffer->size)); //dprintf(" trim result:\n"); //dump_buffer(buffer); @@ -1250,7 +1259,8 @@ append_cloned_data(net_buffer *_buffer, net_buffer *_source, uint32 offset, //dump_buffer(buffer); CHECK_BUFFER(source); CHECK_BUFFER(buffer); - SET_PARANOIA_CHECK(buffer, &buffer->size, sizeof(buffer->size)); + SET_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, buffer, &buffer->size, + sizeof(buffer->size)); return B_OK; } diff --git a/src/system/kernel/slab/Slab.cpp b/src/system/kernel/slab/Slab.cpp index 1ad1a93635..a2416aea82 100644 --- a/src/system/kernel/slab/Slab.cpp +++ b/src/system/kernel/slab/Slab.cpp @@ -39,8 +39,7 @@ #define TRACE_CACHE(cache, format, bananas...) do { } while (0) #endif -#define OBJECT_CACHE_PARANOIA 1 -#define ENABLE_PARANOIA_CHECK_COMPONENT OBJECT_CACHE_PARANOIA +#define COMPONENT_PARANOIA_LEVEL OBJECT_CACHE_PARANOIA #include @@ -843,7 +842,8 @@ object_cache_alloc(object_cache *cache, uint32 flags) source->count--; cache->used_count++; - REMOVE_PARANOIA_CHECK(source, &link->next, sizeof(void*)); + REMOVE_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, source, &link->next, + sizeof(void*)); TRACE_CACHE(cache, "allocate %p (%p) from %p, %lu remaining.", link_to_object(link, cache->object_size), link, source, source->count); @@ -877,7 +877,7 @@ object_cache_return_to_slab(object_cache *cache, slab *source, void *object) source->count++; cache->used_count--; - ADD_PARANOIA_CHECK(source, &link->next, sizeof(void*)); + ADD_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, source, &link->next, sizeof(void*)); if (source->count == source->size) { cache->partial.Remove(source); @@ -1000,8 +1000,8 @@ object_cache::InitSlab(slab *slab, void *pages, size_t byteCount) _push(slab->free, object_to_link(data, object_size)); - ADD_PARANOIA_CHECK(slab, &object_to_link(data, object_size)->next, - sizeof(void*)); + ADD_PARANOIA_CHECK(PARANOIA_SUSPICIOUS, slab, + &object_to_link(data, object_size)->next, sizeof(void*)); data += object_size; }