/*ident "@(#)cls4:demo/task/triv.C 1.1" */ /******************************************************************************* C++ source for the C++ Language System, Release 3.0. This product is a new release of the original cfront developed in the computer science research center of AT&T Bell Laboratories. Copyright (c) 1991 AT&T and UNIX System Laboratories, Inc. Copyright (c) 1984, 1989, 1990 AT&T. All Rights Reserved. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE of AT&T and UNIX System Laboratories, Inc. The copyright notice above does not evidence any actual or intended publication of such source code. *******************************************************************************/ #include /* trivial task example: Make a set of tasks which pass an object round between themselves. Each task gets an object from the head of one queue, and puts the object on the tail of another queue. Main creates each task, then puts the object on a queue. Each task quits after getting the object MAX_CYCLES times. */ const int NTASKS = 1; const int MAX_CYCLES = 5; struct pc : task { // derive a class from task pc(char*, qtail*, qhead*); // task is not intended to }; // be used directly pc::pc(char* n, qtail* t, qhead* h) :task(n) // task body serves as { // "main" program for task printf("new pc(%s)\n",n); for (int i = 0; i < MAX_CYCLES; i++) { object* p = h->get(); printf("task %s\n",n); t->put(p); } printf("task %s: done.\n", n); resultis(0); // Always end task constructors with resultis. // Behavior of those using return or running // off the end of the function is undefined. // Alternatively, use an infinite loop in // constructor body. } main() { qhead* hh = new qhead; qtail* t = hh->tail(); // hh and t refer to same queue. qhead* h; printf("main\n"); for (int i=0; itail(); } new pc("first pc",t,hh); // create another new task printf("main: here we go\n"); t->put(new object); // put the object on a queue printf("main: exit\n"); thistask->resultis(0); // main is a task too; it must also // end with resultis (to allow any // remaining tasks to run, otherwise // the whole process would exit). }