Esempio n. 1
0
/*************
 * DESCRIPTION:   send a shutdown message to a subtask and free subtask structure
 * INPUT:         st       subtask structure
 * OUTPUT:        -
 *************/
void KillSubTaskPPC(struct SubTask *st)
{
	SendSubTaskMsgPPC(st,STC_SHUTDOWN,st);
	if(st->st_Port)
		DeleteMsgPortPPC(st->st_Port);
	if(st->st_Reply)
		DeleteMsgPortPPC(st->st_Reply);
	FreeVec(st);
}
Esempio n. 2
0
/*************
 * DESCRIPTION:   create a subtask
 * INPUT:         type     type of subtask
 *                sigbit   signal bit for reply port
 *                name     name of the task
 *                priority
 *                stack
 * OUTPUT:        subtask structure
 *************/
struct SubTask *CreateSubTaskPPC(ULONG type, LONG sigbit, char *name, ULONG priority, ULONG stack)
{
	struct SubTask *st;

	st = (struct SubTask*)AllocVec(sizeof(struct SubTask), MEMF_PUBLIC|MEMF_CLEAR);
	if(st)
	{
		st->st_Reply = CreateMsgPortPPC();
		if(!st->st_Reply)
		{
			FreeVec(st);
			return NULL;
		}
		st->st_Port = CreateMsgPortPPC();
		if(!st->st_Port)
		{
			DeleteMsgPortPPC(st->st_Reply);
			FreeVec(st);
			return NULL;
		}
		st->st_Task = (struct Task *)CreateTaskPPCTags(
			TASKATTR_CODE, PreviewSubTaskPPC,
			TASKATTR_NAME, name,
			//TASKATTR_PRI, priority,
			TASKATTR_R3, st,
			//TASKATTR_STACKSIZE, stack,
			TAG_DONE);
		if(!st->st_Task)
		{
			FreeVec(st);
			st = NULL;
		}
	}
	return st;
}
Esempio n. 3
0
void amigaExit(void)
{
   #if USE_RESETHANDLER
   rem_resethandler();
   #endif

   #ifndef NO_GUI
   amigaCloseNewConsole();
   amigaGUIDeinit();
   #endif

   #ifdef __amigaos4__
   if (ISocket) DropInterface((struct Interface *)ISocket);
   #else
   CloseLibrary((struct Library *)LocaleBase);
   #endif
   CloseLibrary((struct Library *)SocketBase);

   #ifdef __OS3PPC__
   /*
   ** PPC
   */
   #ifdef CHANGE_MIRROR_TASK_PRI
   SetTaskPri(FindTask(NULL), Old68kMirrorPri);
   #endif
   #ifdef __POWERUP__
   /*
   ** PowerUp
   */
   if (TriggerPort) {
      while (!PPCDeletePort(TriggerPort)) amigaSleep(0,250000);
   }
   CloseLibrary(PPCLibBase);
   #else
   /*
   ** WarpOS
   */
   if (TriggerPort) {
      RemPortPPC(TriggerPort);
      DeleteMsgPortPPC(TriggerPort);
   }
   #endif
   #else
   /*
   ** 68K / OS4 / MorphOS
   */
   if (TriggerPort) {
      RemPort(TriggerPort);
      DeleteMsgPort(TriggerPort);
   }
   #endif

   GlobalTimerDeinit();

   #if USE_RESETHANDLER
   finish_resethandler();
   #endif
}
Esempio n. 4
0
int amigaPutTriggerSigs(ULONG trigs)
{
   int done = -1;

   #ifndef __OS3PPC__
   /*
   ** 68K / OS4 / MorphOS
   */
   struct TriggerMessage msg;
   if ((msg.tm_ExecMsg.mn_ReplyPort = CreateMsgPort())) {
      struct MsgPort *port;
      msg.tm_TriggerType = trigs;
      msg.tm_ExecMsg.mn_Node.ln_Type = NT_MESSAGE;
      msg.tm_ExecMsg.mn_Length = sizeof(struct TriggerMessage);

      Forbid();
      if ((port = FindPort("dnetc")) && port != TriggerPort) {
         PutMsg(port,(struct Message *)&msg);
      }
      Permit();
      if (port && port != TriggerPort) {
         WaitPort(msg.tm_ExecMsg.mn_ReplyPort);
         GetMsg(msg.tm_ExecMsg.mn_ReplyPort);
         done = 1;
      }
      else {
         done = 0;
      }
      DeleteMsgPort(msg.tm_ExecMsg.mn_ReplyPort);
   }
   #elif !defined(__POWERUP__)
   /*
   ** WarpOS
   */
   struct TriggerMessage msg;
   struct MsgPortPPC *replyport;
   if ((replyport = CreateMsgPortPPC())) {
      msg.tm_ExecMsg.mn_ReplyPort = (struct MsgPort *)replyport;
      msg.tm_ExecMsg.mn_Node.ln_Type = NT_MESSAGE;
      msg.tm_ExecMsg.mn_Length = sizeof(struct TriggerMessage);
      msg.tm_TriggerType = trigs;

      struct MsgPortPPC *port;
      if ((port = FindPortPPC("dnetc")) && port != TriggerPort) {
         PutMsgPPC(port,(struct Message *)&msg);
         WaitPortPPC(replyport);
         GetMsgPPC(replyport);
         done = 1;
      }
      else {
         done = 0;
      }
      DeleteMsgPortPPC(replyport);
   }
   #else
   /*
   ** PowerUp
   */
   struct TagItem tags[2] = { {PPCPORTTAG_NAME, (ULONG)"dnetc"}, {TAG_END,0} };
   void *msg, *replyport, *port;
   if ((replyport = PPCCreatePort(NULL))) {
      if ((msg = PPCCreateMessage(replyport,0))) {
         done = 0;
         if ((port = PPCObtainPort(tags))) {
            if (port != TriggerPort) {
               if (PPCSendMessage(port,msg,NULL,0,trigs)) {
                  PPCWaitPort(replyport);
                  PPCGetMessage(replyport);
                  done = 1;
               }
            }
            PPCReleasePort(port);
         }
         PPCDeleteMessage(msg);
      }
      PPCDeletePort(replyport);
   }
   #endif

   return(done);
}