dbug stuff. for now, you have to edit cmakelists.txt to set the location of dbug.

This commit is contained in:
Sears Russell 2011-02-14 22:09:57 +00:00
parent 34fec57c07
commit 14d8cebdcc
5 changed files with 80 additions and 22 deletions

View file

@ -4,6 +4,7 @@ cmake_minimum_required(VERSION 2.4) # For all I know, 2.0 works too...
# The new behavior seems preferable, though it shouldn't affect us either way. # The new behavior seems preferable, though it shouldn't affect us either way.
if(COMMAND cmake_policy) if(COMMAND cmake_policy)
cmake_policy(SET CMP0014 OLD)
cmake_policy(SET CMP0003 NEW) cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy) endif(COMMAND cmake_policy)
@ -65,6 +66,14 @@ INCLUDE(CheckCSourceCompiles)
CHECK_FUNCTION_EXISTS(sync_file_range HAVE_SYNC_FILE_RANGE) CHECK_FUNCTION_EXISTS(sync_file_range HAVE_SYNC_FILE_RANGE)
CHECK_FUNCTION_EXISTS(fdatasync HAVE_FDATASYNC) CHECK_FUNCTION_EXISTS(fdatasync HAVE_FDATASYNC)
CHECK_FUNCTION_EXISTS(tdestroy HAVE_TDESTROY) CHECK_FUNCTION_EXISTS(tdestroy HAVE_TDESTROY)
FIND_LIBRARY(DBUG_TEST dbug-stubs /home/sears/local/dbug/lib/)
if(NOT DBUG_TEST)
message(STATUS "dbug not found. proceeding with normal build")
else(NOT DBUG_TEST)
message(STATUS "found dbug ${DBUG_TEST}")
endif(NOT DBUG_TEST)
SET(CMAKE_REQUIRED_FLAGS "-lm") SET(CMAKE_REQUIRED_FLAGS "-lm")
CHECK_FUNCTION_EXISTS(powl HAVE_POWL) CHECK_FUNCTION_EXISTS(powl HAVE_POWL)
CHECK_C_SOURCE_COMPILES("#define _GNU_SOURCE CHECK_C_SOURCE_COMPILES("#define _GNU_SOURCE
@ -124,7 +133,7 @@ ENDMACRO(CREATE_EXECUTABLE)
# Output the config.h file # Output the config.h file
#CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) #CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/build INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src
/usr/include) /usr/include)
@ -132,7 +141,7 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/build
LINK_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/src/stasis) LINK_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/src/stasis)
IF ( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" ) IF ( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" )
SET(COMMON_LIBRARIES stasis m pthread stdc++) SET(COMMON_LIBRARIES stasis m pthread stdc++ ${DBUG_TEST})
SET(CMAKE_C_FLAGS "-g -Wall -pedantic -std=gnu99 -DPBL_COMPAT -D_FILE_OFFSET_BITS=64 ${CMAKE_C_FLAGS}") SET(CMAKE_C_FLAGS "-g -Wall -pedantic -std=gnu99 -DPBL_COMPAT -D_FILE_OFFSET_BITS=64 ${CMAKE_C_FLAGS}")
SET(CMAKE_CXX_FLAGS "-g -Wall -Wno-long-long -pedantic -DPBL_COMPAT -D_FILE_OFFSET_BITS=64 ${CMAKE_CXX_FLAGS}") SET(CMAKE_CXX_FLAGS "-g -Wall -Wno-long-long -pedantic -DPBL_COMPAT -D_FILE_OFFSET_BITS=64 ${CMAKE_CXX_FLAGS}")
ELSEIF ( "${CMAKE_C_COMPILER_ID}" STREQUAL "SunPro" ) ELSEIF ( "${CMAKE_C_COMPILER_ID}" STREQUAL "SunPro" )
@ -142,7 +151,7 @@ ELSEIF ( "${CMAKE_C_COMPILER_ID}" STREQUAL "SunPro" )
ELSE( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" ) ELSE( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" )
# TODO: how to detect compilers correctly on old cmake??? This is a huge hack; it uses old gcc # TODO: how to detect compilers correctly on old cmake??? This is a huge hack; it uses old gcc
# options, since cmake is old... # options, since cmake is old...
SET(COMMON_LIBRARIES stasis m pthread stdc++) SET(COMMON_LIBRARIES stasis m pthread stdc++ ${DBUG_TEST})
SET(CMAKE_C_FLAGS "-g -Wall -pedantic -std=gnu99 -DPBL_COMPAT -D_FILE_OFFSET_BITS=64 ${CMAKE_C_FLAGS}") SET(CMAKE_C_FLAGS "-g -Wall -pedantic -std=gnu99 -DPBL_COMPAT -D_FILE_OFFSET_BITS=64 ${CMAKE_C_FLAGS}")
SET(CMAKE_CXX_FLAGS "-g -Wall -Wno-long-long -pedantic -DPBL_COMPAT -D_FILE_OFFSET_BITS=64 ${CMAKE_CXX_FLAGS}") SET(CMAKE_CXX_FLAGS "-g -Wall -Wno-long-long -pedantic -DPBL_COMPAT -D_FILE_OFFSET_BITS=64 ${CMAKE_CXX_FLAGS}")
ENDIF ( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" ) ENDIF ( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" )

View file

@ -7,7 +7,7 @@
#cmakedefine HAVE_ALLOCA_H #cmakedefine HAVE_ALLOCA_H
#cmakedefine HAVE_TDESTROY #cmakedefine HAVE_TDESTROY
#cmakedefine HAVE_POWL #cmakedefine HAVE_POWL
#cmakedefine DBUG_TEST
#ifndef HAVE_PTHREAD_STACK_MIN #ifndef HAVE_PTHREAD_STACK_MIN
#define PTHREAD_STACK_MIN 32768 // wild guess. #define PTHREAD_STACK_MIN 32768 // wild guess.
#endif #endif

View file

@ -54,8 +54,11 @@ static inline pageid_t hash6432shift(pageid_t key)
// return (key | 64) ^ ((key >> 15) | (key << 17)); // return (key | 64) ^ ((key >> 15) | (key << 17));
// return stasis_crc32(&key, sizeof(key), 0); // return stasis_crc32(&key, sizeof(key), 0);
#ifdef DBUG_TEST
return key;
#else
return key * 13; return key * 13;
#endif
} }
static inline pageid_t hashtable_func(hashtable_t *ht, pageid_t key) { static inline pageid_t hashtable_func(hashtable_t *ht, pageid_t key) {
return hashtable_wrap(ht, hash6432shift(key)); return hashtable_wrap(ht, hash6432shift(key));

View file

@ -58,14 +58,25 @@ terms specified in this license.
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#ifdef DBUG_TEST
extern int dbug_choice(int);
#endif
#define LOG_NAME "check_lhtable.log" #define LOG_NAME "check_lhtable.log"
#ifdef DBUG_TEST
#define NUM_OPS 4
#define NUM_ENTRIES 4
#define NUM_THREADS 2
#define THREAD_ENTRIES 2
#define HT_ENTRIES 16
#define myrandom(x) dbug_choice(x)
#else
#define NUM_OPS 10000000 #define NUM_OPS 10000000
#define NUM_ENTRIES 10000 #define NUM_ENTRIES 10000
#define NUM_THREADS 100 #define NUM_THREADS 100
#define THREAD_ENTRIES ((NUM_ENTRIES/NUM_THREADS)-1) #define THREAD_ENTRIES ((NUM_ENTRIES/NUM_THREADS)-1)
#endif
hashtable_t * ht; hashtable_t * ht;
void * worker(void * arg) { void * worker(void * arg) {
@ -73,10 +84,17 @@ void * worker(void * arg) {
pageid_t *data = malloc(sizeof(pageid_t) * THREAD_ENTRIES); pageid_t *data = malloc(sizeof(pageid_t) * THREAD_ENTRIES);
#ifdef DBUG_TEST
for(int i = 1; i <= THREAD_ENTRIES; i++) {
data[i-1] = -1 * (stride + (i * HT_ENTRIES));
}
#else
for(int i = 1; i <= THREAD_ENTRIES; i++) { for(int i = 1; i <= THREAD_ENTRIES; i++) {
data[i-1] = -1 * (stride + (i * NUM_THREADS)); data[i-1] = -1 * (stride + (i * NUM_THREADS));
} }
for(int j = 0; j < NUM_OPS/ NUM_THREADS; j++) { #endif
for(int j = 0; j < NUM_OPS/*/ NUM_THREADS*/; j++) {
int op = myrandom(2); int op = myrandom(2);
int i = myrandom(THREAD_ENTRIES); int i = myrandom(THREAD_ENTRIES);
@ -115,14 +133,22 @@ void * worker(void * arg) {
} }
START_TEST(singleThreadHashTest) { START_TEST(singleThreadHashTest) {
#ifdef DBUG_TEST
ht = hashtable_init((pageid_t)HT_ENTRIES);
#else
ht = hashtable_init((pageid_t)((double)THREAD_ENTRIES * 1.1)); ht = hashtable_init((pageid_t)((double)THREAD_ENTRIES * 1.1));
#endif
int i = 0; int i = 0;
worker(&i); worker(&i);
hashtable_deinit(ht); hashtable_deinit(ht);
} END_TEST } END_TEST
START_TEST(concurrentHashTest) { START_TEST(concurrentHashTest) {
#ifdef DBUG_TEST
ht = hashtable_init((pageid_t)HT_ENTRIES);
#else
ht = hashtable_init((pageid_t)((double)NUM_ENTRIES * 1.1)); ht = hashtable_init((pageid_t)((double)NUM_ENTRIES * 1.1));
#endif
pthread_t workers[NUM_THREADS]; pthread_t workers[NUM_THREADS];
for(int i = 0 ; i < NUM_THREADS; i++) { for(int i = 0 ; i < NUM_THREADS; i++) {
int * ip = malloc(sizeof(int)); int * ip = malloc(sizeof(int));
@ -146,8 +172,9 @@ Suite * check_suite(void) {
/* Sub tests are added, one per line, here */ /* Sub tests are added, one per line, here */
tcase_add_test(tc, singleThreadHashTest); tcase_add_test(tc, singleThreadHashTest);
#ifndef DBUG_TEST // TODO should run exactly one of these two tests under dbug. Need good way to choose which one.
tcase_add_test(tc, concurrentHashTest); tcase_add_test(tc, concurrentHashTest);
#endif
/* --------------------------------------------- */ /* --------------------------------------------- */
tcase_add_checked_fixture(tc, setup, teardown); tcase_add_checked_fixture(tc, setup, teardown);

View file

@ -3,6 +3,10 @@
#undef STLSEARCH #undef STLSEARCH
#ifdef DBUG_TEST
extern int dbug_choice(int);
#endif
#include <stasis/redblack.h> #include <stasis/redblack.h>
#include <stasis/stlredblack.h> #include <stasis/stlredblack.h>
@ -63,37 +67,52 @@ static void assert_equal(const void * rb_ret_1, const void * rb_ret_2,
/* Create two libredblack trees and two stl trees. Use different orders with consistent == for each pair */ /* Create two libredblack trees and two stl trees. Use different orders with consistent == for each pair */
START_TEST(rbRandTest) { START_TEST(rbRandTest) {
time_t seed = time(0);
printf("\nSeed = %ld\n", seed);
srandom(seed);
#ifdef DBUG_TEST
uint64_t NUM_OPERATIONS = 6;
uint64_t NUM_ENTRIES = 3;
uint64_t NUM_A = 3;
uint64_t NUM_B = 1;
# define myrandom(a) dbug_choice(a)
#else
uint64_t NUM_OPERATIONS = 1000 * 1000; uint64_t NUM_OPERATIONS = 1000 * 1000;
uint64_t NUM_ENTRIES = myrandom(100 * 1000);
uint64_t NUM_A = myrandom(200);
uint64_t NUM_B = myrandom(50000);
#endif
printf("NUM_OPERATIONS = %lld NUM_ENTRIES = %lld NUM_A = %lld NUM_B = %lld\n",
(long long int)NUM_OPERATIONS, (long long int)NUM_ENTRIES, (long long int)NUM_A, (long long int)NUM_B);
rbtree *rb_1 = rbinit(cmp_1, NULL); rbtree *rb_1 = rbinit(cmp_1, NULL);
rbtree *rb_2 = rbinit(cmp_2, NULL); rbtree *rb_2 = rbinit(cmp_2, NULL);
rbtree *stl_1 = stl_rbinit(cmp_1, NULL); rbtree *stl_1 = stl_rbinit(cmp_1, NULL);
rbtree *stl_2 = stl_rbinit(cmp_2, NULL); rbtree *stl_2 = stl_rbinit(cmp_2, NULL);
time_t seed = time(0);
printf("\nSeed = %ld\n", seed);
srandom(seed);
uint64_t NUM_ENTRIES = myrandom(100 * 1000);
uint64_t NUM_A = myrandom(200);
uint64_t NUM_B = myrandom(50000);
printf("NUM_OPERATIONS = %lld NUM_ENTRIES = %lld NUM_A = %lld NUM_B = %lld\n",
(long long int)NUM_OPERATIONS, (long long int)NUM_ENTRIES, (long long int)NUM_A, (long long int)NUM_B);
tup * entries = malloc(sizeof(tup) * NUM_ENTRIES); tup * entries = malloc(sizeof(tup) * NUM_ENTRIES);
#ifdef DBUG_TEST
for(uint64_t i = 0; i < NUM_ENTRIES; i++) {
entries[i].a = i;
entries[i].b = 0;
}
#else
for(uint64_t i = 0; i < NUM_ENTRIES; i++) { for(uint64_t i = 0; i < NUM_ENTRIES; i++) {
entries[i].a = myrandom(NUM_A); entries[i].a = myrandom(NUM_A);
entries[i].b = myrandom(NUM_B); entries[i].b = myrandom(NUM_B);
} }
#endif
uint64_t num_found = 0; uint64_t num_found = 0;
uint64_t num_collide = 0; uint64_t num_collide = 0;
for(uint64_t i = 0; i < NUM_OPERATIONS; i++) { for(uint64_t i = 0; i < NUM_OPERATIONS; i++) {
uint64_t off = myrandom(NUM_ENTRIES); uint64_t off = myrandom(NUM_ENTRIES);
#ifdef DBUG_TEST
switch(myrandom(3)+1) {
#else
switch(myrandom(4)) { switch(myrandom(4)) {
case 0: case 0:
#endif
case 1: { // insert case 1: { // insert
const void * rb_ret_1 = rbsearch(&entries[off], rb_1); const void * rb_ret_1 = rbsearch(&entries[off], rb_1);
const void * rb_ret_2 = rbsearch(&entries[off], rb_2); const void * rb_ret_2 = rbsearch(&entries[off], rb_2);