Esempio n. 1
0
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;
}
Esempio n. 3
0
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;
}