void ImportTracker::cleanUp()
{
	clear();
	if(linksetgroups.size())
	{
		if(groupcounter < (linksetgroups.size() - 1))
		{
			++groupcounter;
			LLSD ls_llsd;
			ls_llsd=linksetgroups[groupcounter]["Object"];
			linksetoffset=linksetgroups[groupcounter]["ObjectPos"];
			import(ls_llsd);
		}
	}
	else cleargroups();
}
int main(unsigned long long speid, addr64 argp, addr64 envp)
{
  // Check size of structures, these offsets must match assembly
  STATIC_ASSERT(sizeof(struct OgrLevel) == 6*16+16+16);
  STATIC_ASSERT(sizeof(struct OgrState) == 2*16 + 8*16*29);
  STATIC_ASSERT(sizeof(CellOGRCoreArgs) == 16 + 2*16 + 8*16*29 + 16 + 16 + 16);
  STATIC_ASSERT(offsetof(CellOGRCoreArgs, state       ) == 16);
  STATIC_ASSERT(offsetof(CellOGRCoreArgs, state.Levels) == 16 + 32);
  STATIC_ASSERT(sizeof(u16) == 2); /* DMA fetches of pchoose */
  
  (void) speid; (void) envp;

  // One DMA used in program
  mfc_write_tag_mask(1<<DMA_ID);

  // Fetch arguments from main memory
  mfc_get(&myCellOGRCoreArgs, argp.a32[1], sizeof(CellOGRCoreArgs), DMA_ID, 0, 0);
  mfc_read_tag_status_all();

  s32 retval;
  /* check for memory corruption in incoming arguments */
  if (myCellOGRCoreArgs.sign1 != SIGN_PPU_TO_SPU_1)
  {
    retval = RETVAL_ERR_BAD_SIGN1;
    goto done;
  }
  if (myCellOGRCoreArgs.sign2 != SIGN_PPU_TO_SPU_2)
  {
    retval = RETVAL_ERR_BAD_SIGN2;
    goto done;
  }

  // Prepare arguments to be passed to the core
  struct OgrState* state = &myCellOGRCoreArgs.state;
  int* pnodes   = &myCellOGRCoreArgs.pnodes;
  u32  upchoose = myCellOGRCoreArgs.upchoose;
  
  static int cached_maxdepth;
  if (state->maxdepth != cached_maxdepth)
  {
    cached_maxdepth = state->maxdepth;
    cleargroups();
  }

  // Call the core
//  s32 retval = SPE_CORE_FUNCTION(CORE_NAME) (state, pnodes, ogr_choose_dat);
  if (*pnodes) /* core will not handle nodes == 0 */
    myCellOGRCoreArgs.ret_depth = ogr_cycle_256_test(state, pnodes, upchoose);

  // Check for memory corruption after core exit
  if (myCellOGRCoreArgs.sign1 != SIGN_PPU_TO_SPU_1)
    retval = RETVAL_ERR_TRASHED_SIGN1;
  else if (myCellOGRCoreArgs.sign2 != SIGN_PPU_TO_SPU_2)
    retval = RETVAL_ERR_TRASHED_SIGN2;
  else
    retval = 0;

  update_groups_stats();

done:
  // Update changes in main memory
  myCellOGRCoreArgs.sign1 = SIGN_SPU_TO_PPU_1;
  myCellOGRCoreArgs.sign2 = SIGN_SPU_TO_PPU_2;
  mfc_put(&myCellOGRCoreArgs, argp.a32[1], sizeof(CellOGRCoreArgs), DMA_ID, 0, 0);
  mfc_read_tag_status_all();

  return retval; /* no status codes in ogr-ng, core info returned in ret_depth */
}