Ejemplo n.º 1
0
int main(int argc, char **argv) {
	int maxjobs = -1;
	int curjobs = 0;
	double maxload = -1;
	int argsatonce = 1;
	int opt;
	char **command = calloc(sizeof(char*), argc);
	char **arguments = NULL;
	int argidx = 0;
	int arglen = 0;
	int cidx = 0;
	int returncode = 0;
	int replace_cb = 0;
	int stdout_fd = 1;
	int stderr_fd = 2;
	char *t;

	while ((argv[optind] && strcmp(argv[optind], "--") != 0) &&
	       (opt = getopt(argc, argv, "+hij:l:n:")) != -1) {
		switch (opt) {
		case 'h':
			usage();
			break;
		case 'i':
			replace_cb = 1;
			break;
		case 'j':
			errno = 0;
			maxjobs = strtoul(optarg, &t, 0);
			if (errno != 0 || (t-optarg) != strlen(optarg)) {
				fprintf(stderr, "option '%s' is not a number\n",
					optarg);
				exit(2);
			}
			break;
		case 'l':
			errno = 0;
			maxload = strtod(optarg, &t);
			if (errno != 0 || (t-optarg) != strlen(optarg)) {
				fprintf(stderr, "option '%s' is not a number\n",
					optarg);
				exit(2);
			}
			break;
		case 'n':
			errno = 0;
			argsatonce = strtoul(optarg, &t, 0);
			if (errno != 0 || argsatonce < 1 || (t-optarg) != strlen(optarg)) {
				fprintf(stderr, "option '%s' is not a positive number\n",
					optarg);
				exit(2);
			}
			break;
		default: /* ’?’ */
			usage();
			break;
		}
	}
	
	if (replace_cb && argsatonce > 1) {
		fprintf(stderr, "options -i and -n are incomaptible\n");
		exit(2);
	}

	if (maxjobs < 0) {
#ifdef _SC_NPROCESSORS_ONLN
		maxjobs = sysconf(_SC_NPROCESSORS_ONLN);
#else
#warning Cannot autodetect number of CPUS on this system: _SC_NPROCESSORS_ONLN not defined.
		maxjobs = 1;
#endif
	}
	
	while (optind < argc) {
		if (strcmp(argv[optind], "--") == 0) {
			int i;

			optind++;
			arglen = argc - optind;
			arguments = calloc(sizeof(char *), arglen);
			if (! arguments) {
				exit(1);
			}

			for (i = 0; i < arglen; i++) {
				arguments[i] = strdup(argv[optind + i]);
			}
			optind += i;
		}
		else {
			command[cidx] = strdup(argv[optind]);
			cidx++;
		}
		optind++;
	}

	if (argsatonce > 1 && ! command[0]) {
		fprintf(stderr, "option -n cannot be used without a command\n");
		exit(2);
	}

	pipe_child_stdout = create_pipe_child(&stdout_fd, 1);
	pipe_child_stderr = create_pipe_child(&stderr_fd, 2);

	if ((pipe_child_stdout < 0) || (pipe_child_stderr < 0))
		exit(1);

	while (argidx < arglen) {
		double load;

		getloadavg(&load, 1);

		if ((maxjobs == 0 || curjobs < maxjobs) &&
		    (maxload < 0 || load < maxload)) {

			if (argsatonce > arglen - argidx)
				argsatonce = arglen - argidx;
			exec_child(command, arguments + argidx,
				   replace_cb, argsatonce, stdout_fd,
				   stderr_fd);
			argidx += argsatonce;
			curjobs++;
		}
		
		if (maxjobs == 0 || curjobs == maxjobs) {
			returncode |= wait_for_child(0);
			curjobs--;
		}

		if (maxload > 0 && load >= maxload) {
			int r;
			sleep(1); /* XXX We should have a better
				   * heurestic than this */
			r = wait_for_child(WNOHANG);
			if (r > 0)
				returncode |= r;
			if (r != -1)
				curjobs--;
		}
	}
	while (curjobs > 0) {
		returncode |= wait_for_child(0);
		curjobs--;
	}

	if (pipe_child_stdout) {
		kill(pipe_child_stdout, SIGKILL);
		wait_for_child(0);
	}
	if (pipe_child_stderr) {
		kill(pipe_child_stderr, SIGKILL);
		wait_for_child(0);
	}

	return returncode;
}
Ejemplo n.º 2
0
extern	"C" void	internal_thread_loop_extern_run()
{
	pthread_mutex_lock(&g_daemon_mutex);
#if 0
	int child_pid = waitpid(-1, (int*)0, WNOHANG);
	if (child_pid > 0)
	{
		if(child_pid == g_tvrecv_pid)
		{
			LOGE("%s tvrecv exit pid:%d\n", __FUNCTION__, child_pid);
			//erase_child_pid(child_pid);
			//g_tvrecv_pid = 0;
		}
		else if(child_pid == g_tvplay_pid)
		{
			LOGE("%s tvplay exit pid:%d\n", __FUNCTION__, child_pid);
			//erase_child_pid(child_pid);
			//g_tvplay_pid = 0;
		}
	}
#endif

#if 0
	if((g_tvrecv_pid > 0 || g_tvplay_pid > 0) && (g_tvrecv_pid <= 0 || g_tvplay_pid <= 0))
	{
		if (e_playing == g_play_statu)
		{
			LOGE("%s line:%d g_tvrecv_pid:%d g_tvplay_pid:%d\n", __FUNCTION__, __LINE__, g_tvrecv_pid, g_tvplay_pid);
			pthread_mutex_unlock(&g_daemon_mutex);
			stop_tvcore();//放在后面,因为内部有锁,避免死锁。
			return;
		}

		pthread_mutex_unlock(&g_daemon_mutex);
		return;
	}

	if (e_stoping == g_play_statu
			&& g_tvplay_pid <= 0 && g_tvrecv_pid <= 0)
	{
		g_play_statu = e_stop;
	}
#endif

	if (e_stop != g_play_statu){
		pthread_mutex_unlock(&g_daemon_mutex);
		return;
	}

	/*
	if (mkfifo("/data/test/fifo1", S_IFIFO | 0666) == -1)
	{
		log_printf("mk fifo1 faile errno:%d\n", errno);
	}
	
	if (mkfifo("/data/test/fifo2", S_IFIFO | 0666) == -1)
	{
		log_printf("mk fifo2 faile errno:%d\n", errno);
	}
	*/
	
	//create_pipe_child((char*)"/data/test/tvplay", g_tvplay_pid
	//								, child_tvplay_packet_arrive, erase_pid_child_tvplay, 0);
	int	argc = 0;
	char argv_arg[12][128];
	char argv_value[12][32];
    memset(argv_arg, 0, sizeof(argv_arg));
	memset(argv_value, 0, sizeof(argv_value));

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "demuxer");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%s", "+mpegts");
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "vc");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%s", "android");
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "%s", "/data/lnt/fifo1");
	argc++;

    create_pipe_child((char*)"/data/lnt/tvplay2", g_tvplay_pid
									, child_tvplay_packet_arrive, erase_pid_child_tvplay
								    , 5
									, argv_arg[0], argv_value[0]
									, argv_arg[1], argv_value[1]
                                    , argv_arg[2]);
		

    argc = 0;

	memset(argv_arg, 0, sizeof(argv_arg));
	memset(argv_value, 0, sizeof(argv_value));

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "freqency");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_freqency);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "modulation");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_modulation);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "symboRate");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_symboRate);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "org_net_id");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_org_net_id);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "net_id");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_net_id);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "pmtPid");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_pmtPid);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "videoPid");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_videoPid);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "audioPid");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_audioPid);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "pcrPid");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_pcrPid);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "serviceId");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_serviceId);
	argc++;

	snprintf(argv_arg[argc], sizeof(argv_arg[0]) - 1, "-%s", "tsId");
	snprintf(argv_value[argc], sizeof(argv_value[0]) - 1, "%d", g_tsId);
	argc++;

//	static int g_freqency = 0;
//	static int g_modulation = 0;
//	static int g_symboRate = 0;
//	static int g_pmtPid = 0;
//	static int g_videoPid = 0;
//	static int g_audioPid = 0;
//	static int g_pcrPid = 0;
//	static int g_serviceId = 0;
//	static int g_tsId = 0;
	create_pipe_child((char*)"/data/lnt/tvrecv", g_tvrecv_pid
									, child_tvrecv_packet_arrive, erase_pid_child_tvrecv
									, argc * 2
									, argv_arg[0], argv_value[0]
									, argv_arg[1], argv_value[1]
									, argv_arg[2], argv_value[2]
									, argv_arg[3], argv_value[3]
									, argv_arg[4], argv_value[4]
									, argv_arg[5], argv_value[5]
									, argv_arg[6], argv_value[6]
									, argv_arg[7], argv_value[7]
									, argv_arg[8], argv_value[8]
									, argv_arg[9], argv_value[9]
									, argv_arg[10], argv_value[10]);

	if (g_tvplay_pid > 0 || g_tvrecv_pid > 0)
	{
		LOGE("%s line:%d g_tvrecv_pid:%d g_tvplay_pid:%d\n", __FUNCTION__, __LINE__, g_tvrecv_pid, g_tvplay_pid);
		g_play_statu = e_playing;
	}

	pthread_mutex_unlock(&g_daemon_mutex);
	
//	set_tvpos();
//	set_tvsize();
//	set_tvchannel();
}