int main(int argc, char **argv) { printf("Starting...\n"); MyThread *mt = new MyThread; mt->Initialize(1024); if (!mt->Start(MyThread::Run)) do printf("Thread yielded...\n"); while (!ResumeThread(mt)); printf("Done!\n"); return 0; }
int main(PRIntn argc, char *argv[]) { PRStatus rv; PRUintn keys; MyThread *thread; const RCThreadPrivateData *pd; PLOptStatus os; PLOptState *opt = PL_CreateOptState(argc, argv, "d"); RCThread *primordial = RCThread::WrapPrimordialThread(); while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) { if (PL_OPT_BAD == os) continue; switch (opt->option) { case 'd': /* debug mode */ debug = PR_TRUE; break; default: break; } } PL_DestroyOptState(opt); fout = PR_STDOUT; MyPrivateData extension = MyPrivateData("EXTENSION"); MyPrivateData key_string[] = { "Key #0", "Key #1", "Key #2", "Key #3", "Bogus #5", "Bogus #6", "Bogus #7", "Bogus #8"}; did = should = PR_FALSE; for (keys = 0; keys < 4; ++keys) { rv = RCThread::NewPrivateIndex(&key[keys]); key[keys + 4] = key[keys] + 4; MY_ASSERT(PR_SUCCESS == rv); } PrintProgress(__LINE__); /* the first four should be bu null, the last four undefined and null */ did = should = PR_FALSE; for (keys = 0; keys < 8; ++keys) { pd = RCThread::GetPrivateData(key[keys]); MY_ASSERT(NULL == pd); } PrintProgress(__LINE__); /* initially set private data for new keys */ did = should = PR_FALSE; for (keys = 0; keys < 4; ++keys) { rv = RCThread::SetPrivateData(key[keys], &key_string[keys]); MY_ASSERT(PR_SUCCESS == rv); } PrintProgress(__LINE__); /* re-assign the private data, albeit the same content */ did = PR_FALSE; should = PR_TRUE; for (keys = 0; keys < 4; ++keys) { pd = RCThread::GetPrivateData(key[keys]); PR_ASSERT(NULL != pd); rv = RCThread::SetPrivateData(key[keys], &key_string[keys]); MY_ASSERT(PR_SUCCESS == rv); } PrintProgress(__LINE__); /* set private to <empty> */ did = PR_FALSE; should = PR_TRUE; for (keys = 0; keys < 4; ++keys) { rv = RCThread::SetPrivateData(key[keys]); MY_ASSERT(PR_SUCCESS == rv); } PrintProgress(__LINE__); /* should all be null now */ did = should = PR_FALSE; for (keys = 0; keys < 4; ++keys) { pd = RCThread::GetPrivateData(key[keys]); PR_ASSERT(NULL == pd); } PrintProgress(__LINE__); /* allocate another batch of keys and assign data to them */ did = should = PR_FALSE; for (keys = 8; keys < 127; ++keys) { rv = RCThread::NewPrivateIndex(&key[keys]); MY_ASSERT(PR_SUCCESS == rv); rv = RCThread::SetPrivateData(key[keys], &extension); MY_ASSERT(PR_SUCCESS == rv); } PrintProgress(__LINE__); /* set all the extended slots to <empty> */ did = PR_FALSE; should = PR_TRUE; for (keys = 8; keys < 127; ++keys) { rv = RCThread::SetPrivateData(key[keys]); MY_ASSERT(PR_SUCCESS == rv); } PrintProgress(__LINE__); /* set all the extended slots to <empty> again (noop) */ did = should = PR_FALSE; for (keys = 8; keys < 127; ++keys) { rv = RCThread::SetPrivateData(key[keys]); MY_ASSERT(PR_SUCCESS == rv); } if (debug) PR_fprintf(fout, "Creating thread\n"); thread = new MyThread(); if (debug) PR_fprintf(fout, "Starting thread\n"); thread->Start(); if (debug) PR_fprintf(fout, "Joining thread\n"); (void)thread->Join(); if (debug) PR_fprintf(fout, "Joined thread\n"); failed |= (PR_FAILURE == RCPrimordialThread::Cleanup()); (void)PR_fprintf( fout, "%s\n",((PR_TRUE == failed) ? "FAILED" : "PASSED")); return (failed) ? 1 : 0; } /* main */