Esempio n. 1
0
int sthread_cond_wait(sthread_cond_t *cond, sthread_mutex_t *mutex)
{
	if(cond->cond) {
		__DEBUG_PRINT(("tid %d cond 1 \n", __selftid));
		setup_sync();
		wait_to_enter();
		__DEBUG_PRINT(("tid %d cond 2 \n", __selftid));
//		if(__threadpool[])
		v_next_mutex(mutex->mutex);
		__threadpool[__selftid].mutex = NULL;
		__mvspace_commit();
		__threadpool[__selftid].state = E_STOPPED;
		__threadpool[__selftid].cond = cond->cond;
		
		__DEBUG_PRINT(("tid %d cond 3 \n", __selftid));
		v_next_and_wait();
		__DEBUG_PRINT(("tid %d cond 4 \n", __selftid));

		__mvspace_pull();

		__DEBUG_PRINT(("tid %d cond 5 \n", __selftid));
		wait_sem(cond->cond->locks, __selftid);
		__threadpool[__selftid].mutex = mutex->mutex;
		__DEBUG_PRINT(("tid %d cond 5.5 \n", __selftid));
		wait_sem(mutex->mutex->locks, __selftid);
		__threadpool[__selftid].state = E_NORMAL;

		__DEBUG_PRINT(("tid %d cond 6 \n", __selftid));
		leave_sync();
		return 0;
	}
	return -1;
}
Esempio n. 2
0
IMAGELIB_ERROR_CODE imagelib_get_frame_data_asyn(IMAGELIB_SESSION*_session,IMAGELIB_RECT _src_rect,
							    INT32 _dest_width,INT32 _dest_height, IMAGELIB_EFFECT_PARA _effect_para,DECODE_FRAME_ENDING_CB cb )
{
	IMAGE_INSTANCE *decoder_instance,*encoder_instance=NULL;
	IMAGELIB_MSG_PARA_LIST* para_list = NULL;

	if(_session == NULL || _session->instance_p == NULL)
	{
		return IMAGELIB_RAM_EXECPTION;
	}
	wait_sem(_session->decode_sem);
	if(_session ->state == IMAGELIB_DECODING)
	{
		signal_sem(_session->decode_sem);
		return IMAGELIB_CURRENT_SESSION_BUSY;
	}
	 decoder_instance = _session->instance_p;
	 
	_session->error_code= image_open_dev_by_imagedata("rab",NULL, 0,&encoder_instance);

	 if(_session->error_code != IMAGELIB_SUCCESS || encoder_instance==NULL)
	 {
	 	signal_sem(_session->decode_sem);
		return _session->error_code;
	 }
	 _session ->state = IMAGELIB_DECODING;
	 para_list = imagelib_copy_msg_paralist(IMAGELIB_GETFRAMEDATA_MSG,_session,decoder_instance,encoder_instance,_src_rect,_dest_width,_dest_height,_effect_para,cb);
	 if(para_list==NULL)
		 return IMAGELIB_RAM_EXECPTION;
	 imagelib_postworkmessage(&para_list);
	 signal_sem(_session->decode_sem);
       
     	return _session->error_code;	
}
Esempio n. 3
0
IMAGELIB_ERROR_CODE imagelib_save_frame_to_file_asyn(IMAGELIB_SESSION*_session,IMAGELIB_RECT _src_rect,
							    const WCHAR* _dest_pathname,INT32 _dest_width,INT32 _dest_height,
							    IMAGELIB_EFFECT_PARA _effect_para,DECODE_FRAME_ENDING_CB cb)
{
	IMAGE_INSTANCE *decoder_instance,*encoder_instance=NULL;
	IMAGELIB_MSG_PARA_LIST* para_list = NULL;
	char utf_pathname[UTA_MAX_PATHNAME_LEN*2+1];
	if(_session == NULL || _session->instance_p == NULL)
	{
		return IMAGELIB_RAM_EXECPTION;
	}
	wait_sem(_session->decode_sem);
	if(_session ->state == IMAGELIB_DECODING)
	{
		signal_sem(_session->decode_sem);
		return IMAGELIB_CURRENT_SESSION_BUSY;
	}
	 decoder_instance = _session->instance_p;
	 
	UnicodeToUtf8(utf_pathname,_dest_pathname);
	_session->error_code=image_open_by_filename(utf_pathname, "wb",NULL,&encoder_instance);
	  if(_session->error_code != IMAGELIB_SUCCESS || encoder_instance==NULL)
	  {
	  	signal_sem(_session->decode_sem);
		return _session->error_code;
	  }
	_session ->state = IMAGELIB_DECODING;
	para_list = imagelib_copy_msg_paralist(IMAGELIB_SAVEFRAMEDATA_MSG,_session,decoder_instance,encoder_instance,_src_rect,_dest_width,_dest_height,_effect_para,cb);
	imagelib_postworkmessage(&para_list);
  	signal_sem(_session->decode_sem);
     	return _session->error_code;	
}
Esempio n. 4
0
int main (int argc,char* argv[])
{
    //main ss
    int semid,shmid;
    char *shmaddr;
    char write_str[SHM_SIZE];
    memset(write_str,SHM_SIZE,'\0'); 
    if ((shmid = createshm(".",'m',SHM_SIZE)) == -1) { 
        exit(-1);
    } 

    if((shmaddr = shmat(shmid,(char*)0,0)) == (char*)-1)
    {
        cout << "shmat error" << endl;
    }
   if((semid =(createsem(".",'s',1,1)))==-1)
   {
       exit(-1);
   }

   while(1)
   {
       wait_sem(semid,0);
       sem_P(semid,0);
       cout << "writer:"<< "do something here" << endl;
       fgets(write_str,1024,stdin);
       int length = strlen(write_str);
       write_str[len]='\0';
       strncpy(shmaddr,write_str,len+1);
       sleep(10);
   }
    return 0;
}
Esempio n. 5
0
// monitor takes a function pointer (function w/ int as parameter)
// and an int to run with the function pointer
void enter_monitor(int proc_num, int shm_id,  void (*enter_cs)(int)) {
	time_t tcurrent;
	struct tm *timeinfo;
	cond_t *cond;
	
	cond = shmat(shm_id,0,0);

	wait_sem(cond->sem_id,0); // mutex.wait() - wait for free critical section
	wait_cond(cond);

	time(&tcurrent);
	timeinfo = localtime(&tcurrent);
	fprintf(stderr, "Process %d entering critical section at %d:%02d:%02d\n",
		proc_num,timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
	
	// execute the function sent to the monitor
	(*enter_cs)(proc_num);
	
	time(&tcurrent);
	timeinfo = localtime(&tcurrent);
	fprintf(stderr, "Process %d exiting critical section at %d:%02d:%02d\n",
		proc_num,timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);

	if (cond->next_count > 0) {
		signal_sem(cond->sem_id,1);	// next.signal();
		signal_cond(cond);
	} else {
		signal_cond(cond);
	}

	signal_sem(cond->sem_id,0); // done with critical section
	shmdt(cond);
}
Esempio n. 6
0
int main()
{
    int i,pid,child,sem;
    key_t sem_key;
    
    pid = getpid();
    printf("Soy el padre y mi PID es %d\n", pid);
    
    sem_key = ftok("/bin/ls", 42);
    sem = semget(sem_key, 1, IPC_CREAT|0600);
    if (sem < 0) {
        perror("semget");
        exit(1);
    }
    
    
    for (i=0; i<10; i++) {
        child = fork();
        
        if (child == -1) {
            perror("fork");
        }
        if (child == 0) { //CHILD
            pid = getpid();
            printf("Soy un hijo y mi PID es %d\n", pid);
            signal_sem(sem);
            exit(0);
        } else { //PARENT
            wait_sem(sem);
            printf("Continuacion del padre\n", pid);
        }
    }
    
    exit(0);
}
Esempio n. 7
0
int main()
{
    int i, shmid;
    int semid;
    int jugadorX = 0;
    int jugadorO = 0;
    bool *continuar;
    int *tab;
    llave_semaforo();
    llave_memoria();

    reiniciar_juego(&tab,&semid,&shmid);

    //Se utiliza continuar como bandera para saber cuando terminar el proceso O
    //continuar apunta a una casilla extra del arreglo del tablero de juego.
    continuar = &tab[(TAM*TAM)+1];
    system("clear");

    //Se bloquea a O en espera de X
    wait_sem(semid,jugadorO);

    while((*continuar))
    {
        system("clear");
        imprimir(&tab);
        jugar(&tab);
        system("clear");

        //Se despierta a X
        signal_sem(semid,jugadorX);

        //Se bloquea a O
        wait_sem(semid,jugadorO);
    }
    return 0;
}
Esempio n. 8
0
        T front()
        {
            sem_t *p_sem;
            T ret;

            p_sem = &this->p_sem;

            // 等待信号量
            if(0 != wait_sem(p_sem)) {
                perror("wait a sem");
                exit(1);
            }
            if (!mQueue.empty()) {
                ret = mQueue.front();
                mQueue.pop();
            }

            // throw exception
            return ret;
        };
Esempio n. 9
0
int sthread_barrier_wait(sthread_barrier_t *barrier)
{
	if(barrier->barrier) {
		setup_sync();
		//setup_barrier_sync(barrier->barrier);
		__DEBUG_PRINT(("tid %d barrier1\n", __selftid));
		wait_to_enter();
		__mvspace_commit();
		__threadpool[__selftid].state = E_STOPPED;
		__threadpool[__selftid].barrier = barrier->barrier;
		__DEBUG_PRINT(("tid %d barrier2\n", __selftid));
		v_next_and_wait();
		setup_barrier_sync(barrier->barrier);
		__sync_fetch_and_add(&(barrier->barrier->num), 1);
		__DEBUG_PRINT(("tid %d barrier3\n", __selftid));
		__mvspace_pull();

		if(barrier->barrier->total == barrier->barrier->num) {
			int i;
			for(i=0;i<MAXTHREADS;i++) {
				if(__threadpool[i].barrier == barrier->barrier)
					__threadpool[i].state = E_NORMAL;
			}
		__DEBUG_PRINT(("tid %d barrier3.5\n", __selftid));
			barrier->barrier->inited = 0;
			post_sem(barrier->barrier->sema, 0);
		}
		__DEBUG_PRINT(("tid %d barrier4\n", __selftid));
		wait_sem(barrier->barrier->sema, 0);
		__DEBUG_PRINT(("tid %d barrier5\n", __selftid));
		post_sem(barrier->barrier->sema, 0);
		__threadpool[__selftid].barrier = NULL;
		__threadpool[__selftid].state = E_NORMAL;

		leave_sync();

		return 0;
	}
	return -1;
}
Esempio n. 10
0
UINT32 imagelib_thread_main(IMAGELIB_MSG_PARA_LIST* msg)
{
	IMAGELIB_MSG_PARA_LIST* para_list = (IMAGELIB_MSG_PARA_LIST*)msg;
	
	IMAGELIB_SESSION* session = NULL;
	if(para_list == NULL || para_list->session==NULL)
		return 0;
	session = para_list->session;
	wait_sem(session->decode_sem);
	if(para_list->msg_id == IMAGELIB_SAVEFRAMEDATA_MSG ||para_list->msg_id == IMAGELIB_DRAWFRAMEDATA_MSG )
	{
		 session->error_code = imagelib_main_impl(session,para_list->src_instance,para_list->dest_instance,para_list->src_rect,
		 						para_list->dest_width,para_list->dest_height,para_list->effect_para);
	
		if (para_list->dest_instance != NULL) 
		{
			image_close(para_list->dest_instance,TRUE);		
		}
	
		if( session->state == IMAGELIB_DECODING)
		{
			session->state = IMAGELIB_IDLE;
			imagelib_dispose_frame_ending(para_list->ending_cb,session,NULL,para_list->session->error_code);
		}
	}

	else if(para_list->msg_id == IMAGELIB_GETFRAMEDATA_MSG)
	{
		DISP_BITMAP* bitmap=NULL;
		session->error_code =imagelib_main_impl(session,para_list->src_instance,para_list->dest_instance,para_list->src_rect,
		 						para_list->dest_width,para_list->dest_height,para_list->effect_para);
		if (para_list->dest_instance != NULL)  
		{
			if(session->error_code != IMAGELIB_SUCCESS)
			{
				image_close(para_list->dest_instance,TRUE);
				bitmap = NULL;
			}
			else
			{
				
				bitmap =(DISP_BITMAP*)image_get_result(para_list->dest_instance);
				image_close(para_list->dest_instance,FALSE);
				
			}
		}
		if( session->state == IMAGELIB_DECODING)
		{
			para_list->session->state = IMAGELIB_IDLE;
			imagelib_dispose_frame_ending(para_list->ending_cb,session,bitmap,para_list->session->error_code);
		}
		
	}
	if(para_list->session->state == IMAGELIB_CLOSED)
	{
		if(session->pathname)
			IMAGE_FREE(session->pathname);
		image_close((IMAGE_INSTANCE*)session->instance_p,TRUE);
		session->instance_p = NULL;
		if(para_list->session->decode_sem != NULL)
		{
			signal_sem(para_list->session->decode_sem);
			kill_sem(para_list->session->decode_sem);
			para_list->session->decode_sem = NULL;
		}
		IMAGE_FREE(para_list->session);
	}
	else
		signal_sem(session->decode_sem);
	IMAGE_FREE(para_list);
	return 0;
}
Esempio n. 11
0
int main()
{
    //Crear/Abrir semaforo
    int semid = abrir_sem(SEMAFOROS, 3);
    if(semid == -1)
    {
        printf("\nError al crear el semaforo\n");
        return -1;
    }

    int msgQ = msgget(LLAVEMSG, IPC_CREAT | 0666);
    if(msgQ == -1)
    {
        printf("\nError al abrir la cola de mensajes\n");
        return -1;
    }

    tablero* tab;
    respuesta resp;
    resp.tipo = 2;
    pregunta preg;
    preg.tipo = 1;
    int i, j;
    int turno = 0;
    int puntuacion = 0;
    int x,y;

    //Compartir el tablero
    int tabMemID = shmget(PLAYER1, sizeof(tablero), IPC_CREAT | 0666);
    if(tabMemID == -1)
    {
        printf("\nError al crear el tablero\n");
        return -1;
    }
    tab = (tablero*) shmat(tabMemID, 0, 0);


    for(i = 0;i < 3;i++)
        for(j = 0; j < 3; j++)
            tab->valores[i][j] = 0;

    //Llenar tabla con 1, 2 y 3
    i = 0;
    while(i < 3)
    {
        printf("\nSelecciona la posición del %d: ",i+1);
        scanf("%d,%d",&x, &y);

        if((x > 2) || (y > 2))
        {
            printf("\nPosiciones invalidas (entre 0 y 2");
            continue;
        }

        if(tab->valores[x][y] != 0)
        {
            printf("\nYa hay un numero ahi\n");
            continue;
        }
        else
        {
            tab->valores[x][y] = i+1;
            i++;
        }
    }

    shmdt(tab);

    //    printf("Esperando que el Jugador 2 llene su tablero...");
    //    signal_sem(semid, SEM_P2);
    //    wait_sem(semid, SEM_P1);

    printf("\nEsperando al monitor");
    wait_sem(semid, SEM_P1);

    while(turno < 3)
    {


        /*Modo Activo*/
        printf("\n=================================");
        printf("\n\nTurno %d\n\n", turno+1);
        printf("Escribe la posicion a atacar (x,y): ");
        scanf("%d,%d",&x,&y);


        preg.x = x;
        preg.y = y;

        msgsnd(msgQ, &preg, sizeof(pregunta) - sizeof(long), IPC_NOWAIT);
        //        printf("\nEsperando respuesta\n");
        msgrcv(msgQ, &resp, sizeof(respuesta) - sizeof(long), 2, 0);
        //        printf("\nRespuesta recibida");

        printf("\nPuntos obtenidos: %d\n\n", resp.valor);
        puntuacion += resp.valor;

        turno++;


        /*Modo Pasivo*/
        printf("Espera tu turno...\n");
        msgrcv(msgQ, &preg, sizeof(pregunta) - sizeof(long), 1, 0);
        //        printf("\nPregunta recibida");

        tab = (tablero*) shmat(tabMemID, 0, 0);
        int val = tab->valores[preg.x][preg.y];
        tab->valores[preg.x][preg.y] = -1;
        shmdt(tab);

        //        printf("\nSignal SEM_MON");
        signal_sem(semid, SEM_MON);
        //        printf("\nWait SEM_P1");
        wait_sem(semid, SEM_P1);
        resp.valor = val;
        //        printf("\nEnviando respuesta");
        msgsnd(msgQ, &resp, sizeof(respuesta) - sizeof(long), 0);
        //        printf("\nRespuesta enviada");

    }

    printf("\n\nJuego terminado, puntuacion total: %d\n", puntuacion);

    return 0;
}
Esempio n. 12
0
int main(int argc, char** argv)
{
	Semaphore sem_dock;
	Semaphore mutex_dock;
	Semaphore sem_gen_v;
	Shm shm_dock;
	struct mq_attr attr1;
	struct mq_attr attr2;
	mqd_t mqd_trucks;
	mqd_t mqd_cars_vans;
	char mq1_name[MQ_NAME_LENGTH];
	char mq2_name[MQ_NAME_LENGTH];
	char* port_name = argv[1];
	char* msg = malloc(sizeof(msg));
	int dock_index;
	int nb_docks;
	int stop = 0;
	int num_read = 0;
	void *buffer;

	sscanf(argv[2], "%d", &dock_index);
	sscanf(argv[3], "%d", &nb_docks);

	init_ressources(&sem_dock, &mutex_dock, &shm_dock, port_name, dock_index, nb_docks);

	// Mise a zero des info de la Shm
	Dock dock;
	dock.index = dock_index;
	dock.boat_index = -1;
	wait_sem(mutex_dock);
	memcpy(shm_dock.pShm + (dock_index * sizeof(Dock)), &dock, sizeof(Dock));
	signal_sem(mutex_dock);

	while (!stop)
	{
		// Attente d'un bateau
		printf("\t\t Quai %s %d > En attente %s\n", port_name, dock_index, sem_dock.semname);
		wait_sem(sem_dock);

		wait_sem(mutex_dock);
		memcpy(&dock, shm_dock.pShm + (dock_index * sizeof(Dock)), sizeof(Dock));
		signal_sem(mutex_dock);

		sprintf(msg, "Bateau %d a quai", dock.boat_index);
		print_boat(port_name, dock_index, dock.boat_index, msg);

		// Ouverture MQ --- TODO: refactor with open_mq, ...
		sprintf(mq1_name, "%s%d", MQ_TRUCKS, dock.boat_index);
		sprintf(mq2_name, "%s%d", MQ_CARS_VANS, dock.boat_index);
		mqd_trucks = mq_open(mq1_name, O_RDONLY | O_NONBLOCK);
		mqd_cars_vans = mq_open(mq2_name, O_RDONLY | O_NONBLOCK);
		
		if (mqd_trucks == (mqd_t) -1 || mqd_cars_vans == (mqd_t) -1)
		{
			perror("Error when opening MQs (trucks, cars, vans)");
		}
		if (mq_getattr(mqd_trucks, &attr1) == -1 || mq_getattr(mqd_cars_vans, &attr2) == -1)
		{
			perror("Erreur when mq_getattr\n");
		}
		buffer = malloc(attr1.mq_msgsize);

		// Début du débarquement
		sprintf(msg, "Debut debarquement");
		print_boat(port_name, dock_index, dock.boat_index, msg);

		// Débarquement des camions
		sprintf(msg, "Debarquement de %ld camions", attr1.mq_curmsgs);
		print_boat(port_name, dock_index, dock.boat_index, msg);
		if(attr1.mq_curmsgs > 0)
		{
			while(num_read != -1)
			{
				num_read = mq_receive(mqd_trucks, buffer, attr1.mq_msgsize, NULL);
				nanosleep((struct timespec[]){{0, 250000000}}, NULL);
			}
		}
		num_read = 0;

		// Débarquement des voitures/vans
		sprintf(msg, "Debarquement de %ld voitures/vans", attr2.mq_curmsgs);
		print_boat(port_name, dock_index, dock.boat_index, msg);
		if(attr2.mq_curmsgs > 0)
		{
			while(num_read != -1)
			{
				num_read = mq_receive(mqd_cars_vans, buffer, attr2.mq_msgsize, NULL);
				nanosleep((struct timespec[]){{0, 250000000}}, NULL);
			}
		}
Esempio n. 13
0
File: tcp.c Progetto: ebichu/dd-wrt
/*
	-create a thread to create and connect a socket
	-orphan the thread if does not return within timeout period
	-return socket connection success/fail
	-limit number of connection threads orphaned at any 
	 given time so that if one is orphaned, return connection 
	 fail

	Algorithm assumption is that if orphaned thread(s) then network problems,
	and probably due to not online.  A more general solution would take into
	account that different callers may/probably would have different dests
	and any problems could be on the dest end
*/
RC_TYPE tcp_initialize_async(TCP_SOCKET *p_self,CB_EXIT_COND p_exit_func,void *p_cb_data)
{
#ifndef _WIN32
	pthread_t			c_thread=0;
#else
	unsigned long		c_thread=0;
#endif
	CONNECT_THREAD_DATA		*p_thread_data;
	CONNECT_THREAD_DATA		*p_thread_return=NULL;
	int						sleep_time=0;
	RC_TYPE					ret_rc;
	TCP_SOCKET				*p_this_self;
	int						is_exit_request=0;
	int						is_t_data_mutex_released=0;
	int						is_got_test_timer_mutex;


	DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "Entered tcp_initialize_async...\n"));		

	if (!(p_self)) {

		DBG_PRINTF((LOG_CRIT,"C:" MODULE_TAG "p_self null in tcp_initialize_async...\n"));		

		return RC_INVALID_POINTER;
	}


	get_mutex(&connect_in_progress_mutex);

	if (!(is_connect_in_progress)) {

		/*no orphaned thread, not in timer loop*/

		get_mutex(&timer_loop_mutex);
	}
	else {

		/*orphaned thread, or still in timer loop -- don't let still in loop prevent us an attempt*/

		if ((get_mutex_try(&timer_loop_mutex)==0)) {

			/*we've orphaned a connection thread because of timeout -- just return connection failure*/

			DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "connection in progress in tcp_initialize_async...\n"));

			release_mutex(&timer_loop_mutex);
			release_mutex(&connect_in_progress_mutex);

			return RC_IP_CONNECT_FAILED;
		}
	}

	is_connect_in_progress+=1;
	release_mutex(&connect_in_progress_mutex);

	/*if client requests exit we may abandon connect thread
	  so rallocate client's p_self data -- we'll deallocate
	  this if connect thread exits normally -- so our
	  dangling thread does not have p_self data pulled out
	  from under it when/if our client quits*/

	/*see the function to see just what is/isn't cloned*/
	tcp_clone(&p_this_self,p_self);
	p_self=p_this_self;

	is_got_test_timer_mutex=(get_mutex_try(&test_timer_loop_mutex)==0);
	p_thread_data=create_connect_data(p_self);

	get_mutex(&p_thread_data->t_data_mutex);
	create_connect_thread(&c_thread,p_thread_data);
		
	/*loop/sleep 'til thread returns or prog exit requested*/

	while(!(p_thread_data->is_thread_exit) && !((is_exit_request=p_exit_func(p_cb_data)))) {		

		sleep_time+=sleep_lightly_ms(1000,p_exit_func,p_cb_data);

		if (!(sleep_time<p_self->super.timeout)) {
			
			DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "tcp_initialize_async timed out...\n"));		

			break;
		}
	}

	if (p_thread_data->is_thread_exit) {

		release_mutex(&p_thread_data->t_data_mutex);
		is_t_data_mutex_released=1;

	} 
	else {

		DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "connect thread has not exited...attempting to shutdown socket in tcp_initialize_async...\n"));

		if ((kill_thread(c_thread)==0)) {
			
			c_thread=0;

			DBG_PRINTF((LOG_WARNING,"W:" MODULE_TAG "killed connect thread in tcp_initialize_async...\n"));
		}

	}

	if (c_thread) {

		DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "tcp_initialize_async joinng connect thread...\n"));

		exit_thread(c_thread,(void **) &p_thread_return);
	}

	DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "tcp_initialize_async returning...\n"));

	if (is_exit_request)

		ret_rc=global_is_online;

	else {

		global_is_online=p_thread_data->rc;
		ret_rc=global_is_online;
	}

	if (is_got_test_timer_mutex)
		release_mutex(&test_timer_loop_mutex);

	release_mutex(&timer_loop_mutex);

	/*if program not quiting, and thread exited, free assocated data*/
	if (!(p_thread_data->is_thread_exit)) {

		p_thread_data->is_parent_exit=1;

		release_mutex(&p_thread_data->t_data_mutex);
	} 
	else {

		if (!(is_t_data_mutex_released))
			release_mutex(&p_thread_data->t_data_mutex);

		wait_sem(&p_thread_data->t_data_sem);

		DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "destroying connect data in tcp_initialize_async...\n"));

		destroy_connect_data(&p_thread_data);
	}

	return ret_rc;
}
// argv[1] = port name
int main(int argc, char** argv)
{
	Semaphore sem_gen_v;
	Semaphore mutex_boat;
	Semaphore mutex_sync;
	Shm shm_boat;
	Boat boat;
	mqd_t mqd_trucks;
	mqd_t mqd_cars_vans;

	char buffer[MQ_MSGSIZE];
	char* port_name = argv[1];
	char* msg = malloc(sizeof(msg));
	int i = 0;
	int nb_trucks = 0, nb_cars = 0, nb_vans = 0;
	int nb_boats = atoi(getProp(PROP_FILE, "nb_boats"));

	srand(getpid());

	// SEM_GEN_V
	sem_gen_v.oflag = (O_CREAT | O_RDWR);
	sem_gen_v.mode  = 0644;
	sem_gen_v.value = 0;
	sprintf(sem_gen_v.semname,"%s%s", SEM_GEN_V, port_name);
	sem_unlink(sem_gen_v.semname);
	open_sem(&sem_gen_v);

	// Preparing mutex for shm_boat access
	mutex_boat.oflag = O_RDWR;
	mutex_boat.mode  = 0644;
	mutex_boat.value = 1;
	strcpy(mutex_boat.semname, MUTEX_BOAT);
	open_sem(&mutex_boat);

	// Preparing shm_boat access
	shm_boat.sizeofShm = sizeof(Boat) * 6;
	shm_boat.mode = O_RDWR;
	strcpy(shm_boat.shmName, SHM_BOAT);
	open_shm(&shm_boat);
	mapping_shm(&shm_boat, sizeof(Boat) * 6);

	while(1)
	{
		// Waiting signal_sem on sem_gen_v from Docks processes.
		wait_sem(sem_gen_v);

		// Waiting for access on shm_boat
		wait_sem(mutex_boat);
		boat = get_actual_boat(DOCK, port_name, nb_boats, shm_boat);
		signal_sem(mutex_boat);

		sprintf(msg, "Débloqué");
		print_boat(port_name, boat.index, msg);

		// MUTEX_SYNC
		mutex_sync.oflag = 0;
		sprintf(mutex_sync.semname,"%s%d", MUTEX_SYNC, boat.index);
		open_sem(&mutex_sync);

		// Ouverture MQs
		mqd_trucks = mq_open(boat.mq1.name, O_WRONLY);
		mqd_cars_vans = mq_open(boat.mq2.name, O_WRONLY);

		nb_cars = rand() % MAX_N_CARS + 1;
		nb_vans = rand() % MAX_N_VANS + 1;
		nb_trucks = rand()% MAX_N_TRUCKS + 1;

		memset(buffer, 0, MQ_MSGSIZE);
		sprintf(msg, "Debut embarquement");
		print_boat(port_name, boat.index, msg);

		sprintf(msg, "Embarquement de %d voitures", nb_cars);
		print_boat(port_name, boat.index, msg);

		for(i = 0; i < nb_cars; i++)
		{
			sprintf(buffer, "Car %d", i + 1);
			if(mq_send(mqd_cars_vans, buffer, strlen(buffer), CAR_PRIORITY) == -1)
			{
				mq_close(mqd_cars_vans);
				mq_unlink(boat.mq1.name);
				perror("Error occured when mq_send (cars & vans)\n");
				exit(EXIT_FAILURE);
			}
			// Sleep 1/4s -- TODO Paramétrable.
			nanosleep((struct timespec[]){{0, 250000000}}, NULL);
		}

		sprintf(msg, "Embarquement de %d vans", nb_vans);
		print_boat(port_name, boat.index, msg);
		for(i = 0; i < nb_vans; i++)
		{
			sprintf(buffer, "Van %d", i);
			if(mq_send(mqd_cars_vans, buffer, strlen(buffer), VAN_PRIORITY) == -1)
			{
				mq_close(mqd_cars_vans);
				mq_unlink(boat.mq1.name);
				perror("Error occured when mq_send (cars & vans)\n");
				exit(EXIT_FAILURE);
			}
			// Sleep 1/4s
			nanosleep((struct timespec[]){{0, 250000000}}, NULL);
		}
Esempio n. 15
0
KERNEL_HANDLE
KernelCreateTask
    (
        KERNEL_TASK_START_ENTRY     startEntry,
        ULONG                       stackSize,
        ULONG                       priority,
        KERNEL_HANDLE               hContext,
        char*                       taskName
    )
{
    static  ULONG                   taskNo          = 0;

    PKERNEL_TASK_CONTEXT            pTaskContext    = NULL;
    PROCESS                         pProc;

    wait_sem(&gSerializeSem);

    KernelTrace2
        (
            KERNEL_DBG_LEVEL_TRACE_FLOW,
            KERNEL_DBG_MASK_GENERIC,
            "KernelCreateTask -- taskName = %s, startEntry = 0x%X, stackSize = %d, priority = %d, context = 0x%X.\n",
            taskName,
            startEntry,
            stackSize,
            priority,
            hContext
        );

    pTaskContext = KernelAllocateMemory(sizeof(KERNEL_TASK_CONTEXT));

    if (pTaskContext == NULL)
    {
        KernelTrace2
            (
                KERNEL_DBG_LEVEL_WARNING,
                KERNEL_DBG_MASK_GENERIC,
                "KernelCreateTask -- cannot allocate memory for the task context, size = %d.\n",
                sizeof(KERNEL_TASK_CONTEXT)
            );

        signal_sem(&gSerializeSem);

        return  KERNEL_HANDLE_NULL;
    }

    pTaskContext->StartEntry    = startEntry;
    pTaskContext->hContext      = hContext;

    KernelAssert(gpTaskContext == NULL);

    gpTaskContext = pTaskContext;

    pProc =
        create_process
            (
                priority - (priority % 64),
                taskName,
                KernelTaskRoutineEntry,
                stackSize,
                priority % 64,
                0,
                (PROCESS)0,
                (struct OS_redir_entry *)0,
                0x0000,
                (OSUSER)0
            );

    if (!pProc)
    {
        KernelTrace2
            (
                KERNEL_DBG_LEVEL_WARNING,
                KERNEL_DBG_MASK_GENERIC,
                "KernelCreateTask -- failed to create the process %s!\n",
                taskName
            );

        /*
         *  capture this exception
         */
        KernelAssert(FALSE);

        signal_sem(&gSerializeSem);

        return  KERNEL_HANDLE_NULL;
    }

    /*
     *  start the process
     */
    start(pProc);

    /*
     *  wait for the process complete access to the global task context
     */
    wait_sem(&gCompletionSem);

    KernelAssert(gpTaskContext == NULL);

    signal_sem(&gSerializeSem);

    return  (KERNEL_HANDLE)pProc;
}