void *escribir_entero(void*){
	rw.wlock();
	
	lockAEscribiendo.rlock();
	assert(!alguien_escribiendo);
	lockAEscribiendo.runlock();
	
	lockALeyendo.rlock();
	assert(!alguien_leyendo);
	lockALeyendo.runlock();
	
	int i = rand() % TAMANIO_ARREGLO;

	printf("escribiendo_entero = %d \n", i);
	arreglo[i] += 1;
	rw.wunlock();	
	return NULL;
}
Beispiel #2
0
void *lector(void *p_minumero) {
    int minumero = *((int *) p_minumero);
    
    printf("LECTOR %d QUIERE LEER\n", minumero);
    lock.rlock();
    printf("LECTOR %d LEYENDO\n", minumero);
    sleep(SLEEP_LECTORES);
    lock.runlock();
    printf("LECTOR %d HA LEIDO\n", minumero);
    return NULL;
}
Beispiel #3
0
void *read(void *p_args) {
    int* args = (int*) p_args;
    if(args[0] == -1)
        sleep(args[1]);

    lock.rlock();
    sleep(2);
    printf("Compartida: %d\n", compartida);
    lock.runlock();

    pthread_exit(NULL);
}
void *leer_entero(void*){	
	rw.rlock();
	
	lockAEscribiendo.rlock();
	assert(!alguien_escribiendo);
	lockAEscribiendo.runlock();
	
	lockALeyendo.wlock();
	if (alguien_leyendo) hubo_lectores_simultaneos = true;
	alguien_leyendo = true; 
	lockALeyendo.wunlock();
	
	int i = rand() % TAMANIO_ARREGLO;
	printf("leyendo_entero = %d \n", arreglo[i]);
	
	lockALeyendo.wlock();
	alguien_leyendo = false; 
	lockALeyendo.wunlock();
	
	rw.runlock();
	return NULL;
}
int enviar_tablero(int socket_fd) {
    char buf[MENSAJE_MAXIMO+1];
    sprintf(buf, "STATUS ");
    int pos = 7;
    escribiendo.rlock();
    for (unsigned int fila = 0; fila < alto; ++fila) {
        for (unsigned int col = 0; col < ancho; ++col) {
            char letra = tablero_palabras[fila][col];
            buf[pos] = (letra == VACIO)? '-' : letra;
            pos++;
        }
    }
    escribiendo.runlock();
    buf[pos] = 0; //end of buffer

    return enviar(socket_fd, buf);
}
Beispiel #6
0
void* lector(void * arg){
	//++++++++++++++ACA CREAMOS UNA BARRERA PARA QUE TODOS LOS THREADS ESPEREN A QUE SEAN TODOS CREADOS
	pthread_mutex_lock(&mut);
	while(!todos_creados){
		pthread_cond_wait(&barrera, &mut);
		}

	pthread_mutex_unlock(&mut);
	//++++++++++++++++++++++++++++
	
	int yo = (int)(long)arg;
	lock_valor.rlock();
	printf ("mi tid---->%d leo valor:%d\n", yo, valor );
	lock_valor.runlock();
	
		
	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);
        }
    }
}