Skip to content

Instantly share code, notes, and snippets.

@cyring
Last active September 30, 2019 15:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cyring/dc3a0009cd287ced0355b825b51cbb0e to your computer and use it in GitHub Desktop.
Save cyring/dc3a0009cd287ced0355b825b51cbb0e to your computer and use it in GitHub Desktop.
Tasks Insertion Sort for CoreFreq
@cyring
Copy link
Author

cyring commented Sep 30, 2019

  • Below is a draft code to replace qsort() with an insertion sort.
    However, cycles benchmark is in favor of qsort
Func TSC INST.
insert 205476 585834
qsort 133632 135872
void SysGate_Update(REF *Ref)
{
	SHM_STRUCT *Shm = Ref->Shm;
	SYSGATE *SysGate = Ref->SysGate;

	Shm->SysGate.taskCount = SysGate->taskCount;
/*
	memcpy( Shm->SysGate.taskList, SysGate->taskList,
		Shm->SysGate.taskCount * sizeof(TASK_MCB));

	qsort_r(Shm->SysGate.taskList, Shm->SysGate.taskCount, sizeof(TASK_MCB),
		Shm->SysGate.trackTask ?
			  SortByTracker
			: SortByFunc[Shm->SysGate.sortByField], Shm);
*/

	memset( Shm->SysGate.taskList, Shm->SysGate.reverseOrder ? -1 : 0,
		Shm->SysGate.taskCount * sizeof(TASK_MCB));

	unsigned int i, j;
  for (j = 0; j < Shm->SysGate.taskCount; j++) {
    for (i = 1; i < Shm->SysGate.taskCount; i++) {
	unsigned int f = 0;
      switch (Shm->SysGate.sortByField) {
      case F_STATE:
	f = SysGate->taskList[j].state < Shm->SysGate.taskList[i].state;
	break;
      case F_RTIME:
	f = SysGate->taskList[j].runtime > Shm->SysGate.taskList[i].runtime;
	break;
      case F_UTIME:
	f = SysGate->taskList[j].usertime > Shm->SysGate.taskList[i].usertime;
	break;
      case F_STIME:
	f = SysGate->taskList[j].systime > Shm->SysGate.taskList[i].systime;
	break;
      case F_PID:
	f = SysGate->taskList[j].pid < Shm->SysGate.taskList[i].pid;
	break;
      case F_COMM:
	f = strncmp(SysGate->taskList[j].comm, Shm->SysGate.taskList[i].comm,
			TASK_COMM_LEN) < 0;
	break;
      }
      if (f ^ Shm->SysGate.reverseOrder) {
	size_t shift = (Shm->SysGate.taskCount - i - 1) * sizeof(TASK_MCB);
	if (shift != 0)
		memmove(&Shm->SysGate.taskList[i + 1],
			&Shm->SysGate.taskList[i], shift);

	memcpy( &Shm->SysGate.taskList[i],
		&SysGate->taskList[j],
		sizeof(TASK_MCB) );

	break;
      }
    }
  }

	Shm->SysGate.memInfo.totalram  = SysGate->memInfo.totalram;
	Shm->SysGate.memInfo.sharedram = SysGate->memInfo.sharedram;
	Shm->SysGate.memInfo.freeram   = SysGate->memInfo.freeram;
	Shm->SysGate.memInfo.bufferram = SysGate->memInfo.bufferram;
	Shm->SysGate.memInfo.totalhigh = SysGate->memInfo.totalhigh;
	Shm->SysGate.memInfo.freehigh  = SysGate->memInfo.freehigh;

	Shm->SysGate.OS.IdleDriver.stateLimit=SysGate->OS.IdleDriver.stateLimit;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment