Exemple #1
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;
}
Exemple #2
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);
}
Exemple #3
0
int amigaInit(int *argc, char **argv[])
{
   int done = TRUE;

   #if !defined(__POWERUP__) && !defined(__amigaos4__) && !defined(__MORPHOS__)
   if (!MemInit()) return FALSE;
   #endif

   #ifdef __OS3PPC__
   /*
   ** PPC
   */

   /* Set the priority of the PPC 68k mirror main task */
   #ifdef CHANGE_MIRROR_TASK_PRI
   Old68kMirrorPri = SetTaskPri(FindTask(NULL), 2);
   #endif

   #ifdef __POWERUP__
   /*
   ** PowerUp
   */
   /* Requires ppc.library 46.30 (or PPCLibEmu), due to timer/signal bugs */
   #define PPCINFOTAG_EMULATION (TAG_USER + 0x1f0ff)
   if (PPCGetAttr(PPCINFOTAG_EMULATION) == 'WARP') {
      if (!((PPCVersion() == 46 && PPCRevision() >= 29) || PPCVersion() > 46)) {
         printf("Requires PPCLibEmu 0.8a or higher!\n");
         done = FALSE;
      }
   }
   else {
      if (!((PPCVersion() == 46 && PPCRevision() >= 30) || PPCVersion() > 46)) {
         printf("Requires ppc.library 46.30 or higher!\n");
         done = FALSE;
      }
   }
   if (done) {
      if (PPCGetTaskAttr(PPCTASKTAG_STACKSIZE) < 200000) {
         printf("Please increase stack size to at least 200000 bytes!\n");
         done = FALSE;
      }
   }
   if (done) {
      done = ((PPCLibBase = OpenLibrary("ppc.library",46)) != NULL);
   }
   if (done) {
      struct TagItem tags[2] = { {PPCPORTTAG_NAME, (ULONG)"dnetc"}, {TAG_END,0} };
      void *port;
      if (!(port = PPCObtainPort(tags))) {
         done = FALSE;
         if ((TriggerPort = PPCCreatePort(tags))) {
            done = TRUE;
         }
      }
      else {
         PPCReleasePort(port);
      }
   }
   #else
   /*
   ** WarpOs
   */
   if (!FindPortPPC("dnetc")) {
      if ((TriggerPort = CreateMsgPortPPC())) {
         TriggerPort->mp_Port.mp_Node.ln_Name = "dnetc";
         TriggerPort->mp_Port.mp_Node.ln_Pri = 0;
         AddPortPPC(TriggerPort);
      }
      else {
         done = FALSE;
      }
   }
   #endif

   #else
   /*
   ** 68K / OS4 / MorphOS
   */

   struct MsgPort *portexists;

   Forbid();

   portexists = FindPort("dnetc");
   if (!portexists) {
      if ((TriggerPort = CreateMsgPort())) {
         TriggerPort->mp_Node.ln_Name = "dnetc";
         TriggerPort->mp_Node.ln_Pri = 0;
         AddPort(TriggerPort);
      }
      else {
         done = FALSE;
      }
   }

   Permit();
   #endif

   if (!TimerBase && done) done = GlobalTimerInit();

   if (!done) amigaExit();

   #ifndef NO_GUI
   /* Workbench startup */
   if (done && *argc == 0) {
      struct WBStartup *wbs = (struct WBStartup *)*argv;
      struct WBArg *arg = wbs->sm_ArgList;
      static char *newargv[1];
      newargv[0] = (char *)arg->wa_Name;

      *argc = 1;
      *argv = newargv;

      if (wbs->sm_NumArgs > 1) {
         /* Started via a project icon */
         arg = &wbs->sm_ArgList[1];
      }

      if (!(amigaGUIInit((char *)wbs->sm_ArgList->wa_Name,arg))) {
         if (!(amigaOpenNewConsole("CON://630/300/distributed.net client/CLOSE/WAIT"))) {
            done = FALSE;
         }
      }
   }
   #endif

   #if USE_RESETHANDLER
   if (done) {
      add_resethandler();
   }
   #endif

   return(done);
}