Ejemplo n.º 1
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;	
}
Ejemplo 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;	
}
Ejemplo n.º 3
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);
}
Ejemplo n.º 4
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);
}
Ejemplo n.º 5
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;
}
Ejemplo n.º 6
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;
}
Ejemplo n.º 7
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;
}
Ejemplo n.º 8
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);
			}
		}
Ejemplo n.º 9
0
Archivo: tcp.c Proyecto: ebichu/dd-wrt
static void connect_thread(void *p_data)
#endif
{
	CONNECT_THREAD_DATA	*p_ct_data=(CONNECT_THREAD_DATA *) p_data;
	TCP_SOCKET			*p_self;


	if (!(p_ct_data)) {

		DBG_PRINTF((LOG_CRIT,"C:" MODULE_TAG "p_ct_data null in connect_thread...\n"));
	}
	else {

		p_self=p_ct_data->p_self;

		if (!(p_self)) {

			DBG_PRINTF((LOG_CRIT,"C:" MODULE_TAG "p_ct_data->p_self null in connect_thread...\n"));

			p_ct_data->rc=RC_INVALID_POINTER;
		}
		else {

			DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "attempting to create socket in connect_thread...\n"));
		
			if (!(tcp_create_quick_socket(p_self)==RC_OK)) {

				global_is_online=RC_IP_CONNECT_FAILED;

				DBG_PRINTF((LOG_CRIT,"C:" MODULE_TAG "failed socket create in connect_thread...\n"));
			}
			else {

				DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "calling do_connect from connect_thread\n"));

				if (RC_OK==(p_ct_data->rc=do_connect(p_self))) {

					p_self->initialized=TRUE;
				}

				global_is_online=p_ct_data->rc;

				DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "connect thread returned from connect, connected: %d\n",(p_ct_data->rc==RC_OK)));
			}
		}

		p_ct_data->is_thread_exit=1;

		get_mutex(&p_ct_data->t_data_mutex);
		signal_sem(&p_ct_data->t_data_sem);
		release_mutex(&p_ct_data->t_data_mutex);

		if (p_ct_data->is_parent_exit) {

			/*we're orphaned, and in case program still running, deallocate what can*/

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

			destroy_connect_data(&p_ct_data);
		}

		DBG_PRINTF((LOG_INFO,"I:" MODULE_TAG "connect thread exiting...\n"));
	}

	get_mutex(&connect_in_progress_mutex);
	is_connect_in_progress-=1;
	release_mutex(&connect_in_progress_mutex);

#ifdef _WIN32
	_endthread();
#else
	pthread_exit(p_ct_data);

	/*compiler complaints (pthread_exit does not return)*/
	return p_ct_data;
#endif

}
Ejemplo n.º 10
0
// 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);
		}
Ejemplo n.º 11
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;
}