main(int argc, char *argv[]) #endif { int err, nargc, i, ret = 0; char *pargv[32] = {0}, *dbg_env; pthread_t sigtid; #ifdef COMMON_INIT vpu_versioninfo ver; #endif int ret_thr; #ifndef COMMON_INIT srand((unsigned)time(0)); /* init seed of rand() */ #endif dbg_env=getenv("VPU_TEST_DBG"); if (dbg_env) vpu_test_dbg_level = atoi(dbg_env); else vpu_test_dbg_level = 0; err = parse_main_args(argc, argv); if (err) { goto usage; } if (!instance) { goto usage; } info_msg("VPU test program built on %s %s\n", __DATE__, __TIME__); #ifndef _FSL_VTS_ sigemptyset(&sigset); sigaddset(&sigset, SIGINT); pthread_sigmask(SIG_BLOCK, &sigset, NULL); pthread_create(&sigtid, NULL, (void *)&signal_thread, NULL); #endif #ifdef COMMON_INIT err = vpu_Init(NULL); if (err) { err_msg("VPU Init Failure.\n"); return -1; } err = vpu_GetVersionInfo(&ver); if (err) { err_msg("Cannot get version info, err:%d\n", err); vpu_UnInit(); return -1; } info_msg("VPU firmware version: %d.%d.%d_r%d\n", ver.fw_major, ver.fw_minor, ver.fw_release, ver.fw_code); info_msg("VPU library version: %d.%d.%d\n", ver.lib_major, ver.lib_minor, ver.lib_release); #else // just to enable cpu_is_xx() to be used in command line parsing err = vpu_Init(NULL); if (err) { err_msg("VPU Init Failure.\n"); return -1; } vpu_UnInit(); #endif if (instance > 1) { for (i = 0; i < instance; i++) { #ifndef COMMON_INIT /* sleep roughly a frame interval to test multi-thread race especially vpu_Init/vpu_UnInit */ usleep((int)(rand()%ONE_FRAME_INTERV)); #endif if (using_config_file == 0) { get_arg(input_arg[i].line, &nargc, pargv); err = parse_args(nargc, pargv, i); if (err) { vpu_UnInit(); goto usage; } } if (check_params(&input_arg[i].cmd, input_arg[i].mode) == 0) { if (open_files(&input_arg[i].cmd) == 0) { if (input_arg[i].mode == DECODE) { pthread_create(&input_arg[i].tid, NULL, (void *)&decode_test, (void *)&input_arg[i].cmd); } else if (input_arg[i].mode == ENCODE) { pthread_create(&input_arg[i].tid, NULL, (void *)&encode_test, (void *)&input_arg[i].cmd); } } } } } else { if (using_config_file == 0) { get_arg(input_arg[0].line, &nargc, pargv); err = parse_args(nargc, pargv, 0); if (err) { vpu_UnInit(); goto usage; } } if (check_params(&input_arg[0].cmd, input_arg[0].mode) == 0) { if (open_files(&input_arg[0].cmd) == 0) { if (input_arg[0].mode == DECODE) { ret = decode_test(&input_arg[0].cmd); } else if (input_arg[0].mode == ENCODE) { ret = encode_test(&input_arg[0].cmd); } else if (input_arg[0].mode == TRANSCODE) { ret = transcode_test(&input_arg[0].cmd); } close_files(&input_arg[0].cmd); } else { ret = -1; } } else { ret = -1; } if (input_arg[0].mode == LOOPBACK) { encdec_test(&input_arg[0].cmd); } } if (instance > 1) { for (i = 0; i < instance; i++) { if (input_arg[i].tid != 0) { pthread_join(input_arg[i].tid, (void *)&ret_thr); if (ret_thr) ret = -1; close_files(&input_arg[i].cmd); } } } #ifdef COMMON_INIT vpu_UnInit(); #endif return ret; usage: info_msg("\n%s", usage); return -1; }
int main(int argc, char **argv) { char *fnct_name = "main"; pthread_attr_t thrd_attr; int counter; int ret; set_init_gbl_params(); if (parse_main_args(argc, argv) != 0) { ERR(gbl.init_dbg, "Unable to parse arguments"); return -1; } gbl.ini_file_ptr = fopen(gbl.ini_file_path, "r"); if (gbl.ini_file_ptr == NULL) { ERR(gbl.init_dbg, "Unable to open INI file [%s]", gbl.ini_file_path); return -1; } if (parse_ini_file() != 0) { ERR(gbl.init_dbg, "Unable to parse INI file [%s]", gbl.ini_file_path); goto QUIT_CLEANUP; } OK(gbl.init_dbg, "parse_ini_file done OK"); if (init_mb_links() != retOK) { ERR(gbl.init_dbg, "init_mb_links failed"); goto QUIT_CLEANUP; } OK(gbl.init_dbg, "init_gbl.mb_link done OK"); if (init_mb_tx() != retOK) { ERR(gbl.init_dbg, "init_mb_tx failed"); goto QUIT_CLEANUP; } OK(gbl.init_dbg, "init_gbl.mb_tx done OK"); gbl.hal_mod_id = hal_init(gbl.hal_mod_name); if (gbl.hal_mod_id < 0) { ERR(gbl.init_dbg, "Unable to initialize HAL component [%s]", gbl.hal_mod_name); goto QUIT_CLEANUP; } if (create_HAL_pins() != retOK) { ERR(gbl.init_dbg, "Unable to create HAL pins"); goto QUIT_CLEANUP; } hal_ready(gbl.hal_mod_id); OK(gbl.init_dbg, "HAL components created OK"); gbl.quit_flag = 0; //tell the threads to quit (SIGTERM o SIGQUIT) (unloadusr mb2hal). signal(SIGINT, quit_signal); //unloadusr and unload commands of halrun signal(SIGTERM, quit_signal); /* Each link has it's own thread */ pthread_attr_init(&thrd_attr); pthread_attr_setdetachstate(&thrd_attr, PTHREAD_CREATE_DETACHED); for (counter = 0; counter < gbl.tot_mb_links; counter++) { ret = pthread_create(&gbl.mb_links[counter].thrd, &thrd_attr, link_loop_and_logic, (void *) &gbl.mb_links[counter].mb_link_num); if (ret != 0) { ERR(gbl.init_dbg, "Unable to start thread for link number %d", counter); } OK(gbl.init_dbg, "Link thread loop and logic %d created OK", counter); } OK(gbl.init_dbg, "%s is running", gbl.hal_mod_name); while (gbl.quit_flag == 0) { sleep(1); } QUIT_CLEANUP: quit_cleanup(); OK(gbl.init_dbg, "going to exit!"); return 0; }