main.cc (fstransform-0.9.3-src) | : | main.cc (fstransform-0.9.4) | ||
---|---|---|---|---|
skipping to change at line 28 | skipping to change at line 28 | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | * | |||
* main.cc | * main.cc | |||
* | * | |||
* Created on: Mar 1, 2011 | * Created on: Mar 1, 2011 | |||
* Author: max | * Author: max | |||
*/ | */ | |||
#include "first.hh" | #include "first.hh" | |||
#undef FR_TEST_MAP | #undef FR_TEST_MAP | |||
#undef FR_TEST_MAP_MERGE | ||||
#undef FR_TEST_VECTOR_COMPOSE | ||||
#undef FR_TEST_RANDOM | #undef FR_TEST_RANDOM | |||
#undef FR_TEST_IOCTL_FIEMAP | ||||
#undef FR_TEST_WRITE_ZEROES | #undef FR_TEST_WRITE_ZEROES | |||
#undef FR_TEST_PRETTY_TIME | #undef FR_TEST_PRETTY_TIME | |||
#if defined(FR_TEST_MAP) | #if defined(FR_TEST_MAP) | |||
# include "map.hh" | # include "map.hh" | |||
# include "work.hh" | # include "work.hh" | |||
#define FR_MAIN(argc, argv) FT_NS test_map<ft_uint>() | ||||
FT_NAMESPACE_BEGIN | FT_NAMESPACE_BEGIN | |||
#define FR_MAIN(argc, argv) FT_NS test_map<ft_uint>() | ||||
template<typename T> | template<typename T> | |||
static int test_map() { | static int test_map() { | |||
fr_map<T> map; | fr_map<T> map; | |||
map.insert(3, 3, 1, FC_DEFAULT_USER_DATA); | map.insert(3, 3, 1, FC_DEFAULT_USER_DATA); | |||
map.insert(0, 0, 3, FC_DEFAULT_USER_DATA); | map.insert(0, 0, 3, FC_DEFAULT_USER_DATA); | |||
fr_work<T>::show("test map", "", 1, map, FC_INFO); | fr_work<T>::show("test map", "", 1, map, FC_INFO); | |||
return 0; | return 0; | |||
} | } | |||
FT_NAMESPACE_END | FT_NAMESPACE_END | |||
#elif defined(FR_TEST_MAP_MERGE) | ||||
#include "log.hh" | ||||
#include "map.hh" | ||||
#include "vector.hh" | ||||
FT_NAMESPACE_BEGIN | ||||
template<typename T> | ||||
static void test_show(const char * label1, const char * label2, const fr_vector< | ||||
T> v) { | ||||
v.show(label1, label2, 1, FC_INFO); | ||||
} | ||||
#define FR_MAIN(argc, argv) FT_NS test_map_merge<ft_uoff>() | ||||
template<typename T> | ||||
static int test_map_merge() { | ||||
fr_vector<T> v1, v2; | ||||
v1.append(39174144, 4589568, 31744, FC_DEFAULT_USER_DATA); | ||||
v2.append(70565888, 4476928, 114688, FC_DEFAULT_USER_DATA); | ||||
test_show("v1", "", v1); | ||||
test_show("v2", "", v2); | ||||
// use fr_map<T>::merge_shift() to merge. | ||||
// unluckily it merges based on ->physical, so we must transpose the vectors | ||||
v1.transpose(); | ||||
v2.transpose(); | ||||
fr_map<ft_uoff> map; | ||||
enum { NO_SHIFT = 0 }; | ||||
map.append0_shift(v1, NO_SHIFT); | ||||
map.merge_shift(v2, NO_SHIFT, FC_PHYSICAL1); | ||||
v1.assign(map.begin(), map.end()); | ||||
v1.transpose(); | ||||
test_show("v1", " after merge", v1); | ||||
return 0; | ||||
} | ||||
FT_NAMESPACE_END | ||||
#elif defined(FR_TEST_VECTOR_COMPOSE) | ||||
#include "log.hh" | ||||
#include "vector.hh" | ||||
FT_NAMESPACE_BEGIN | ||||
template<typename T> | ||||
static void test_show(const char * label, const fr_vector<T> v) { | ||||
v.show(label, "", 1, FC_INFO); | ||||
} | ||||
#define FR_MAIN(argc, argv) FT_NS test_vector_compose<ft_uoff>() | ||||
template<typename T> | ||||
static int test_vector_compose() { | ||||
fr_vector<T> v1, v2, result, unmapped; | ||||
T bitmask = 0; | ||||
v1.append( 0, 10,100, FC_DEFAULT_USER_DATA); | ||||
v2.append( 4, 0, 30, FC_DEFAULT_USER_DATA); | ||||
v2.append(54, 30, 50, FC_DEFAULT_USER_DATA); | ||||
v2.append(94, 80, 40, FC_DEFAULT_USER_DATA); | ||||
int err = result.compose(v1, v2, bitmask, unmapped); | ||||
if (err == 0) { | ||||
ff_log(FC_INFO, 0, "block_size_bitmask = 0x%" FT_XLL, (ft_ull) bitmask); | ||||
test_show("result", result); | ||||
test_show("unmapped", unmapped); | ||||
} | ||||
return err ? 1 : 0; | ||||
} | ||||
FT_NAMESPACE_END | ||||
#elif defined(FR_TEST_RANDOM) | #elif defined(FR_TEST_RANDOM) | |||
# include "assert.hh" | # include "assert.hh" | |||
# include "log.hh" | # include "log.hh" | |||
# include "misc.hh" | # include "misc.hh" | |||
#define FR_MAIN(argc, argv) FT_NS test_random(argc, argv) | ||||
FT_NAMESPACE_BEGIN | FT_NAMESPACE_BEGIN | |||
#define FR_MAIN(argc, argv) FT_NS test_random(argc, argv) | ||||
static int test_random(int argc, char ** argv) { | static int test_random(int argc, char ** argv) { | |||
ft_ull i, n = 1000, max = 7; | ft_ull i, n = 1000, max = 7; | |||
if (argc > 1) | if (argc > 1) | |||
ff_str2ull(argv[1], & max); | ff_str2ull(argv[1], & max); | |||
if (argc > 2) | if (argc > 2) | |||
ff_str2ull(argv[2], & n); | ff_str2ull(argv[2], & n); | |||
if (max > 0x10000) { | if (max > 0x10000) { | |||
for (i = 0; i < n; i++) | for (i = 0; i < n; i++) | |||
ff_log(FC_INFO, 0, "ff_random(%20"FT_ULL") = %20"FT_ULL, max, ff_rand om(max)); | ff_log(FC_INFO, 0, "ff_random(%20" FT_ULL ") = %20" FT_ULL , max, f f_random(max)); | |||
} else { | } else { | |||
ft_ull r; | ft_ull r; | |||
ft_size * hist = new ft_size[max + 1]; | ft_size * hist = new ft_size[max + 1]; | |||
for (i = 0; i <= max; i++) | for (i = 0; i <= max; i++) | |||
hist[i] = 0; | hist[i] = 0; | |||
for (i = 0; i < n; i++) { | for (i = 0; i < n; i++) { | |||
r = ff_random(max); | r = ff_random(max); | |||
ff_assert(r <= max); | ff_assert(r <= max); | |||
++hist[r]; | ++hist[r]; | |||
} | } | |||
for (i = 0; i <= max; i++) | for (i = 0; i <= max; i++) | |||
ff_log(FC_INFO, 0, "histogram[%"FT_ULL"] = %"FT_ULL, i, (ft_ull)hist[ i]); | ff_log(FC_INFO, 0, "histogram[%" FT_ULL "] = %" FT_ULL , i, (ft_ull )hist[i]); | |||
delete[] hist; | delete[] hist; | |||
} | } | |||
return 0; | return 0; | |||
} | } | |||
FT_NAMESPACE_END | FT_NAMESPACE_END | |||
#elif defined(FR_TEST_IOCTL_FIEMAP) | ||||
# include "log.hh" | ||||
# include "vector.hh" | ||||
# include "io/extent_posix.hh" | ||||
# include "io/util_posix.hh" | ||||
#include <errno.h> | ||||
#include <sys/types.h> | ||||
#include <sys/stat.h> | ||||
#include <fcntl.h> | ||||
#include <unistd.h> | ||||
FT_NAMESPACE_BEGIN | ||||
using FT_IO_NS ff_posix_size; | ||||
using FT_IO_NS ff_read_extents_posix; | ||||
#define FR_MAIN(argc, argv) FT_NS test_ioctl_fiemap(argc, argv) | ||||
static int test_ioctl_fiemap(int argc, char ** argv) | ||||
{ | ||||
ft_log::get_root_logger().set_level(FC_DEBUG); | ||||
ft_log_appender::redefine(stdout, FC_FMT_DATETIME_LEVEL_CALLER_MSG, FC_DEBUG | ||||
, FC_NOTICE); | ||||
ft_log_appender::redefine(stderr, FC_FMT_DATETIME_LEVEL_CALLER_MSG, FC_WARN) | ||||
; | ||||
fr_vector<ft_uoff> extents; | ||||
ft_uoff dev_size = 0x7FFFFFFFul, block_size_bitmask; | ||||
const char * path; | ||||
int fd, err = 0; | ||||
while ((path = * ++argv) != NULL) { | ||||
if ((fd = ::open(path, O_RDONLY)) < 0) { | ||||
err = ff_log(FC_ERROR, errno, "error opening file '%s'", path); | ||||
break; | ||||
} | ||||
extents.clear(); | ||||
block_size_bitmask = 0; | ||||
if ((err = ff_read_extents_posix(fd, dev_size, extents, block_size_bitma | ||||
sk)) != 0) | ||||
break; | ||||
ft_size n = extents.size(); | ||||
ff_log(FC_INFO, 0, "# %4" FT_ULL " extent%s in %s", (ft_ull) n, (n == 1 | ||||
? " " : "s"), path); | ||||
ff_log(FC_INFO, 0, "# extent physical logical le | ||||
ngth user_data"); | ||||
for (ft_size i = 0; i < n; i++) { | ||||
fr_extent<ft_uoff> & e = extents[i]; | ||||
ff_log(FC_INFO, 0, "#%8" FT_ULL "\t%12" FT_ULL "\t%12" FT_ULL "\t | ||||
%8" FT_ULL "\t(%" FT_ULL ")", (ft_ull)i, | ||||
(ft_ull) e.physical(), (ft_ull) e.logical(), (ft_ull) e.lengt | ||||
h(), (ft_ull) e.user_data()); | ||||
} | ||||
} | ||||
return err; | ||||
} | ||||
FT_NAMESPACE_END | ||||
#elif defined(FR_TEST_WRITE_ZEROES) | #elif defined(FR_TEST_WRITE_ZEROES) | |||
FT_IO_NAMESPACE_BEGIN | FT_IO_NAMESPACE_BEGIN | |||
int ff_zero_loop_file_holes(int argc, char ** argv); | int ff_zero_loop_file_holes(int argc, char ** argv); | |||
FT_IO_NAMESPACE_END | FT_IO_NAMESPACE_END | |||
# define FR_MAIN(argc, argv) FT_IO_NS ff_zero_loop_file_holes(argc, argv) | # define FR_MAIN(argc, argv) FT_IO_NS ff_zero_loop_file_holes(argc, argv) | |||
#elif defined(FR_TEST_PRETTY_TIME) | #elif defined(FR_TEST_PRETTY_TIME) | |||
#include "misc.hh" | #include "misc.hh" | |||
#include "log.hh" | #include "log.hh" | |||
FT_NAMESPACE_BEGIN | FT_NAMESPACE_BEGIN | |||
int ff_test_pretty_time(int argc, char ** argv) { | int ff_test_pretty_time(int argc, char ** argv) { | |||
ft_log_level log_level = FT_NS FC_INFO; | ft_log_level log_level = FT_NS FC_INFO; | |||
double time, percentage = 0.0, pretty_len = 0; | double time, percentage = 0.0, pretty_len = 0; | |||
const char * simul_msg = "", * pretty_label = ""; | const char * simul_msg = "", * pretty_label = ""; | |||
for (time = 0.4; time < 800000000.0; time *= 1.1) { | for (time = 0.4; time < 800000000.0; time *= 1.1) { | |||
ft_ull time_left1 = 0, time_left2 = 0; | ft_ull time_left1 = 0, time_left2 = 0; | |||
const char * time_left_label1 = NULL, * time_left_label2 = NULL; | const char * time_left_label1 = NULL, * time_left_label2 = NULL; | |||
ff_pretty_time2(time, & time_left1, & time_left_label1, & time_left2, & t | ff_pretty_time2(time, & time_left1, & time_left_label1, & time_left2, & | |||
ime_left_label2); | time_left_label2); | |||
/* we write something like "1 hour and 20 minutes" instead of just "1 hou | /* we write something like "1 hour and 20 minutes" instead of just "1 ho | |||
r" or "1.3 hours" */ | ur" or "1.3 hours" */ | |||
if (time_left_label2 != NULL) { | if (time_left_label2 != NULL) { | |||
ff_log(log_level, 0, "%sprogress: %4.1f%% done, %.2f %sbytes stil | ff_log(log_level, 0, "%sprogress: %4.1f%% done, %.2f %sbytes still t | |||
l to relocate, estimated %"FT_ULL" %s%s and %"FT_ULL" %s%s left", | o relocate, estimated %" FT_ULL " %s%s and %" FT_ULL " %s%s left", | |||
simul_msg, percentage, pretty_len, pretty_label, | simul_msg, percentage, pretty_len, pretty_label, | |||
time_left1, time_left_label1, (time_left1 != 1 ? | time_left1, time_left_label1, (time_left1 != 1 ? "s": ""), | |||
"s": ""), | time_left2, time_left_label2, (time_left2 != 1 ? "s": "")); | |||
time_left2, time_left_label2, (time_left2 != 1 ? | } else { | |||
"s": "")); | ff_log(log_level, 0, "%sprogress: %4.1f%% done, %.2f %sbytes still t | |||
} else { | o relocate, estimated %" FT_ULL " %s%s left", | |||
ff_log(log_level, 0, "%sprogress: %4.1f%% done, %.2f %sbytes stil | simul_msg, percentage, pretty_len, pretty_label, | |||
l to relocate, estimated %"FT_ULL" %s%s left", | time_left1, time_left_label1, (time_left1 != 1 ? "s": "")); | |||
simul_msg, percentage, pretty_len, pretty_label, | } | |||
time_left1, time_left_label1, (time_left1 != 1 ? | } | |||
"s": "")); | return 0; | |||
} | ||||
} | ||||
return 0; | ||||
} | } | |||
FT_NAMESPACE_END | FT_NAMESPACE_END | |||
# define FR_MAIN(argc, argv) FT_NS ff_test_pretty_time(argc, argv) | # define FR_MAIN(argc, argv) FT_NS ff_test_pretty_time(argc, argv) | |||
#else /* actual fstranform program */ | #else /* actual fstranform program */ | |||
# include "remap.hh" // for fr_remap | # include "remap.hh" // for fr_remap | |||
# define FR_MAIN(argc, argv) FT_NS fr_remap::main(argc, argv) | # define FR_MAIN(argc, argv) FT_NS fr_remap::main(argc, argv) | |||
#endif /* defined(FT_TEST_*) */ | #endif /* defined(FT_TEST_*) */ | |||
int main(int argc, char ** argv) { | int main(int argc, char ** argv) { | |||
return FR_MAIN(argc, argv); | return FR_MAIN(argc, argv); | |||
} | } | |||
End of changes. 12 change blocks. | ||||
35 lines changed or deleted | 180 lines changed or added |