/* blocks until scan is finished, even if scan is multi-threaded */ void a6o_on_demand_run(struct a6o_on_demand *on_demand) { struct os_file_stat stat_buf; int stat_errno; a6o_log(ARMADITO_LOG_LIB, ARMADITO_LOG_LEVEL_INFO, "starting %sthreaded scan of %s", on_demand->flags & ARMADITO_SCAN_THREADED ? "" : "non-", on_demand->root_path); /* create the thread pool now */ if (on_demand->flags & ARMADITO_SCAN_THREADED) on_demand->thread_pool = g_thread_pool_new(scan_entry_thread_fun, on_demand, get_max_threads(), FALSE, NULL); /* what is scan root_path? a file or a directory? */ os_file_stat(on_demand->root_path, &stat_buf, &stat_errno); /* it is a file, scan it, in a thread if scan is threaded */ /* otherwise, walk through the directory and apply 'scan_entry' function to each entry (either file or directory) */ if (stat_buf.flags & FILE_FLAG_IS_PLAIN_FILE) { on_demand->scan->to_scan_count = 1; if (on_demand->flags & ARMADITO_SCAN_THREADED) g_thread_pool_push(on_demand->thread_pool, (gpointer)os_strdup(on_demand->root_path), NULL); else scan_file(on_demand, on_demand->root_path); } else if (stat_buf.flags & FILE_FLAG_IS_DIRECTORY) { int recurse = on_demand->flags & ARMADITO_SCAN_RECURSE; count_to_scan(on_demand); os_dir_map(on_demand->root_path, recurse, scan_entry, on_demand); } /* if threaded, free the thread_pool */ /* this has a side effect to wait for completion of *all* the scans queue'd in the thread pool */ if (on_demand->flags & ARMADITO_SCAN_THREADED) g_thread_pool_free(on_demand->thread_pool, FALSE, TRUE); /* send the final progress (100%) */ final_progress(on_demand->scan); if (on_demand->count_thread != NULL) g_thread_join(on_demand->count_thread); }
int CVmNetFile::get_file_stat(VMG_ os_file_stat_t *stat, int follow_links) { return os_file_stat(lclfname, follow_links, stat); }