New targets for:
[lwext4.git] / demos / generic / main.c
index ab322d99a65fdb9214020dba9400acb3f4633edf..de0e7f84b1fac3d3ecb6f4bda894edd2eca603c0 100644 (file)
 #include <getopt.h>\r
 #include <stdbool.h>\r
 #include <time.h>\r
+#include <unistd.h>\r
+#include <sys/time.h>\r
 \r
 #include <ext4_filedev.h>\r
 #include <io_raw.h>\r
 #include <ext4.h>\r
 \r
+#ifdef WIN32\r
+#include <windows.h>\r
+#endif\r
+\r
 /**@brief   Input stream name.*/\r
 char input_name[128] = "ext2";\r
 \r
-/**@brief      Read-write size*/\r
+/**@brief   Read-write size*/\r
 static int rw_szie  = 1024 * 1024;\r
 \r
-/**@brief      Read-write size*/\r
+/**@brief   Read-write size*/\r
 static int rw_count = 10;\r
 \r
 /**@brief   Directory test count*/\r
@@ -65,81 +71,88 @@ static bool sbstat = false;
 /**@brief   Indicates that input is windows partition.*/\r
 static bool winpart = false;\r
 \r
-/**@brief      File write buffer*/\r
-static uint8_t *wr_buff;\r
+/**@brief   File write buffer*/\r
+static uint8_t *wr_buff;\r
 \r
-/**@brief      File read buffer.*/\r
-static uint8_t *rd_buff;\r
+/**@brief   File read buffer.*/\r
+static uint8_t *rd_buff;\r
 \r
-/**@brief      Block device handle.*/\r
+/**@brief   Block device handle.*/\r
 static struct ext4_blockdev *bd;\r
 \r
-/**@brief      Block cache handle.*/\r
-static struct ext4_bcache   *bc;\r
-\r
-static const char *usage = "                                                                   \n\\r
-Welcome in ext4 generic demo.                                                                  \n\\r
-Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com) \n\\r
-Usage:                                                                                                                 \n\\r
-    --i   - input file             (default = ext2)                            \n\\r
-    --rws - single R/W size        (default = 1024)                            \n\\r
-    --rwc - R/W count              (default = 10000)                   \n\\r
-    --cache  - 0 static, 1 dynamic  (default = 1)                \n\\r
-    --dirs   - directory test count (default = 0)                \n\\r
-    --clean  - clean up after test                               \n\\r
-    --bstat  - block device stats                                \n\\r
-    --sbstat - superblock stats                                  \n\\r
-    --wpart  - windows partition mode                            \n\\r
+/**@brief   Static cache instance*/\r
+EXT4_BCACHE_STATIC_INSTANCE(_lwext4_cache, CONFIG_BLOCK_DEV_CACHE_SIZE, 1024);\r
+\r
+/**@brief   Block cache handle.*/\r
+static struct ext4_bcache   *bc = &_lwext4_cache;\r
+\r
+static const char *usage = "                                    \n\\r
+Welcome in ext4 generic demo.                                   \n\\r
+Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)  \n\\r
+Usage:                                                          \n\\r
+    --i   - input file              (default = ext2)            \n\\r
+    --rws - single R/W size         (default = 1024 * 1024)     \n\\r
+    --rwc - R/W count               (default = 10)              \n\\r
+    --cache  - 0 static, 1 dynamic  (default = 1)               \n\\r
+    --dirs   - directory test count (default = 0)               \n\\r
+    --clean  - clean up after test                              \n\\r
+    --bstat  - block device stats                               \n\\r
+    --sbstat - superblock stats                                 \n\\r
+    --wpart  - windows partition mode                           \n\\r
 \n";\r
 \r
+\r
+\r
+\r
+\r
 static char* entry_to_str(uint8_t type)\r
 {\r
-       switch(type){\r
-       case EXT4_DIRENTRY_UNKNOWN:\r
-               return "[UNK] ";\r
-       case EXT4_DIRENTRY_REG_FILE:\r
-               return "[FIL] ";\r
-       case EXT4_DIRENTRY_DIR:\r
-               return "[DIR] ";\r
-       case EXT4_DIRENTRY_CHRDEV:\r
-               return "[CHA] ";\r
-       case EXT4_DIRENTRY_BLKDEV:\r
-               return "[BLK] ";\r
-       case EXT4_DIRENTRY_FIFO:\r
-               return "[FIF] ";\r
-       case EXT4_DIRENTRY_SOCK:\r
-               return "[SOC] ";\r
-       case EXT4_DIRENTRY_SYMLINK:\r
-               return "[SYM] ";\r
-       default:\r
-               break;\r
-       }\r
-       return "[???]";\r
+    switch(type){\r
+    case EXT4_DIRENTRY_UNKNOWN:\r
+        return "[UNK] ";\r
+    case EXT4_DIRENTRY_REG_FILE:\r
+        return "[FIL] ";\r
+    case EXT4_DIRENTRY_DIR:\r
+        return "[DIR] ";\r
+    case EXT4_DIRENTRY_CHRDEV:\r
+        return "[CHA] ";\r
+    case EXT4_DIRENTRY_BLKDEV:\r
+        return "[BLK] ";\r
+    case EXT4_DIRENTRY_FIFO:\r
+        return "[FIF] ";\r
+    case EXT4_DIRENTRY_SOCK:\r
+        return "[SOC] ";\r
+    case EXT4_DIRENTRY_SYMLINK:\r
+        return "[SYM] ";\r
+    default:\r
+        break;\r
+    }\r
+    return "[???]";\r
 }\r
 \r
 static void dir_ls(const char *path)\r
 {\r
-       int j = 0;\r
-       char sss[255];\r
-       ext4_dir d;\r
-       ext4_direntry *de;\r
-\r
-       printf("**********************************************\n");\r
-\r
-       ext4_dir_open(&d, path);\r
-       de = ext4_dir_entry_get(&d, j++);\r
-       printf("ls %s\n", path);\r
-\r
-       while(de){\r
-               memcpy(sss, de->name, de->name_length);\r
-               sss[de->name_length] = 0;\r
-               printf("%s", entry_to_str(de->inode_type));\r
-               printf("%s", sss);\r
-               printf("\n");\r
-               de = ext4_dir_entry_get(&d, j++);\r
-       }\r
-       printf("**********************************************\n");\r
-       ext4_dir_close(&d);\r
+    int j = 0;\r
+    char sss[255];\r
+    ext4_dir d;\r
+    ext4_direntry *de;\r
+\r
+    printf("**********************************************\n");\r
+\r
+    ext4_dir_open(&d, path);\r
+    de = ext4_dir_entry_get(&d, j++);\r
+    printf("ls %s\n", path);\r
+\r
+    while(de){\r
+        memcpy(sss, de->name, de->name_length);\r
+        sss[de->name_length] = 0;\r
+        printf("%s", entry_to_str(de->inode_type));\r
+        printf("%s", sss);\r
+        printf("\n");\r
+        de = ext4_dir_entry_get(&d, j++);\r
+    }\r
+    printf("**********************************************\n");\r
+    ext4_dir_close(&d);\r
 }\r
 \r
 static void mp_stats(void)\r
@@ -200,6 +213,13 @@ static void block_stats(void)
     printf("**********************************************\n");\r
 }\r
 \r
+static clock_t get_ms(void)\r
+{\r
+    struct timeval t;\r
+    gettimeofday(&t, NULL);\r
+    return (t.tv_sec * 1000) + (t.tv_usec / 1000);\r
+}\r
+\r
 static bool dir_test(int len)\r
 {\r
     ext4_file f;\r
@@ -209,7 +229,7 @@ static bool dir_test(int len)
     clock_t diff;\r
     clock_t stop;\r
     clock_t start;\r
-    start = clock() / (CLOCKS_PER_SEC / 1000);\r
+    start = get_ms();\r
 \r
     printf("Directory create: /mp/dir1\n");\r
     r = ext4_dir_mk("/mp/dir1");\r
@@ -219,6 +239,7 @@ static bool dir_test(int len)
     }\r
 \r
 \r
+    ext4_cache_write_back("/mp/", 1);\r
     printf("Add files to: /mp/dir1\n");\r
     for (i = 0; i < len; ++i) {\r
         sprintf(path, "/mp/dir1/f%d", i);\r
@@ -228,8 +249,9 @@ static bool dir_test(int len)
             return false;\r
         }\r
     }\r
+    ext4_cache_write_back("/mp/", 0);\r
 \r
-    stop = clock() / (CLOCKS_PER_SEC / 1000);\r
+    stop =  get_ms();\r
     diff = stop - start;\r
     dir_ls("/mp/dir1");\r
     printf("dir_test time: %d ms\n", (int)diff);\r
@@ -256,7 +278,7 @@ static bool file_test(void)
 \r
     printf("ext4_fopen: test1\n");\r
 \r
-    start = clock() / (CLOCKS_PER_SEC / 1000);\r
+    start = get_ms();\r
     r = ext4_fopen(&f, "/mp/test1", "wb");\r
     if(r != EOK){\r
         printf("ext4_fopen ERROR = %d\n", r);\r
@@ -280,7 +302,7 @@ static bool file_test(void)
     }\r
 \r
     printf("OK\n");\r
-    stop = clock() / (CLOCKS_PER_SEC / 1000);\r
+    stop = get_ms();\r
     diff = stop - start;\r
     size_bytes = rw_szie * rw_count;\r
     size_bytes = (size_bytes * 1000) / 1024;\r
@@ -291,7 +313,7 @@ static bool file_test(void)
     printf("ext4_fopen: test1\n");\r
 \r
 \r
-    start = clock() / (CLOCKS_PER_SEC / 1000);\r
+    start = get_ms();\r
     r = ext4_fopen(&f, "/mp/test1", "r+");\r
     if(r != EOK){\r
         printf("ext4_fopen ERROR = %d\n", r);\r
@@ -316,7 +338,7 @@ static bool file_test(void)
         return false;\r
     }\r
     printf("OK\n");\r
-    stop = clock() / (CLOCKS_PER_SEC / 1000);\r
+    stop = get_ms();\r
     diff = stop - start;\r
     size_bytes = rw_szie * rw_count;\r
     size_bytes = (size_bytes * 1000) / 1024;\r
@@ -337,17 +359,17 @@ static void cleanup(void)
     ext4_fremove("/mp/hello.txt");\r
 \r
     printf("cleanup: remove /mp/test1\n");\r
-    start = clock() / (CLOCKS_PER_SEC / 1000);\r
+    start = get_ms();\r
     ext4_fremove("/mp/test1");\r
-    stop = clock() / (CLOCKS_PER_SEC / 1000);\r
+    stop = get_ms();\r
     diff = stop - start;\r
     printf("cleanup: time: %d ms\n", (int)diff);\r
 \r
 \r
-    printf("cleanup: remove /mp/test1\n");\r
-    start = clock() / (CLOCKS_PER_SEC / 1000);\r
+    printf("cleanup: remove /mp/dir1\n");\r
+    start =get_ms();\r
     ext4_dir_rm("/mp/dir1");\r
-    stop = clock() / (CLOCKS_PER_SEC / 1000);\r
+    stop = get_ms();\r
     diff = stop - start;\r
     printf("cleanup: time: %d ms\n", (int)diff);\r
 }\r
@@ -356,8 +378,7 @@ static bool open_filedev(void)
 {\r
     ext4_filedev_filename(input_name);\r
     bd = ext4_filedev_get();\r
-    bc = ext4_filecache_get();\r
-    if(!bd || !bc){\r
+    if(!bd){\r
         printf("Block device ERROR\n");\r
         return false;\r
     }\r
@@ -369,14 +390,13 @@ static bool open_winpartition(void)
 #ifdef WIN32\r
     ext4_io_raw_filename(input_name);\r
     bd = ext4_io_raw_dev_get();\r
-    bc = ext4_io_raw_cache_get();\r
-    if(!bd || !bc){\r
+    if(!bd){\r
         printf("Block device ERROR\n");\r
         return false;\r
     }\r
     return true;\r
 #else\r
-    printf("open_winpartition: this mode shouls be used only under windows !\n");\r
+    printf("open_winpartition: this mode should be used only under windows !\n");\r
     return false;\r
 #endif\r
 }\r
@@ -385,8 +405,8 @@ static bool mount(void)
 {\r
     int r;\r
     if(winpart){\r
-         if(!open_winpartition())\r
-             return false;\r
+        if(!open_winpartition())\r
+            return false;\r
     }else{\r
         if(!open_filedev())\r
             return false;\r
@@ -433,52 +453,52 @@ static bool parse_opt(int argc, char **argv)
     int c;\r
 \r
     static struct option long_options[] =\r
-      {\r
-        {"in",      required_argument, 0, 'a'},\r
-        {"rws",     required_argument, 0, 'b'},\r
-        {"rwc",     required_argument, 0, 'c'},\r
-        {"cache",   required_argument, 0, 'd'},\r
-        {"dirs",    required_argument, 0, 'e'},\r
-        {"clean",   no_argument,       0, 'f'},\r
-        {"bstat",   no_argument,       0, 'g'},\r
-        {"sbstat",  no_argument,       0, 'h'},\r
-        {"wpart",   no_argument,       0, 'i'},\r
-        {0, 0, 0, 0}\r
-      };\r
+    {\r
+            {"in",      required_argument, 0, 'a'},\r
+            {"rws",     required_argument, 0, 'b'},\r
+            {"rwc",     required_argument, 0, 'c'},\r
+            {"cache",   required_argument, 0, 'd'},\r
+            {"dirs",    required_argument, 0, 'e'},\r
+            {"clean",   no_argument,       0, 'f'},\r
+            {"bstat",   no_argument,       0, 'g'},\r
+            {"sbstat",  no_argument,       0, 'h'},\r
+            {"wpart",   no_argument,       0, 'i'},\r
+            {0, 0, 0, 0}\r
+    };\r
 \r
     while(-1 != (c = getopt_long (argc, argv, "a:b:c:d:e:fghi", long_options, &option_index))) {\r
 \r
         switch(c){\r
-            case 'a':\r
-                strcpy(input_name, optarg);\r
-                break;\r
-            case 'b':\r
-                rw_szie = atoi(optarg);\r
-                break;\r
-            case 'c':\r
-                rw_count = atoi(optarg);\r
-                break;\r
-            case 'd':\r
-                cache_mode = atoi(optarg);\r
-                break;\r
-            case 'e':\r
-                dir_cnt = atoi(optarg);\r
-                break;\r
-            case 'f':\r
-                cleanup_flag = true;\r
-                break;\r
-            case 'g':\r
-                bstat = true;\r
-                break;\r
-            case 'h':\r
-                sbstat = true;\r
-                break;\r
-            case 'i':\r
-                winpart = true;\r
-                break;\r
-            default:\r
-                printf(usage);\r
-                return false;\r
+        case 'a':\r
+            strcpy(input_name, optarg);\r
+            break;\r
+        case 'b':\r
+            rw_szie = atoi(optarg);\r
+            break;\r
+        case 'c':\r
+            rw_count = atoi(optarg);\r
+            break;\r
+        case 'd':\r
+            cache_mode = atoi(optarg);\r
+            break;\r
+        case 'e':\r
+            dir_cnt = atoi(optarg);\r
+            break;\r
+        case 'f':\r
+            cleanup_flag = true;\r
+            break;\r
+        case 'g':\r
+            bstat = true;\r
+            break;\r
+        case 'h':\r
+            sbstat = true;\r
+            break;\r
+        case 'i':\r
+            winpart = true;\r
+            break;\r
+        default:\r
+            printf("%s", usage);\r
+            return false;\r
 \r
         }\r
     }\r
@@ -508,20 +528,20 @@ int main(int argc, char **argv)
     dir_ls("/mp/");\r
     fflush(stdout);\r
     if(!dir_test(dir_cnt))\r
-           return EXIT_FAILURE;\r
+        return EXIT_FAILURE;\r
 \r
     fflush(stdout);\r
-       if(!file_test())\r
-           return EXIT_FAILURE;\r
+    if(!file_test())\r
+        return EXIT_FAILURE;\r
 \r
-       fflush(stdout);\r
-       dir_ls("/mp/");\r
+    fflush(stdout);\r
+    dir_ls("/mp/");\r
 \r
-       if(sbstat)\r
-           mp_stats();\r
+    if(sbstat)\r
+        mp_stats();\r
 \r
-       if(cleanup_flag)\r
-           cleanup();\r
+    if(cleanup_flag)\r
+        cleanup();\r
 \r
     if(bstat)\r
         block_stats();\r