open_toontown_panda3d/panda/src/ipc/test_priority.cxx

82 lines
2.3 KiB
C++

// Filename: test_priority.cxx
// Created by: cary (16Sep98)
//
////////////////////////////////////////////////////////////////////
#include <pandabase.h>
#include <stdlib.h>
#include <stdio.h>
#include "ipc_thread.h"
// test thread priorities
#if defined(__arm__) && defined(__atmos__)
#define flush ""
#endif /* __arm__ */
static void func(void*);
static int loop_iterations;
static mutex print_mutex;
#define PRINTMSG(x) { mutex_lock l(print_mutex); x << flush; }
int main(int argc, char** argv)
{
unsigned long s1, s2, n1, n2;
char buf[20];
if ((argc != 2) || (argv[1][0] == '-')) {
cerr << "Usage: " << argv[0] << " loop_iterations" << endl;
exit(1);
}
loop_iterations = atoi(argv[1]);
thread::get_time(s1, n1);
for (int i=0; i<loop_iterations; ++i);
thread::get_time(s2, n2);
if (n2 > n1) {
n2 -= n1;
s2 -= s1;
} else {
n2 = n2 + 1000000000 - n1;
s2 = s2 - 1 - s1;
}
sprintf(buf, "%d.%03d", s2, n2/1000000);
cout << argv[0] << ": doing " << loop_iterations
<< " loop itterations (approx " << buf << " seconds per loop)"
<< endl;
PRINTMSG(cout << "main: creating h1" << endl);
thread::create(func, (void*)"h1", thread::PRIORITY_HIGH);
PRINTMSG(cout << "main: creating m1" << endl);
thread::create(func, (void*)"m1", thread::PRIORITY_NORMAL);
PRINTMSG(cout << "main: creating l1" << endl);
thread::create(func, (void*)"l1", thread::PRIORITY_LOW);
PRINTMSG(cout << "main: creating h2" << endl);
thread::create(func, (void*)"h2", thread::PRIORITY_HIGH);
PRINTMSG(cout << "main: creating m2" << endl);
thread::create(func, (void*)"m2", thread::PRIORITY_NORMAL);
PRINTMSG(cout << "main: creating l2" << endl);
thread::self()->set_priority(thread::PRIORITY_LOW);
func((void*)"l2");
return 0;
}
static void func(void* arg)
{
char *name = (char *)arg;
while (1) {
PRINTMSG(cout << name << ": entering 1st compute-bound loop" << endl);
int i;
for (i=0; i<loop_iterations; ++i);
PRINTMSG(cout << name << ": left compute-bound loop; yielding" << endl);
thread::yield();
PRINTMSG(cout << name << ": entering 2nd compute-bound loop" << endl);
for (i=0; i<loop_iterations; ++i);
PRINTMSG(cout << name
<< ": left compute-bound loop; sleeping for 2 seconds" << endl);
thread::sleep(2);
}
}