denis@vlsisj.VLSI.COM (/) (05/19/89)
Help! When I run the code below I meet the Guru! Can anyone help me out?
I am trying to write a program that starts up and creates several tasks.
The C program has all of the code for each of the tasks. After the
main prcedure starts the tasks I want it to wait for all of the tasks to
finish. After all tasks have finished the main program should remove them
and exit. My first attempt is shown below. I wrote a simple semaphore
server process so that the task can signal the main program when it is
done. Everything seems to work fine until I run AddTask. At that point
my system gurus. What am I doing wrong? Do I need to use something other
than the address of the procedure in AddTask? I am using the MANX C compiler
with sdb. Any ideas would be appreciated!
I also have a question on how a task can wait to be deleted. I would like
to just put it to sleep. The only way I could think of to do this is to
wait on a signal that will never happen. Is there a better way?
#include <exec/memory.h>
#include <exec/tasks.h>
#include <functions.h>
#include <stdio.h>
#include "semaphore.h"
#define STACK_SIZE ((long) 1000)
long uid = 0;
void task()
{
long signal;
signal = AllocSignal((long) -1);
semaphore_V(uid);
if (signal != -1) {
Wait(signal);
} else {
/* this is bad, how else can we wait to be removed? */
while (TRUE);
}
}
struct Task *start_task()
{
struct Task *p_task;
APTR p_stack;
p_stack = AllocMem(STACK_SIZE, MEMF_CLEAR);
if (! p_stack) {
/* error: not enough memory */
return NULL;
}
p_task = AllocMem((long) sizeof(struct Task), MEMF_CLEAR |
MEMF_PUBLIC);
if (! p_task) {
/* error: not enought memory */
FreeMem(p_stack, STACK_SIZE);
return NULL;
}
p_task->tc_Node.ln_Type = NT_TASK;
p_task->tc_Node.ln_Name = "task";
p_task->tc_SPLower = p_stack;
p_task->tc_SPUpper = p_stack + STACK_SIZE;
p_task->tc_SPReg = p_task->tc_SPUpper;
AddTask(p_task, task, NULL);
return p_task;
}
void stop_task(p_task)
struct Task *p_task;
{
RemTask(p_task);
/*
FreeMem(p_task->tc_SPLower, STACK_SIZE);
FreeMem(p_task, (long) sizeof(struct Task));
*/
}
main()
{
struct Task *p_task;
long uid;
if (! semaphore_init()) {
fprintf(stderr, "can't init semaphores...\n");
exit(1);
}
uid = semaphore_new(0L);
if (! uid) {
fprintf(stderr, "can't create a new semaphore...\n");
exit(1);
}
p_task = start_task();
semaphore_P(uid);
stop_task(p_task);
semaphore_delete(uid);
semaphore_term();
}
--
Denis Bohm (usenet: decwrl!vlsisj!denis)deven@rpi.edu (Deven Corzine) (05/21/89)
In article <15230@vlsisj.VLSI.COM> denis@vlsisj.VLSI.COM (/) writes: > /* this is bad, how else can we wait to be removed? */ > while (TRUE); Wait(0L); Deven -- shadow@[128.113.10.2] <shadow@pawl.rpi.edu> Deven T. Corzine (518) 272-5847 shadow@[128.113.10.201] <shadow@acm.rpi.edu> 2346 15th St. Pi-Rho America deven@rpitsmts.bitnet <userfxb6@rpitsmts> Troy, NY 12180-2306 <<tionen>> "Simple things should be simple and complex things should be possible." - A.K.