Beispiel #1
0
void* escritor(void * arg){
	//++++++++++++++++++++++++++++BARRERA
	pthread_mutex_lock(&mut);
	while(!todos_creados){
		pthread_cond_wait(&barrera, &mut);
		}
	pthread_mutex_unlock(&mut);
	//++++++++++++++++++++++++++++
	lock_valor.wlock();
	
	int yo = (int)(long)arg;
	printf("mi tid---->%d Cambio valor\n", yo);
	valor++;
	
	
	nanosleep(&timW, NULL);
	lock_valor.wunlock();
			
	
	
	pthread_exit(NULL);
	return NULL;
}
void atendedor_de_jugador(int socket_fd) {
    // variables locales del jugador
    char nombre_jugador[21];
    list<Casillero> palabra_actual; // lista de letras de la palabra aún no confirmada
 
    if (recibir_nombre(socket_fd, nombre_jugador) != 0) {
        // el cliente cortó la comunicación, o hubo un error. Cerramos todo.
        terminar_servidor_de_jugador(socket_fd, palabra_actual);
    }

    if (enviar_dimensiones(socket_fd) != 0) {
        // se produjo un error al enviar. Cerramos todo.
        terminar_servidor_de_jugador(socket_fd, palabra_actual);
    }

    cout << "Esperando que juegue " << nombre_jugador << endl;

    while (true) {
        // espera una letra o una confirmación de palabra
        char mensaje[MENSAJE_MAXIMO+1];
        int comando = recibir_comando(socket_fd, mensaje);
        if (comando == MSG_LETRA) {
            Casillero ficha;
            if (parsear_casillero(mensaje, ficha) != 0) {
                // no es un mensaje LETRA bien formado, hacer de cuenta que nunca llegó
                continue;
            }
            // ficha contiene la nueva letra a colocar
            // verificar si es una posición válida del tablero
            // PIDO LOCK PARA LECTURA
            lock.rlock();
            if (es_ficha_valida_en_palabra(ficha, palabra_actual) && chequear_palabra_actual(palabra_actual)) {
				// LIBERO EL LOCK
				lock.runlock();
                palabra_actual.push_back(ficha);
                //~ tablero_letras[ficha.fila][ficha.columna] = ficha.letra;	// ESTO YA NO LO USO
                // OK
                if (enviar_ok(socket_fd) != 0) {
                    // se produjo un error al enviar. Cerramos todo.
                    terminar_servidor_de_jugador(socket_fd, palabra_actual);
                }
            }
            else {
				// LIBERO EL LOCK
				lock.runlock();
                //~ quitar_letras(palabra_actual);	// ESTO YA NO LO USO
                palabra_actual.clear();
                // ERROR
                if (enviar_error(socket_fd) != 0) {
                    // se produjo un error al enviar. Cerramos todo.
                    terminar_servidor_de_jugador(socket_fd, palabra_actual);
                }
            }
        }
        else if (comando == MSG_PALABRA) {
			// PIDO LOCK DE ESCRITURA
			lock.wlock();
			// CHEQUEO QUE TODO ESTE EN ORDEN ANTES DE ESCRIBIR EFECTIVAMENTE (POR SI ALGUIEN ESCRIBIO JUSTO ANTES)
			if(chequear_palabra_actual(palabra_actual)) {
				// las letras acumuladas conforman una palabra completa, escribirlas en el tablero de palabras y borrar las letras temporales
				for (list<Casillero>::const_iterator casillero = palabra_actual.begin(); casillero != palabra_actual.end(); casillero++) {
					tablero_palabras[casillero->fila][casillero->columna] = casillero->letra;
				}
				// LIBERO LOCK DE ESCRITURA
				lock.wunlock();
				palabra_actual.clear();

				if (enviar_ok(socket_fd) != 0) {
					// se produjo un error al enviar. Cerramos todo.
					terminar_servidor_de_jugador(socket_fd, palabra_actual);
				}
			} else {
				lock.wunlock();
				// LIBERO LOCK DE ESCRITURA
				palabra_actual.clear();
                // ERROR
                if (enviar_error(socket_fd) != 0) {
                    // se produjo un error al enviar. Cerramos todo.
                    terminar_servidor_de_jugador(socket_fd, palabra_actual);
                }
            }
        }
        else if (comando == MSG_UPDATE) {
			// PIDO LOCK DE LECTURA
			lock.rlock();
            if (enviar_tablero(socket_fd) != 0) {
				// LIBERO LOCK DE LECTURA
				lock.runlock();
                // se produjo un error al enviar. Cerramos todo.
                terminar_servidor_de_jugador(socket_fd, palabra_actual);
            }
            // LIBERO LOCK DE LECTURA
            lock.runlock();
        }
        else if (comando == MSG_INVALID) {
            // no es un mensaje válido, hacer de cuenta que nunca llegó
            continue;
        }
        else {
            // se produjo un error al recibir. Cerramos todo.
            terminar_servidor_de_jugador(socket_fd, palabra_actual);
        }
    }
}
void atendedor_de_jugador(int socket_fd) {
    // variables locales del jugador
    char nombre_jugador[21];
    list<Casillero> palabra_actual; // lista de letras de la palabra aún no confirmada

    if (recibir_nombre(socket_fd, nombre_jugador) != 0) {
        // el cliente cortó la comunicación, o hubo un error. Cerramos todo.
        terminar_servidor_de_jugador(socket_fd, palabra_actual);
    }

    if (enviar_dimensiones(socket_fd) != 0) {
        // se produjo un error al enviar. Cerramos todo.
        terminar_servidor_de_jugador(socket_fd, palabra_actual);
    }

    cout << "Esperando que juegue " << nombre_jugador << endl;

    while (true) {
        // espera una letra o una confirmación de palabra
        char mensaje[MENSAJE_MAXIMO+1];
        int comando = recibir_comando(socket_fd, mensaje);
        if (comando == MSG_LETRA) {
            Casillero ficha;
            if (parsear_casillero(mensaje, ficha) != 0) {
                // no es un mensaje LETRA bien formado, hacer de cuenta que nunca llegó
                continue;
            }
            // ficha contiene la nueva letra a colocar
            // verificar si es una posición válida del tablero
            if (es_ficha_valida_en_palabra(ficha, palabra_actual)) {
                tablero_de_mutexes[ficha.fila][ficha.columna].wlock();
                palabra_actual.push_back(ficha);
                tablero_letras[ficha.fila][ficha.columna] = ficha.letra;
                tablero_usadas_provisorias[ficha.fila][ficha.columna] = ficha.letra;
                tablero_de_mutexes[ficha.fila][ficha.columna].wunlock();
                // OK
                if (enviar_ok(socket_fd) != 0) {
                    // se produjo un error al enviar. Cerramos todo.
                    terminar_servidor_de_jugador(socket_fd, palabra_actual);
                }
            }
            else {
                quitar_letras(palabra_actual);
                // ERROR
                if (enviar_error(socket_fd) != 0) {
                    // se produjo un error al enviar. Cerramos todo.
                    terminar_servidor_de_jugador(socket_fd, palabra_actual);
                }
            }
        }
        else if (comando == MSG_PALABRA) {
            // las letras acumuladas conforman una palabra completa, escribirlas en el tablero de palabras y borrar las letras temporales
            escribiendo.wlock();
            for (list<Casillero>::const_iterator casillero = palabra_actual.begin(); casillero != palabra_actual.end(); casillero++) {
                tablero_palabras[casillero->fila][casillero->columna] = casillero->letra;
                tablero_usadas_provisorias[casillero->fila][casillero->columna]  = VACIO;
            }
            escribiendo.wunlock();
            palabra_actual.clear();

            if (enviar_ok(socket_fd) != 0) {
                // se produjo un error al enviar. Cerramos todo.
                terminar_servidor_de_jugador(socket_fd, palabra_actual);
            }
        }
        else if (comando == MSG_UPDATE) {
            int send_status = enviar_tablero(socket_fd);
            if (send_status!=0) {
                // se produjo un error al enviar. Cerramos todo.
                terminar_servidor_de_jugador(socket_fd, palabra_actual);
            }
        }
        else if (comando == MSG_INVALID) {
            // no es un mensaje válido, hacer de cuenta que nunca llegó
            continue;
        }
        else {
            // se produjo un error al recibir. Cerramos todo.
            terminar_servidor_de_jugador(socket_fd, palabra_actual);
        }
    }
}