示例#1
0
文件: stack.c 项目: avaudagna/elestac
void deserialize_args(t_stack_entry **entry, void **serialized_data, int *serialized_data_size, int cant_args) {
    int indice = 0;
    t_arg * aux_arg = NULL;
    if(cant_args > 0) {
        for(indice = 0; indice < cant_args; indice++ ) {
            aux_arg = calloc(1, sizeof(t_arg));
            deserialize_data(&aux_arg->page_number, sizeof(int), serialized_data, serialized_data_size);
            deserialize_data(&aux_arg->offset, sizeof(int), serialized_data, serialized_data_size);
            deserialize_data(&aux_arg->tamanio, sizeof(int), serialized_data, serialized_data_size);
            add_arg(entry, aux_arg);
        }
    }
}
示例#2
0
文件: stack.c 项目: avaudagna/elestac
void deserialize_ret_vars(t_stack_entry **entry, void **serialized_data, int *serialized_data_size, int cant_ret_vars) {
    int indice = 0;
    t_ret_var * aux_ret_var = NULL;
    if(cant_ret_vars > 0) {
        for(indice = 0; indice < cant_ret_vars; indice++ ) {
            aux_ret_var = calloc(1, sizeof(t_ret_var));
            deserialize_data(&aux_ret_var->page_number, sizeof(int), serialized_data, serialized_data_size);
            deserialize_data(&aux_ret_var->offset, sizeof(int), serialized_data, serialized_data_size);
            deserialize_data(&aux_ret_var->tamanio, sizeof(int), serialized_data, serialized_data_size);
            add_ret_var(entry, aux_ret_var);
        }
    }
}
t_valor_variable obtenerValorCompartida(t_nombre_compartida variable){
    if(status_check() != EXECUTING)
        return ERROR;

    //5 + 0 + nameSize + name (1+1+4+nameSize bytes)
    void* buffer = NULL;
    int value = 0, variable_name_length = (int) strlen(variable), buffer_index = 0;
    char operation = SHARED_VAR_ID, action = GET_VAR;

//    asprintf(&buffer, "%d%d%04d%s", atoi(SHARED_VAR_ID), atoi(GET_VAR), strlen(variable), variable);
    serialize_data(&operation, sizeof(char), &buffer, &buffer_index);
    serialize_data(&action, sizeof(char), &buffer, &buffer_index);
    serialize_data(&variable_name_length, sizeof(int), &buffer, &buffer_index);
    serialize_data(variable, (size_t) variable_name_length, &buffer, &buffer_index);

    if(send(kernelSocketClient, buffer, (size_t) buffer_index, 0) < 0) {
        log_error(cpu_log, "send of obtener variable compartida of %s failed", variable);
        free(buffer);
        return ERROR;
    }
    free(buffer);
    buffer = calloc(1, sizeof(int));
    if(recv(kernelSocketClient, buffer, sizeof(int),  0) <= 0) {
        log_error(cpu_log, "recv of obtener variable compartida failed");
        return ERROR;
    }
    int deserialize_index = 0;
    deserialize_data(&value, sizeof(int), buffer, &deserialize_index);
    log_info(cpu_log, "recv value %d of obtener variable %s", value, variable);
    free(buffer);
    return value;

}
示例#4
0
文件: rpc.c 项目: dyustc/searaft
struct data_t *deserialize_data(json_t *json_data) {
    struct data_t *data = (struct data_t *)malloc(sizeof(struct data_t));
    if(json_is_integer(json_data)) {
        data->type = RPC_INT;
        data->value = (json_int_t *)malloc(sizeof(json_int_t));
        *(json_int_t *)data->value = json_integer_value(json_data);
    } else if(json_is_real(json_data)) {
        data->type = RPC_REAL;
        data->value = (double *)malloc(sizeof(double));
        *(double *)data->value = json_real_value(json_data);
    } else if(json_is_string(json_data)) {
        data->type = RPC_STRING;
        data->value = private_strdup(json_string_value(json_data));
    } else if(json_is_array(json_data)) {
        data->type = RPC_VECTOR;
        data->length = json_array_size(json_data);
        data->child = (struct data_t **)malloc(sizeof(struct data_t *)*data->length);
        for(int i = 0; i < data->length; i++) {
            data->child[i] = deserialize_data(json_array_get(json_data, i));
        }
    } else {
        return NULL;
    }
    return data;
}
void asignar(t_posicion direccion_variable, t_valor_variable valor) {
    if(status_check() != EXECUTING)
        return;

    t_list * pedidos = NULL;
    obtener_lista_operaciones_escritura(&pedidos, direccion_variable, ANSISOP_VAR_SIZE, valor);

    char * umc_response_buffer = calloc(1, sizeof(char));
    if(umc_response_buffer == NULL) {
        log_error(cpu_log, "asignar umc_response_buffer mem alloc failed");
        return;
    }

    int index = 0;
    t_nodo_send * nodo = NULL;
    int page, offset, size, print_index = 0;
    char operation;
    while (list_size(pedidos) > 0) {
        nodo = list_remove(pedidos, index);
        if(nodo != NULL) {
            deserialize_data(&operation, sizeof(char), nodo->data, &print_index);
            deserialize_data(&page, sizeof(int), nodo->data, &print_index);
            deserialize_data(&offset, sizeof(int), nodo->data, &print_index);
            deserialize_data(&size, sizeof(int), nodo->data, &print_index);
            log_info(cpu_log, "Sending request op:%c (%d,%d,%d) for direccion variable %d with value %d", operation, page, offset, size, direccion_variable, valor);
//            log_info(cpu_log, "sending request : %s for direccion variable %d with value %d",  nodo->data , direccion_variable, valor);
            if( send(umcSocketClient, nodo->data , (size_t ) nodo->data_length, 0) < 0) {
                log_error(cpu_log, "UMC expected addr send failed");
                break;
            }

            //EXITO (Se podria loggear de que la operacion fue exitosa)
            if(check_umc_response(recv_umc_response_status()) == SUCCESS){
                log_info(cpu_log, "Asignar variable operation to UMC with value %d was successful", valor);
            } else {
                log_error(cpu_log, "Asignar variable operation to UMC with value %d failed", valor);
                break;
            }
            free(nodo);
        }
    }
    list_destroy(pedidos); //Liberamos la estructura de lista reservada
	free(umc_response_buffer);
	log_info(cpu_log, "Finished asignar variable operations");
}
示例#6
0
文件: stack.c 项目: avaudagna/elestac
/*
 * Deserializa un t_stack_entry de un conjunto de bytes.
 *
 * serialized_data format >> pos|cant_args|args|cant_vars|vars|cant_ret_vars|ret_vars
 *
 * **entry    : Donde el stack_entry se almacenara.
 * serialized_data : Conjunto de bytes serializados.
 * serialized_data_size : Tamanio total del conjunto de bytes.
 */
void deserialize_stack_entry(t_stack_entry **entry, void **serialized_data, int *serialized_data_size) {

    int cant_args= 0, cant_vars = 0, cant_ret_vars = 0;
    deserialize_data(&(*entry)->pos, sizeof(int), serialized_data, serialized_data_size);

    deserialize_data(&cant_args, sizeof(int), serialized_data, serialized_data_size);
    //deserialize_data((*entry)->args, (size_t) (*entry)->cant_args, serialized_data, serialized_data_size);
    deserialize_args(entry, serialized_data, serialized_data_size, cant_args);

    deserialize_data(&cant_vars, sizeof(int), serialized_data, serialized_data_size);
    //deserialize_data((*entry)->vars, (size_t) (*entry)->cant_vars, serialized_data, serialized_data_size);
    deserialize_vars(entry, serialized_data, serialized_data_size, cant_vars);

    deserialize_data(&cant_ret_vars, sizeof(int), serialized_data, serialized_data_size);
    //deserialize_data((*entry)->ret_vars, (size_t) (*entry)->cant_vars, serialized_data, serialized_data_size);
    deserialize_ret_vars(entry, serialized_data, serialized_data_size, cant_ret_vars);

    deserialize_data(&(*entry)->ret_pos, sizeof(int), serialized_data, serialized_data_size);
}
char recv_umc_response_status() {
    void * umc_response_status_buffer = calloc(1, sizeof(char));
    char umc_response_status;
    int umc_response_status_buffer_index = 0;
    if( recv(umcSocketClient , umc_response_status_buffer, sizeof(char), 0) <= 0) {
        log_error(cpu_log, "UMC bytes recv failed");
        return ERROR;
    }
    deserialize_data(&umc_response_status, sizeof(char), umc_response_status_buffer, &umc_response_status_buffer_index);
    free(umc_response_status_buffer);
    return umc_response_status;
}
示例#8
0
文件: stack.c 项目: avaudagna/elestac
/*
 * Deserializa un t_stack de un conjunto de bytes.
 *
 * serialized_data format >> cantidadLinks|[entrySize(0)|entry(0)...entrySize(cantidadLinks-1)|entry(cantidadLinks-1)]
 *
 * **stack    : Donde el stack se almacenara.
 * serialized_data : Conjunto de bytes serializados.
 * serialized_data_size : Tamanio total del conjunto de bytes.
 */
void deserialize_stack(t_stack **stack, void **serialized_data, int *serialized_data_size) {
    u_int32_t cantidad_links = 0, indice = 0;
    t_stack_entry *stack_entry = NULL;

    *stack = queue_create(); //Creo el stack

    deserialize_data(&cantidad_links, sizeof(int), serialized_data, serialized_data_size);
    for(indice = 0; indice < cantidad_links; indice++) {
        stack_entry = create_new_stack_entry();
        deserialize_stack_entry(&stack_entry, serialized_data, serialized_data_size);
        queue_push(*stack, (void*) stack_entry); //Agrego elementos al stack
    }
}
示例#9
0
文件: rpc.c 项目: dyustc/searaft
//deserializes the method which serialized at caller
//returns method name to be called and the params/nparams
//are the arguments to the method call
//returns NULL on error
struct method_t *deserialize_method_call(const char *serialized) {
    json_t *root;
    json_error_t parse_error;
    
    root = json_loads(serialized, 0, &parse_error);

    if(!root || !json_is_object(root)) {
        if(root) json_decref(root);
        return NULL;
    }

    json_t *json_method_name = json_object_get(root, METHOD_JSON_KEY);
    json_t *json_method_params = json_object_get(root, PARAMS_JSON_KEY);

    if(!json_method_name || !json_method_params) {
        json_decref(root);
        return NULL;
    }
    
    char *method_name = NULL;
    if(!json_is_string(json_method_name)) {
        json_decref(root);
        return NULL;
    }
    method_name = private_strdup(json_string_value(json_method_name));

    struct data_t *envelope = deserialize_data(json_method_params);
    if(!envelope || envelope->type != RPC_VECTOR) {
        free(method_name);
        json_decref(root);
        return NULL;
    }

    struct method_t *mtd = (struct method_t *)
        malloc(sizeof(struct method_t));
    if(!mtd) {
        free(method_name);
        free_data_t(envelope);
        json_decref(root);
        return NULL;
    }

    mtd->name = method_name;
    mtd->params = envelope->child;
    mtd->nparams = envelope->length;

    free(envelope);
    json_decref(root);

    return mtd;
}
示例#10
0
文件: rpc.c 项目: dyustc/searaft
// method result is expected in following format
// {
//        "result-type" : "<SUCCESS/ERROR>",
//        "result" : <error string or actual result>
// }
// return value or error needs to be freed
struct data_t *deserialize_result(const char *serialized, char **error) {
    json_t *root;
    json_error_t parse_error;
    
    root = json_loads(serialized, 0, &parse_error);

    if(!root || !json_is_object(root)) {
        if(root) json_decref(root);
        return NULL;
    }

    json_t *result_type = json_object_get(root, RESULT_TYPE_JSON_KEY);
    json_t *result = json_object_get(root, RESULT_JSON_KEY);

    if(!result_type || !result) {
        json_decref(root);
        return NULL;
    }

    if(!json_is_string(result_type)) {
        json_decref(root);
        return NULL;
    }

    if(0 == strcmp("SUCCESS", json_string_value(result_type))) {
        struct data_t *data = deserialize_data(result);
        json_decref(root);
        return data;
    } else {
        if(!json_is_string(result)) {
            json_decref(root);
            return NULL;
        }
        *error = private_strdup(json_string_value(result));
        json_decref(root);
    }

    return NULL;
}
// TODO: Fix segmentation fault after receiving 42 packets...
void receive_packets_handler()
{
    udp_pack packet;
    char *buffer = (char *)malloc(MTU*sizeof(char));
    int len, x, window_packets;

    fd_set fds;                // fd set declare
    struct timeval time_out;   // Struct for Timeout value

    printf("\n-------- Data Packets transfer begins --------\n");
    while(IS_TRANSFER_FIN == 0)
    {
        // This variable is used to count number of packets received in a window transmit from server.
        window_packets = 0;

        // Receive complete window.
        for(x = 0; ((x < window_size) && (IS_TRANSFER_FIN == 0)); x++)
        {
            bzero(buffer, MTU);

            // Receive Packet
            FD_ZERO(&fds);             // Clear the fd set
            FD_SET(client_sfd, &fds);           // Set the client fd for select

            time_out.tv_sec = 0;
            time_out.tv_usec = timeout;

            // Waiting until timeout for next packet
            if ( select(32, &fds, NULL, NULL, &time_out) == 0 )
            {
                printf("Packet receiving timed out. Expected packet with Seq. Number: %d\n", ordered_count + 1);
                break;
            }
            else
            {
                len = recvfrom(client_sfd, buffer, MTU, 0, (struct sockaddr *) &server_addr, &clen);
                if (len < 0)
                {
                    printf("\nError while receiving Packet at current count = %d\n", ordered_count);
                    report_error("\nERROR: Socket could not be read for ACK\n");
                }
                packet = deserialize_data(buffer);

                //printf("Serialized pack received: %s", buffer);

                //printf("Packet received: Seq. Num = %d | Is_Fin = %d | Data = %s", packet.seq_num, packet.is_fin, packet.data);

                printf("\nReceived Packet: Seq. Num: %d\n", packet.seq_num);

                // Buffer all packets, including out of sequence.
                int index = packet.seq_num - 1;

                packet_buffer[index] = packet;

                window_packets++;

                if(check_sequence_fin() == 1)    //Check if all packets in sequence until FIN
                {
                    printf("\nAll packets received and placed in order, Transfer finished\n");
                    IS_TRANSFER_FIN = 1;
                }
            }
        }

        //Delay to simulate high latency
        if(delays_enabled == 1)
        {
            // for every 3rd ack add a delay.
            if(sequence_num % 3 == 0)
            {
                printf("\n!!! Adding delay of 1500 micro seconds!!!");
                usleep(1500);  // Delay of 1000 micro seconds.
            }
        }

        //Update next expected window size, i.e. one more than received packets.
        window_size = window_packets + 1;

        send_ack();    //Send Cumulative ACK for entire window transferred by sender.
    }
    printf("\n-------- Data Packets transfer ends --------\n");
    printf("\nReceived packet count: %d\n", ordered_count);
}
/*
 * Function to establish handshake.
 */
int establish_handshake(char *req_file)
{
    int success = 0, n;

    udp_pack syn, synack, ack;

    fd_set fds;                // fd set declare
    struct timeval time_out;   // Struct for Timeout value

    initialize_packet(&syn, 2222, sequence_num, 0);

    char *synreq = (char *)malloc(MTU*sizeof(char));
    bzero(synreq, MTU);
    strcpy(synreq, serialize_packet(syn));

    // SYN
    //printf("\nSYN to send: %s", synreq);
    n = sendto(client_sfd, synreq, strlen(synreq), 0, (struct sockaddr *) &server_addr, clen);
    if (n < 0)
    {
      report_error("HANDSHAKE ERR: writing to socket for SYN");
    }
    sequence_num++;
    printf("\nHANDSHAKE SYN Sent\n");
    //gettimeofday(&start_timev,NULL);

    printf("\a");
    char *buffer = (char *)malloc(MTU*sizeof(char));
    bzero(buffer, MTU);

    // SYN-ACK
    FD_ZERO(&fds);             // Clear the fd set
    FD_SET(client_sfd, &fds);           // Set the client fd for select

    time_out.tv_sec = 0;
    time_out.tv_usec = timeout;

    // Waiting until timeout for SYNACK
    if ( select(32, &fds, NULL, NULL, &time_out) == 0 )
    {
        printf("SYNACK receiving timed out...\n");
    }
    else
    {
        bzero(buffer, MTU);
        n = recvfrom(client_sfd, buffer, MTU, 0, (struct sockaddr *) &server_addr, &clen);
        if (n < 0)
        {
          report_error("HANDSHAKE ERR: reading from socket for SYNACK");
        }
        //printf("\nSYNACK response: %s", buffer);

        synack = deserialize_data(buffer);

        if(synack.is_ack != 1)
        {
            report_error("HANDSHAKE ERR: SYNACK not received from server during handshake");
        }
        printf("\nHANDSHAKE SYNACK received\n");

        ack = synack;
        ack.seq_num = sequence_num;
        ack.ack_num = ack.seq_num + 1;
        ack.is_ack = 1;
        memset(ack.data, 0, DATALEN);
        strcpy(ack.data, req_file);

        char *ackpack = (char *)malloc(MTU*sizeof(char));
        bzero(ackpack, MTU);
        strcpy(ackpack, serialize_packet(ack));

        //printf("Filename sent : %s", ackpack);

        // ACK
        //printf("\nACK to send: %s", ackpack);
        n = sendto(client_sfd, ackpack, strlen(ackpack), 0, (struct sockaddr *) &server_addr, clen);
        if (n < 0)
        {
          report_error("HANDSHAKE ERR: writing to socket Handshake ACK");
        }
        printf("\nHANDSHAKE ACK Sent\n");
        sequence_num++;

        success = 1;
        printf("\n-------- Handshake Successful --------\n");
    }
    return success;
}
示例#13
0
文件: cpu.c 项目: avaudagna/elestac
int recibir_pcb(int kernelSocketClient, t_kernel_data *kernel_data_buffer) {
    void * buffer = calloc(1,sizeof(int));
    char * kernel_operation = calloc(1, sizeof(char));
    int deserialized_data_index = 0;

    if(buffer == NULL) {
        log_error(cpu_log, "recibir pcb buffer mem alloc failed");
        return ERROR;
    }

    printf(" .:: Waiting PCB from Kernel ::.\n");
    if( recv(kernelSocketClient , kernel_operation , sizeof(char) , 0) <= 0) {
        log_error(cpu_log, "KERNEL handshake response receive failed");
        return ERROR;
    }
    if( *kernel_operation != '1') {
        log_error(cpu_log, "Wrong KERNEL handshake response received");
        return ERROR;
    }
    free(kernel_operation);

    //Quantum data
    if( recv(kernelSocketClient , buffer , sizeof(int) , 0) <= 0) {
        log_error(cpu_log, "Q recv failed");
        return ERROR;
    }
    deserialize_data(&kernel_data_buffer->Q , sizeof(int), buffer, &deserialized_data_index);
    printf(ANSI_COLOR_BLUE);
    log_info(cpu_log, "Q: %d", kernel_data_buffer->Q);
    printf(ANSI_COLOR_RESET);

    if( recv(kernelSocketClient , buffer , sizeof(int) , 0) <= 0) {
        log_error(cpu_log, "QSleep recv failed");
        return ERROR;
    }
    deserialized_data_index = 0;
    deserialize_data(&kernel_data_buffer->QSleep , sizeof(int), buffer, &deserialized_data_index);
    printf(ANSI_COLOR_BLUE);
    log_info(cpu_log, "QSleep: %d", kernel_data_buffer->QSleep);
    printf(ANSI_COLOR_RESET);

    if( recv(kernelSocketClient ,buffer , sizeof(int) , 0) <= 0) {
        log_error(cpu_log, "pcb_size recv failed");
        return ERROR;
    }
    deserialized_data_index = 0;
    deserialize_data(&kernel_data_buffer->pcb_size , sizeof(int), buffer, &deserialized_data_index);

    log_info(cpu_log, "pcb_size: %d", kernel_data_buffer->pcb_size);
    free(buffer);

    kernel_data_buffer->serialized_pcb = calloc(1, (size_t ) kernel_data_buffer->pcb_size);
    if(kernel_data_buffer->serialized_pcb  == NULL) {
        log_error(cpu_log, "serialized_pcb mem alloc failed");
        return ERROR;
    }
    if( recv(kernelSocketClient , kernel_data_buffer->serialized_pcb , (size_t )  kernel_data_buffer->pcb_size , 0) <= 0) {
        log_error(cpu_log, "serialized_pcb recv failed");
        return ERROR;
    }

    return SUCCESS;
}
示例#14
0
void catalog_object::deserialize(xptr p)
{
    cs_stream stream((p == XNULL) ? (p = p_object) : (p_object = p), cs_stream::mode_read);
    stream.seek(4);
    deserialize_data(stream);
}
示例#15
0
t_posicion definirVariable(t_nombre_variable variable) {
    if(status_check() != EXECUTING)
        return ERROR;

    //1) Obtener el stack index actual
    t_stack* actual_stack_index = actual_pcb->stack_index;

    //2) Obtengo la primera posicion libre del stack
    t_posicion actual_stack_pointer = (t_posicion) actual_pcb->stack_pointer;

    //3) Armamos la logical address requerida
    logical_addr* direccion_espectante = armar_direccion_logica_variable(actual_stack_pointer, setup->PAGE_SIZE);

    int valor = 0;

    t_list * pedidos = NULL;
    //TODO: CAMBIAR ESTO PARA QUE LA LISTA DE PEDIDOS SEA DE NUMEROS, NO DE SPRINTF
    obtener_lista_operaciones_escritura(&pedidos, actual_stack_pointer, ANSISOP_VAR_SIZE, valor);

    int index = 0;
    t_nodo_send * nodo = NULL;
    char * umc_response_buffer = calloc(1, sizeof(char));
    if(umc_response_buffer == NULL) {
        log_error(cpu_log, "definirVariable umc_response_buffer mem alloc failed");
        return ERROR;
    }

    char operation;
    int page, offset, size, print_index = 0;
    while (list_size(pedidos) > 0) {
        nodo = list_remove(pedidos, index);
        deserialize_data(&operation, sizeof(char), nodo->data, &print_index);
        deserialize_data(&page, sizeof(int), nodo->data, &print_index);
        deserialize_data(&offset, sizeof(int), nodo->data, &print_index);
        deserialize_data(&size, sizeof(int), nodo->data, &print_index);
        log_info(cpu_log, "Sending request op:%c (%d,%d,%d) to define variable '%c' with value %d", operation, page, offset, size, variable, valor);
        if( send(umcSocketClient, nodo->data , (size_t ) nodo->data_length, 0) < 0) {
            log_error(cpu_log, "UMC expected addr send failed");
            return ERROR;
        }

        if(check_umc_response(recv_umc_response_status()) != SUCCESS) {
            return ERROR;
        }

    }

    list_destroy(pedidos); //Liberamos la estructura de lista reservada

    free(umc_response_buffer);

    //5) Si esta bien, agregamos la nueva t_var al stack
    t_var * nueva_variable = calloc(1, sizeof(t_var));
    nueva_variable->var_id = variable;
    nueva_variable->page_number = direccion_espectante->page_number;
    nueva_variable->offset = direccion_espectante->offset;
    nueva_variable->tamanio = direccion_espectante->tamanio;

    //6) Actualizo el stack pointer
    actual_pcb->stack_pointer += nueva_variable->tamanio;

    free(direccion_espectante);
    t_stack_entry *last_entry = get_last_entry(actual_stack_index);
    add_var( &last_entry, nueva_variable);

    //7) y retornamos la t_posicion asociada
    t_posicion posicion_nueva_variable = get_t_posicion(nueva_variable);
    return posicion_nueva_variable;
}