コード例 #1
0
size_t Scheduler::add_timer(uint64 timeout,
                            Timer_Proc proc,
                            void* arg)
{
    Auto_Mutex auto_lock(_lock);

    // Create new timer:

    Timer* timer = new Timer;
    timer->id = _id_pool.get();
    timer->deadline = Time::now() + timeout;
    timer->proc = proc;
    timer->arg = arg;

    // Insert timer into list:

    _insert_timer(_list, timer);

    if (_auto_dispatch && !_dispatcher_thread_running)
        start_dispatcher();

    return timer->id;
}
コード例 #2
0
PROXY_API __bool PMC_API init_proxy(HWND hWnd, __uint flags)
{
	char * szWarning = "没有找到软件狗,进入演示状态,数据库最大规模32点";

	if(!_g_InitLock){
		_g_InitLock = new CLock;
	}
	
	g_InitLock.Lock();
	if(g_iInitCount){
		g_iInitCount++;
		g_InitLock.UnLock();
		return __true;
	}

	g_iInitCount++;

	g_iInitFlag = flags;
	
	_load_settings(__false);
	
	g_DBDispatchTable.OnAddNode = _on_add_node;
	g_DBDispatchTable.OnDropNode = _on_del_node;
	hook_rtdb_events(&g_DBDispatchTable);
	
	if(!(g_iInitFlag & PROXY_INIT_AS_SERVER)){
		unsigned char run, dev;
		int runLevel, devLevel;
		init_key();
		get_key(&run, &runLevel, &dev, &devLevel);
		if(!dev){
			/* no dog is attached*/
			/* create_group(0x12345678,xxx) is a loophole */
			create_group((RTK_CURSOR)0x12345678, (PRTK_GROUP)32);
			if(!(flags & PROXY_SILENT)){
				MessageBox(
					hWnd,
					szWarning,
					"PMC Error",
					MB_OK
					);
			}
		}else{
			/* yes, dog is attached, set database limit */
			create_group((RTK_CURSOR)0x12345678, (PRTK_GROUP)devLevel);
		}
	}
	init_powermgr();
	init_network(0);
	init_rtdb();
	connect_vbus(BUSID_RTDB, 0, _on_rtdb, default_client_filter);
	connect_vbus(BUSID_CONFIG, 0, _on_config, default_client_filter);
	connect_vbus(BUSID_ALARM, 0, _on_alarm, default_client_filter);
	connect_vbus(BUSID_SYSTEM, 0, _on_system, default_client_filter);
	connect_vbus(BUSID_OPERATION, 0, 0, default_client_filter);
	if(flags & PROXY_ENABLE_DISPATCHER){
		start_dispatcher();
	}	

	g_Worker = new CProxyWorker(flags);
	if(!g_Worker){
		g_InitLock.UnLock();
		return __false;		
	}
	g_Worker->start();

#if defined(_WIN32) && 1
	SetThreadPriority(g_Worker->handle(), THREAD_PRIORITY_BELOW_NORMAL);
#endif
		
	g_InitLock.UnLock();
	return __true;
}
コード例 #3
0
int start_simulation(void)
{
    cl_device_id *dev;
	cl_uint devc;
    cl_context context;
    cl_command_queue *cmd_queue;
    cl_mem src, dst, wdth, hght, *offy;
    cl_int err;
    cl_kernel kern;
    cl_program prog;
	cl_platform_id pform;
    size_t rows, columns, runs, print_each = 0, offsetx, offsety, *y, swapoffy;
	int gui_enabled, platform, device;
    unsigned int *buff0;
    unsigned int i;
	struct dispatcher_context *c;
	int random;
	char fname[1024];
	cl_uint cqc;
    
#if 1
    
	do
	{
		printf("Width: ");
		scanf(SZTF, &columns);
        
		if (columns % 32)
		{
			printf("Width must be a multiple of 32\n");
			continue;
		}
        
		if (columns == 0)
		{
			printf("Width must be > 0\n");
			continue;
		}
        
		break;
	}
	while (true);
    
	do
	{
		printf("Height: ");
		scanf(SZTF, &rows);
        
		if (rows == 0)
		{
			printf("Width must be > 0\n");
			continue;
		}
        
		break;
	}
	while (true);
    
    printf("Runs: ");
    scanf(SZTF, &runs);
    
	printf("Random? ");
	scanf("%d", &random);
    
	if (!random)
	{
		printf("File name: ");
		scanf("%s", fname);
        
		printf("Offset X: ");
		scanf(SZTF, &offsetx);
        
		printf("Offset Y: ");
		scanf(SZTF, &offsety);
	}
    
	printf("GUI? ");
	scanf("%d", &gui_enabled);
    
	if (!gui_enabled)
	{
		printf("Print after run: ");
		scanf(SZTF, &print_each);
	}
    
	printf("Platform index: ");
	scanf("%d", &platform);
    
	printf("Device index (-1 for all): ");
	scanf("%d", &device);
    
	do
	{
		printf("Swap offset: ");
		scanf(SZTF, &swapoffy);
        
		if (swapoffy == 0) swapoffy = rows;
        
		if (rows % swapoffy != 0)
		{
			printf("Swap offset must be a factor of the row count\n");
			continue;
		}
        
		break;
	}
	while (true);
#else
    columns = 512;
    rows = 512;
    runs = 1000;
	gui_enabled = 1;
    print_each = 0;
	random = 1;
    offsetx = 0;
    offsety = 0;
	platform = 0;
	device = 0;
	swapoffy = rows;
#endif
    
    err = get_devices(&dev, &devc, &pform, platform, device);
    if (err)
        return err;
    
    err = initialize_context_cmd_queue(dev, devc, pform, &context, &cmd_queue, &cqc);
    if (err)
        return err;
    
    err = load_kernel(context, dev, devc, &prog, &kern);
    if (err)
        return err;
    
    buff0 = (unsigned int*)malloc(rows * (columns / 8));
    if (!buff0)
        return -1;
    
	if (random)
	{
		srand((unsigned int)time(NULL));
		for (i = 0; i < (rows * (columns / 8)) / 4; i++)
		{
		    buff0[i] = rand() | (rand() << 16);
		}
	}
	else
	{
		memset(buff0, 0, rows * (columns / 8));
		if (!load_file_to_buffer(buff0, fname, offsetx, offsety, columns, rows))
			return -1;
	}
    
	err = compute_buffer_sizes(context, cmd_queue, cqc, kern, columns, rows, swapoffy, &y);
	if (err)
		return err;
    
    err = create_buffers(context, swapoffy * (columns / 8), columns, 
		swapoffy, &src, &dst, &wdth, &hght, &offy, y, buff0, devc);
    if (err)
        return err;
    
	if (gui_enabled)
	{
		if (!initialize_window())
			return -1;
	}
    
	c = (struct dispatcher_context *)malloc(sizeof(*c));
	if (!c)
		return -1;
    
	c->cmd_queue = cmd_queue;
	c->cqc = cqc;
	c->kern = kern;
	c->columns = columns;
	c->rows = rows;
	c->print_each = print_each;
	c->runs = runs;
	c->gui_enabled = gui_enabled;
	c->buff0 = buff0;
	c->src = src;
	c->dst = dst;
	c->wdth = wdth;
	c->hght = hght;
	c->offy = offy;
	c->y = y;
	c->swapoffy = swapoffy;
	c->context = context;
    c->win_height = rows;
    
	return start_dispatcher(c);
}
コード例 #4
0
/*Questo è il main del processo principale, WATOR.
 * 1- Controllo di esistenza file
 * 2- Predispone i thread per la gestione corretta dei segnali
 * 3- Avvia i thread
 * 4- Aspetta che terminano il lavoro
 * */
int main (int argc, char *argv[]) {
    int n_tentativo;
    wat_proc_conf* x;
    /*Inizializzazione*/
    root_thread = pthread_self();
    /*Inizializza variabili globali di gestione dei segnali*/
    close_all = 0;
    sig_sigusr1 = 0;
    puoi_stampare = 0;
    count_worker = 0;
    puoi_procedere = 1;
    n_tentativo = 0;
    pthread_mutex_init(&set_critica, NULL);
    pthread_mutex_init(&set_skip, NULL);
    pthread_mutex_init(&lista_mux, NULL);
    pthread_mutex_init(&stampa_mux, NULL);
    pthread_cond_init(&lista_vuota, NULL);
    pthread_cond_init(&stanno_lavorando, NULL);
    pthread_cond_init(&stampa_pronta, NULL);
    pthread_cond_init(&stampa_effettuata, NULL);

    if ( mkdir("./tmp", S_IRWXU) ) {
        if(errno != EEXIST)
            perror("Errore Creazione Directory");
    }
    /*Rimuovo la socket se esiste, cioè se una precedente esecuzione è stata terminata male*/
    system("rm -f ./tmp/*");

    if( file_exist(SOCKNAME) ) {
        printf("Il file socket vecchio esiste ancora\n");
        if( remove(SOCKNAME) ) {
            perror("Non è stato possibile cancellare la vecchia socket");
            return 1;
        }
    }
    /*Gestione dei segnali
    * Vengono mascherati i segnali tipici di questo programma, cioè
    * SIGINT, SIGTERM e SIGUSR1
    * L'idea è quella di mascherare i segnali a tutti i thread tranne che
    * al gestore dei segnali, che si preoccuperà di gestire tutto.
    */
    sa.sa_handler=SIG_IGN;
    sigemptyset(&sa.sa_mask);
    sigaddset(&sa.sa_mask, SIGINT);
    sigaddset(&sa.sa_mask, SIGUSR2);
    sigaddset(&sa.sa_mask, SIGTERM);
    sigaddset(&sa.sa_mask, SIGUSR1);
    /*Applico maschera a questo thread. La maschera poi viene ereditata dai figli*/
    pthread_sigmask(SIG_BLOCK, &sa.sa_mask, NULL);
    /*Fine Gestione dei segnali*/

    /*Carico gli argomenti passati al programma*/
    x = valutazione_argomenti(argc, argv, NWORK_DEF, CHRON_DEF);
    if(x == NULL) {
        return 1;
    }

    /*Carico il nuovo pianeta*/
    if(!file_exist(x->file)) {
        errno = ENOENT;
        perror("File planet");
        return 1;
    }
    simulazione = new_wator(x->file);
    if(simulazione == NULL) {
        perror("Errore creazione nuova simulazione");
        return 1;
    }

    /*Se non sono stati passati argomenti, assegno quelli di default*/
    if( ( simulazione -> nwork = x->nwork ) == 0)
        simulazione -> nwork = NWORK_DEF;
    if( ( simulazione -> chronon = x->chron ) == 0)
        simulazione -> chronon = CHRON_DEF;
    if( x->dumpfile == NULL ) {
        strcpy(dumpfile,"stdout");
    }
    else {
        strcpy(dumpfile,x->dumpfile);
    }
    intervallo_di_stampa = (x->chron) ? x->chron : CHRON_DEF;

    free(x->file);
    free(x->dumpfile);
    free(x);

    /*Creo divisione della matrici per far lavorare i thread, funzione delegata dal dispatcher*/
    lista = split_matrice(simulazione->plan);
    /*Avvio Gestore Segnali*/
    n_tentativo=0;
    while( start_gestore_segnali() ) {
        if(n_tentativo < MAX_TRY) {
            sleep(my_exp2(n_tentativo));
            n_tentativo++;
        }
        else {
            perror("Errore creazione Thread Gestore Segnali");
            return 1;
        }
    }

    /*Avvio n worker*/
    n_tentativo=0;
    while ( (worker_thr_ids = start_nworker(simulazione->nwork)) == NULL ) {
        if(n_tentativo < MAX_TRY) {
            sleep(my_exp2(n_tentativo));
            n_tentativo++;
        }
        else {
            perror("Errore creazione Threads NWorker");
            return 1;
        }
    }
    /*Avvio visualizer*/
    n_tentativo=0;
    while ( (visualizer = start_visualizer(dumpfile)) == -1 ) {
        if(n_tentativo < MAX_TRY) {
            sleep(my_exp2(n_tentativo));
            n_tentativo++;
        }
        else {
            perror("Errore Start_Visualizer");
            return 1;
        }
    }

    /*Avvio thread collector*/
    n_tentativo=0;
    while( start_collector() ) {
        if(n_tentativo < MAX_TRY) {
            sleep(my_exp2(n_tentativo));
            n_tentativo++;
        }
        else {
            perror("Errore creazione Thread Collector");
            return 1;
        }
    }

    /*Avvio Thread Dispacer */
    n_tentativo=0;
    while( start_dispatcher() ) {
        if(n_tentativo < MAX_TRY) {
            sleep(my_exp2(n_tentativo));
            n_tentativo++;
        }
        else {
            perror("Errore Creazione Thread Dispatcher");
            return 1;
        }
    }

    /*Aspetto che i thread lanciati terminano
    */
    pthread_join(gestore_segnali_id, NULL);
    pthread_join(dispatcher_id, NULL);
    /*Procedura di recupero di collector se dormiva mentre tutti si chiudevano*/
    pthread_mutex_lock(&stampa_mux);
    puoi_stampare = TRUE;
    pthread_cond_broadcast(&stampa_pronta);
    pthread_mutex_unlock(&stampa_mux);
    pthread_join(collector_id, NULL);

    free_wator(simulazione);
    free(worker_thr_ids);

    if( remove(SOCKNAME) ) {
        perror("Non è stato possibile rimuovere il file SOCKNAME");
        return 1;
    };

    pthread_mutex_destroy(&set_critica);
    pthread_mutex_destroy(&set_skip);
    pthread_mutex_destroy(&lista_mux);
    pthread_mutex_destroy(&stampa_mux);
    pthread_cond_destroy(&lista_vuota);
    pthread_cond_destroy(&stanno_lavorando);
    pthread_cond_destroy(&stampa_pronta);
    pthread_cond_destroy(&stampa_effettuata);

    return 0;
}