Example #1
0
int main(int argc, char **argv) {
	correrAsignar();
	correrDefinirVariables();
	correrImprimir();
	correrImprimirTexto();
	correrFinalizar();
	correrSalto();
	correrRetornar();
	correrFunction();
	printf(" El numero de instrucciones del codigo completo es '%d'\n",metadata_desde_literal(CODIGO_COMPLETO)->instrucciones_size);
	t_intructions * instrucciones = metadata_desde_literal(CODIGO_COMPLETO)->instrucciones_serializado;
	printf("primera instruccion inicio:%d\n", instrucciones[0].start);
	printf("primera instruccion offset:%d\n", instrucciones->offset);
	printf("segunda instruccion inicio:%d\n", (instrucciones+1)->start);
	printf("SP de primera instruccion:%d\n", metadata_desde_literal(CODIGO_COMPLETO)->instruccion_inicio);
	return 0;
}
Example #2
0
int main (void) {
	char *programita = "begin\nvariables f, A, g \n A = 	0  \n!Global = 1+A\n  print !Global \n jnz !Global Siguiente \n:Proximo\n	 \n f = 8	   \ng <- doble !Global	\n  io impresora 20\n	:Siguiente	 \n imprimir A  \ntextPrint  Hola Mundo!  \n\n  sumar1 &g	 \n print g  \n\n  sinParam \n \nend\n\nfunction sinParam\n	textPrint Bye\nend\n\n#Devolver el doble del\n#primer parametro\nfunction doble\nvariables f  \n f = $0 + $0 \n  return fvend\n\nfunction sumar1\n	*$0 = 1 + *$0\nend\n\nfunction imprimir\n  wait mutexA\n    print $0+1\n  signal mutexB\nend\n\n";
	t_metadata_program *estructura = metadata_desde_literal(programita);
	char* buffer = (char*) calloc(1,SIZEOF_PCB) ;
	serialize_t_metadata_program(estructura, &buffer);
	puts(buffer);
	return 0;
}
Example #3
0
void print_instrucciones_size () {
    char * prog1 = "begin \n variables a, b, c \n a = b + 12 \n print b \n textPrint foo\n end\"";
    char * prog2 = "begin \n print b \n end";
    char * prog3 = "begin\nend";
    char * prog4 = "end";
    char * prog5 = "begin";

    t_metadata_program * meta1 = metadata_desde_literal(prog1);
    t_metadata_program * meta2 = metadata_desde_literal(prog2);
    t_metadata_program * meta3 = metadata_desde_literal(prog3);
    t_metadata_program * meta4 = metadata_desde_literal(prog4);
    t_metadata_program * meta5 = metadata_desde_literal(prog5);

    printf("instrucciones_size prog1 :%d\n", meta1->instrucciones_size);
    printf("instrucciones_size prog2 :%d\n", meta2->instrucciones_size);
    printf("instrucciones_size prog3 :%d\n", meta3->instrucciones_size);
    printf("instrucciones_size prog4 :%d\n", meta4->instrucciones_size);
    printf("instrucciones_size prog5 :%d\n", meta5->instrucciones_size);
}
Example #4
0
int main(int argc, char **argv) {
	printf("Ejecutando\n");
	char *programa = strdup(PROGRAMA);
	t_metadata_program *metadata = metadata_desde_literal(programa);

	int programCounter = 0;
	while(!terminoElPrograma()){
		char* const linea = conseguirDatosDeLaMemoria(programa,
													  metadata->instrucciones_serializado[programCounter].start,
													  metadata->instrucciones_serializado[programCounter].offset);
		printf("\t Evaluando -> %s", linea);
		analizadorLinea(linea, &functions, &kernel_functions);
		free(linea);
		programCounter++;
	}
	metadata_destruir(metadata);
	printf("================\n");

	return EXIT_SUCCESS;
}
Example #5
0
void
atenderProgramaEntrante(t_datosEnviar* paquete, int socketCliente,
    int * PIDActual)
{
  if (paquete->codigo_Operacion == HANDSHAKE)
    {
      destruirPaquete(paquete);
      t_datosEnviar *paqueteEscribir;
      void *dataGenerica;
      paquete = pedirPaquete("K", PLP_PROGRAMA_CONFIRMAR_CONECCION, 2);
      common_send(socketCliente, paquete, NULL );
      destruirPaquete(paquete);
      paquete = common_receive(socketCliente, NULL );
      if (paquete->codigo_Operacion == ENVIAR_SCRIPT)
        {

          debugTrackPLP(
              "[Achievement] Programa autenticado, recibiendo script");
          char* programa = malloc(paquete->data_size);
          memcpy(programa, paquete->data, paquete->data_size);

          t_metadata_program * metadataDelPrograma;
          metadataDelPrograma = metadata_desde_literal((const char*) programa);
          int peso;
          peso = metadataDelPrograma->cantidad_de_funciones * 3
              + metadataDelPrograma->cantidad_de_etiquetas * 5
              + metadataDelPrograma->instrucciones_size;

          int error = 0;
          t_pcb * pcbNuevo = malloc(sizeof(t_pcb));

          pcbNuevo->pid = generarPid(PIDActual);

          int direccionStack, direccionCodigo, direccionIndiceEtiquetas,
              direccionIndiceCodigo;

          destruirPaquete(paquete);
          error = 0;

          debugTrackPLP("[Accion] Pidiendo segmentos en a la UMV");

          direccionCodigo = pedirSegmento(&error, strlen(programa) + 1,
              pcbNuevo->pid);
          direccionStack = pedirSegmento(&error, configuration.tamanio_pila,
              pcbNuevo->pid);
          direccionIndiceEtiquetas = pedirSegmento(&error,
              metadataDelPrograma->etiquetas_size, pcbNuevo->pid);
          direccionIndiceCodigo = pedirSegmento(&error,
              metadataDelPrograma->instrucciones_size * sizeof(t_intructions),
              pcbNuevo->pid);

          if (error == 1)
            {
              debugTrackPLP(
                  "[Error] No se pudo crear la totalidad de segmentos");
              paquete = pedirPaquete("A", PLP_PROGRAMA_NO_SE_PUDO_CREAR, 2);
              common_send(socketCliente, paquete, NULL );
              destruirPaquete(paquete);
              void * pidMomentaneo = malloc(sizeof(int));
              memcpy(pidMomentaneo, &(pcbNuevo->pid), sizeof(int));
              paquete = pedirPaquete(pidMomentaneo,
                  KERNEL_DESTRUIR_SEGMENTOS_PROGRAMA, sizeof(int));
              common_send(socketUMV, paquete, NULL );
              debugTrackPLP(
                  "[Accion] Eliminando el resto de los segmentos pedidos");
              PIDActual--;
              destruirPaquete(paquete);
              free(pidMomentaneo);
            }
          else
            {
              debugTrackPLP(
                  "[PID:%d]-[Achievement] Se pudo alocar todos los segmentos para el proceso ",
                  pcbNuevo->pid);
              pcbNuevo->codeIndex = direccionIndiceCodigo;
              pcbNuevo->codeSegment = direccionCodigo;
              pcbNuevo->indiceEtiquetas = direccionIndiceEtiquetas;
              pcbNuevo->programCounter =
                  metadataDelPrograma->instruccion_inicio;
              pcbNuevo->tamanioIndiceEtiquetas =
                  metadataDelPrograma->etiquetas_size;
              pcbNuevo->currentStack.base = direccionStack;
              pcbNuevo->currentStack.contextSize = 0;
              pcbNuevo->currentStack.size = configuration.tamanio_pila;
              pcbNuevo->currentStack.stack_pointer = direccionStack;

              if (pcbNuevo->codeSegment != -1)
                {
                  debugTrackPLP(
                      "[PID:%d]-[Achievement] Alocado segmento de codigo en la direccion virtual %d",
                      pcbNuevo->pid, pcbNuevo->codeSegment);

                  dataGenerica = malloc(
                      3 * sizeof(uint32_t) + strlen(programa) + 1);
                  int tamanioData = strlen(programa) + 1;

                  memcpy(dataGenerica, &(pcbNuevo->pid), sizeof(uint32_t));
                  memcpy(dataGenerica + sizeof(uint32_t), &tamanioData,
                      sizeof(uint32_t));
                  memcpy(dataGenerica + 2 * sizeof(uint32_t),
                      &(pcbNuevo->codeSegment), sizeof(uint32_t));
                  memcpy(dataGenerica + 3 * sizeof(uint32_t), programa,
                      tamanioData);

                  paqueteEscribir = pedirPaquete(dataGenerica,
                      KERNEL_ESCRIBIR_SEGMENTO_UMV,
                      3 * sizeof(uint32_t) + strlen(programa) + 1);
                  common_send(socketUMV, paqueteEscribir, NULL );
                  destruirPaquete(paqueteEscribir);
                  paqueteEscribir = common_receive(socketUMV, NULL );
                  free(dataGenerica);
                  destruirPaquete(paqueteEscribir);

                }
              if (pcbNuevo->codeIndex != -1)
                {
                  debugTrackPLP(
                      "[PID:%d]-[Achievement] Alocado segmento de indice de codigo en la direccion virtual %d",
                      pcbNuevo->pid, pcbNuevo->codeIndex);
                  int tamanioData = metadataDelPrograma->instrucciones_size
                      * sizeof(t_intructions);
                  paqueteEscribir = pedirPaquete(&(pcbNuevo->pid),
                      KERNEL_ESCRIBIR_SEGMENTO_UMV, sizeof(int));
                  aniadirAlPaquete(paqueteEscribir, &(tamanioData),
                      sizeof(int));
                  aniadirAlPaquete(paqueteEscribir, &(pcbNuevo->codeIndex),
                      sizeof(int));
                  aniadirAlPaquete(paqueteEscribir,
                      metadataDelPrograma->instrucciones_serializado,
                      tamanioData);
                  common_send(socketUMV, paqueteEscribir, NULL );
                  destruirPaquete(paqueteEscribir);
                  paqueteEscribir = common_receive(socketUMV, NULL );
                  destruirPaquete(paqueteEscribir);

                }
              if (pcbNuevo->indiceEtiquetas != -1)
                {

                  debugTrackPLP(
                      "[PID:%d]-[Achievement] Alocado segmento de indice de etiquetas en la direccion virtual %d",
                      pcbNuevo->pid, pcbNuevo->indiceEtiquetas);

                  int tamanioData = metadataDelPrograma->etiquetas_size;
                  dataGenerica = malloc(
                      (tamanioData + 1) * sizeof(char) + 3 * sizeof(int));
                  memcpy(dataGenerica, &(pcbNuevo->pid), sizeof(int));
                  memcpy(dataGenerica + sizeof(int), &tamanioData, sizeof(int));
                  memcpy(dataGenerica + 2 * sizeof(int),
                      &(pcbNuevo->indiceEtiquetas), sizeof(int));
                  memcpy(dataGenerica + 3 * sizeof(int),
                      metadataDelPrograma->etiquetas, tamanioData);
                  paqueteEscribir = pedirPaquete(dataGenerica,
                      KERNEL_ESCRIBIR_SEGMENTO_UMV, (tamanioData + 1) * sizeof(char) + 3 * sizeof(int));
                  common_send(socketUMV, paqueteEscribir, NULL );
                  destruirPaquete(paqueteEscribir);
                  paqueteEscribir = common_receive(socketUMV, NULL );
                  destruirPaquete(paqueteEscribir);
                  free(dataGenerica);

                }

              debugTrackPLP("[PID:%d]-[Achievement] PCB listo para encolarse",
                  pcbNuevo->pid);

              paquete = pedirPaquete("A", PLP_PROGRAMA_ENCOLADO, 2);
              common_send(socketCliente, paquete, NULL );
              free(programa);
              encolarPCB(pcbNuevo, peso, socketCliente);

            }
        }

      else
        {
          destruirPaquete(paquete);
          pedirPaquete("NK", PROGRAMA_CERRAR, 3);
          puts("No Validado");
          common_send(socketCliente, paquete, NULL );
          destruirPaquete(paquete);
        }
    }

}
Example #6
0
t_metadata_program *getMetadataExample() {
    puts("\nThis is a fake ansisop program (hardcoded)\n");
    char *programa = "begin\nvariables f, A, g \n A = 	0  \n!Global = 1+A\n  print !Global \n jnz !Global Siguiente \n:Proximo\n	 \n f = 8	   \ng <- doble !Global	\n  io impresora 20\n	:Siguiente	 \n imprimir A  \ntextPrint  Hola Mundo!  \n\n  sumar1 &g	 \n print g  \n\n  sinParam \n \nend\n\nfunction sinParam\n	textPrint Bye\nend\n\n#Devolver el doble del\n#primer parametro\nfunction doble\nvariables f  \n f = $0 + $0 \n  return fvend\n\nfunction sumar1\n	*$0 = 1 + *$0\nend\n\nfunction imprimir\n  wait mutexA\n    print $0+1\n  signal mutexB\nend\n\n";
    //print_instrucciones_size ();
    return metadata_desde_literal(programa); // get metadata from the program
}
//testeada
pcb* crearNuevoPcb(Socket* consola, char * programaAnsisop, int tamanioArchivo) {

	t_medatada_program* metaNuevoPrograma = metadata_desde_literal(
			programaAnsisop);

	t_intructions* instrucciones = metaNuevoPrograma->instrucciones_serializado;

	t_size cantidadInstrucciones = metaNuevoPrograma->instrucciones_size;

	pcb* pcbNuevoPrograma = malloc(sizeof(pcb));
	idProgramas = idProgramas + 1;
	puts("hola");

	pcbNuevoPrograma->consola = consola;

	pcbNuevoPrograma->cpu=consola;

	pcbNuevoPrograma->id = idProgramas;

	pcbNuevoPrograma->tamanioArchivoOriginal = tamanioArchivo;

	pcbNuevoPrograma->cantPagCod=calcularCantPagCod(tamanioArchivo);

	pcbNuevoPrograma->programCounter = metaNuevoPrograma->instruccion_inicio;

	pcbNuevoPrograma->cantElementsStack = 0;

	//todo fijarse que tengo que pedirle a la memoria
	//pcbNuevoPrograma->paginasDeCodigo = cantidadPaginas(tamanioPaginas,tamanioArchivo);
	pcbNuevoPrograma->paginasDeCodigo = cantidadPaginasArchivo(tamanioArchivo);
	//pcbNuevoPrograma.indiceDeCodigo = crearIndiceCodigo(cantidadInstrucciones, instrucciones);

	arrayBidimensional * array = (arrayBidimensional*) malloc(
			cantidadInstrucciones * sizeof(arrayBidimensional));

	int i = 0;
	for (i = 0; i < cantidadInstrucciones; i++) {
		array[i].comienzo = instrucciones[i].start;
		array[i].longitud = (instrucciones[i].offset);
	}

	pcbNuevoPrograma->indiceDeCodigo = (arrayBidimensional*) malloc(
			cantidadInstrucciones * sizeof(arrayBidimensional));

	for (i = 0; i < cantidadInstrucciones; i++) {
		memcpy(&(pcbNuevoPrograma->indiceDeCodigo[i]), &array[i],
				sizeof(arrayBidimensional));
	}
//free(array);

	pcbNuevoPrograma->indiceDeCodigoSize = cantidadInstrucciones
			* sizeof(arrayBidimensional);

	if (metaNuevoPrograma->etiquetas != NULL) {
		pcbNuevoPrograma->indiceDeEtiquetas = malloc(
				sizeof(char) * (metaNuevoPrograma->etiquetas_size));

		memcpy((pcbNuevoPrograma->indiceDeEtiquetas), metaNuevoPrograma->etiquetas, (metaNuevoPrograma->etiquetas_size));
		pcbNuevoPrograma->indiceDeEtiquetasSize = strlen(
				metaNuevoPrograma->etiquetas) + 1;
		pcbNuevoPrograma->etiquetaSize = metaNuevoPrograma->etiquetas_size;
	} else {
		pcbNuevoPrograma->indiceDeEtiquetas = "MUERTE A WINDOWS";
		pcbNuevoPrograma->indiceDeEtiquetasSize = 17;
		pcbNuevoPrograma->etiquetaSize=17;
	}



	pcbNuevoPrograma->instruccionesTotales =
			metaNuevoPrograma->instrucciones_size;

	pcbNuevoPrograma->instruccionesRestantes =
			metaNuevoPrograma->instrucciones_size;

	pcbNuevoPrograma->estado = 0; //NEW

	pcbNuevoPrograma->indiceDelStack = list_create();

	pthread_mutex_lock(mutexColaNew);
	list_add(listaNew, pcbNuevoPrograma);
	pthread_mutex_unlock(mutexColaNew);
	return pcbNuevoPrograma;
}