void storage_header::zero_partition(int p) { auto& part = ptable.at(p); memset(&this->vla[part.offset], 0, part.length); part = {}; // NOTE: generate **NEW** checksum for header this->crc = generate_checksum(); }
/* * This function verifies checksum of a packet * * @arg packet: pointer to packet whose checksum is to be verified * @return: 0 if the checksum matches, non-zero integer * representing difference between expected checksum and actual * checksum otherwise */ int verify_packet(struct pkt *packet){ int sum = generate_checksum(packet); sum = sum - packet->checksum; return sum; }
void* sort_main(void * arg) { int i; int hw_threads; int sw_threads; unsigned int *data, *copy; logging_init(); unsigned int generate_ms; unsigned int sort_ms; unsigned int merge_ms; unsigned int check_ms; hw_threads = NUM_HWTS; sw_threads = NUM_SWTS; // init mailboxes mbox_init(&mb_start,NUM_BLOCKS); mbox_init(&mb_stop ,NUM_BLOCKS); // init reconos and communication resources reconos_init(); res[0].type = RECONOS_TYPE_MBOX; res[0].ptr = &mb_start; res[1].type = RECONOS_TYPE_MBOX; res[1].ptr = &mb_stop; INFO("Creating %i hw-threads: ", hw_threads); for (i = 0; i < hw_threads; i++) { INFO(" %i",i); reconos_hwt_setresources(&(hwt[i]),res,2); reconos_hwt_create(&(hwt[i]),i,NULL); } INFO("\n"); // init software threads INFO("Creating %i sw-threads: ",sw_threads); for (i = 0; i < sw_threads; i++) { INFO(" %i",i); pthread_attr_init(&swt_attr[i]); pthread_create(&swt[i], &swt_attr[i], sort_thread, (void*)res); } INFO("\n"); // create pages and generate data generate_ms = time_ms(); INFO("malloc page aligned ...\n"); data = malloc(NUM_BLOCKS*BLOCK_WORDS*sizeof*data); copy = malloc(NUM_BLOCKS*BLOCK_WORDS*sizeof*data);; INFO("generate data ...\n"); generate_data(data,NUM_BLOCKS*BLOCK_WORDS); memcpy(copy,data,NUM_BLOCKS*BLOCK_WORDS*sizeof*data); generate_ms = time_ms() - generate_ms; // Start sort threads sort_ms = time_ms(); INFO("Putting %i blocks into job queue: ", NUM_BLOCKS); for (i = 0; i < NUM_BLOCKS; i++) { INFO(" %i",i); mbox_put(&mb_start,(unsigned int)data+(i*BLOCK_WORDS)); } // Wait for results INFO("\nWaiting for %i acknowledgements: ", NUM_BLOCKS); for (i = 0; i < NUM_BLOCKS; i++) { INFO(" %i",i); mbox_get(&mb_stop); } INFO("\n"); sort_ms = time_ms() - sort_ms; // merge data merge_ms = time_ms(); INFO("Merging sorted data slices...\n"); unsigned int * temp = malloc(NUM_BLOCKS*BLOCK_WORDS*sizeof*temp); mergesort(data,temp,BLOCK_WORDS,NUM_BLOCKS); data = temp; /* data = recursive_merge( data, temp, NUM_BLOCKS*BLOCK_WORDS, BLOCK_WORDS, simple_merge ); */ merge_ms = time_ms() - merge_ms; // check data check_ms = time_ms(); INFO("Quick check sorted data (checksum = %d): ... ",generate_checksum(copy,NUM_BLOCKS*BLOCK_WORDS)); if(quick_check_data(data,NUM_BLOCKS*BLOCK_WORDS,generate_checksum(copy,NUM_BLOCKS*BLOCK_WORDS)) != 0){ INFO("FAILURE\r\n"); } else { INFO("success\n"); } /* INFO("Checking sorted data: ... "); ret = check_data( data, copy, TO_WORDS(buffer_size)); if (ret >= 0) { INFO("failure at word index %i\n", -ret); INFO("expected 0x%08X found 0x%08X\n",copy[ret],data[ret]); INFO("dumping the first 2048 words:\n"); for(i = 0; i < 2048; i++){ INFO("%08X ",data[i]); if((i % 8) == 7) INFO("\n"); } } else { INFO("success\n"); //print_data(data, TO_WORDS(buffer_size)); } */ check_ms = time_ms() - check_ms; // terminate all threads INFO("Sending terminate message to %i threads:", hw_threads + sw_threads); for (i = 0; i < hw_threads + sw_threads; i++) { INFO(" %i",i); mbox_put(&mb_start,UINT_MAX); } INFO("\n"); INFO("Waiting for termination...\n"); for (i=0; i<hw_threads; i++) { pthread_join(hwt[i].delegate,NULL); } for (i=0; i<sw_threads; i++) { pthread_join(swt[i],NULL); } INFO("done\n"); INFO("Running times (size: %d words, %d hw-threads, %d sw-threads):\n", NUM_BLOCKS*BLOCK_WORDS, hw_threads, sw_threads); INFO("\tGenerate data: %lu ms\n",generate_ms); INFO("\tSort data : %lu ms\n",sort_ms); INFO("\tMerge data : %lu ms\n",merge_ms); INFO("\tCheck data : %lu ms\n",check_ms); INFO("Total computation time (sort & merge): %lu ms\n",sort_ms + merge_ms); //free(data); // Memory Leak on variable data!!! while(1); return NULL; }