home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROSdev.lha / AROS / test / semaphoretest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-24  |  4.9 KB  |  198 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     $Id: semaphoretest.c,v 1.4 1996/10/23 14:07:20 aros Exp $
  4.     $Log: semaphoretest.c,v $
  5.     Revision 1.4  1996/10/23 14:07:20  aros
  6.     #define was renamed
  7.  
  8.     Revision 1.3  1996/10/19 17:07:32  aros
  9.     Include <aros/machine.h> instead of machine.h
  10.  
  11.     Revision 1.2  1996/08/01 17:41:40  digulla
  12.     Added standard header for all files
  13.  
  14.     Desc:
  15.     Lang:
  16. */
  17. #include <exec/memory.h>
  18. #include <exec/tasks.h>
  19. #include <exec/semaphores.h>
  20. #include <clib/exec_protos.h>
  21. #include <aros/machine.h>
  22. #include <stdio.h>
  23.  
  24. #define NEWLIST(l)                          \
  25. ((l)->lh_Head=(struct Node *)&(l)->lh_Tail, \
  26.  (l)->lh_Tail=NULL,                         \
  27.  (l)->lh_TailPred=(struct Node *)(l))
  28.  
  29. /* shared */
  30. extern struct ExecBase *SysBase;
  31. struct SignalSemaphore *ss;
  32. int u[3];
  33.  
  34. #define STACKSIZE 4096
  35.  
  36. static void entry(void)
  37. {
  38.     int i,k,os=2;
  39.     u[2]=1;
  40.     ObtainSemaphoreShared(&ss[2]);
  41.     u[2]=2;
  42.  
  43.     for(i=0;i<10;i++)
  44.     for(k=0;k<3;k++)
  45.     {
  46.         u[k]=1;
  47.         ObtainSemaphoreShared(&ss[k]);
  48.         u[k]=2;
  49.         ReleaseSemaphore(&ss[os]);
  50.         u[os]=0;
  51.  
  52.         os=k;
  53.     }
  54.  
  55.     Wait(0);/* Let the parent remove me */
  56. }
  57.  
  58. int main(int argc, char* argv[])
  59. {
  60.     struct Task *t;
  61.     struct MsgPort *mp;
  62.     struct SemaphoreMessage *sm;
  63.  
  64.     mp=CreateMsgPort();
  65.     if(mp!=NULL)
  66.     {
  67.     sm=(struct SemaphoreMessage *)CreateIORequest(mp,sizeof(struct SemaphoreMessage));
  68.     if(sm!=NULL)
  69.     {
  70.         ss=(struct SignalSemaphore *)AllocMem(3*sizeof(struct SignalSemaphore),
  71.                         MEMF_PUBLIC|MEMF_CLEAR);
  72.         if(ss!=NULL)
  73.         {
  74.         InitSemaphore(&ss[0]);
  75.         InitSemaphore(&ss[1]);
  76.         InitSemaphore(&ss[2]);
  77.         ObtainSemaphore(&ss[2]);
  78.         printf("task 1: got %d\n",2);
  79.  
  80.         t=(struct Task *)AllocMem(sizeof(struct Task), MEMF_PUBLIC|MEMF_CLEAR);
  81.         if(t!=NULL)
  82.         {
  83.             UBYTE *s;
  84.             s=(UBYTE *)AllocMem(STACKSIZE, MEMF_PUBLIC|MEMF_CLEAR);
  85.             if(s!=NULL)
  86.             {
  87.             t->tc_Node.ln_Type=NT_TASK;
  88.             t->tc_Node.ln_Pri=1;
  89.             t->tc_Node.ln_Name="new task";
  90.             t->tc_SPLower=s;
  91.             t->tc_SPUpper=s+STACKSIZE;
  92. #if AROS_STACK_GROWS_DOWNWARDS
  93.             t->tc_SPReg=(UBYTE *)t->tc_SPUpper-SP_OFFSET;
  94. #else
  95.             t->tc_SPReg=(UBYTE *)t->tc_SPLower-SP_OFFSET;
  96. #endif
  97.             NEWLIST(&t->tc_MemEntry);
  98.             AddTask(t,&entry,NULL);
  99.  
  100.             {
  101.                 int k,os=2;
  102.                 for(k=0;k<3;k++)
  103.                 {
  104.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  105.                 ObtainSemaphore(&ss[k]);
  106.                 printf("task 1: got %d\n",k);
  107.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  108.                 ReleaseSemaphore(&ss[os]);
  109.                 printf("task 1: released %d\n",os);
  110.  
  111.                 os=k;
  112.                 }
  113.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  114.  
  115.                 ObtainSemaphoreShared(&ss[0]);
  116.                 printf("task 1: got shared %d\n",0);
  117.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  118.                 ObtainSemaphoreShared(&ss[1]);
  119.                 printf("task 1: got shared %d\n",1);
  120.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  121.  
  122.                 ReleaseSemaphore(&ss[0]);
  123.                 printf("task 1: released %d\n",0);
  124.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  125.                 ReleaseSemaphore(&ss[1]);
  126.                 printf("task 1: released %d\n",1);
  127.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  128.  
  129.                 for(k=0;k<3;k++)
  130.                 if(AttemptSemaphore(&ss[k]))
  131.                 {
  132.                     printf("task 1: got %d\n",k);
  133.                     printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  134.                     ReleaseSemaphore(&ss[k]);
  135.                     printf("task 1: released %d\n",k);
  136.                     printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  137.                 }
  138.  
  139.                 for(k=0;k<3;k++)
  140.                 if(k!=os&&AttemptSemaphoreShared(&ss[k]))
  141.                 {
  142.                     printf("task 1: got %d\n",k);
  143.                     printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  144.                     ReleaseSemaphore(&ss[k]);
  145.                     printf("task 1: released %d\n",k);
  146.                     printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  147.                 }
  148.  
  149.                 for(k=0;k<3;k++)
  150.                 {
  151.                 sm->ssm_Message.mn_Node.ln_Name=(char *)SM_EXCLUSIVE;
  152.                 Procure(&ss[k],sm);
  153.                 printf("task 1: posted request for %d\n",k);
  154.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  155.                 if(GetMsg(mp)!=NULL)
  156.                     printf("task 1: got it\n");
  157.                 else
  158.                     printf("task 1: didn't get it\n");
  159.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  160.                 Vacate(&ss[k],sm);
  161.                 printf("task 1: released %d\n",k);
  162.                 printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  163.                 }
  164.  
  165.                 for(k=0;k<3;k++)
  166.                 if(k!=os)
  167.                 {
  168.                     sm->ssm_Message.mn_Node.ln_Name=(char *)SM_SHARED;
  169.                     Procure(&ss[k],sm);
  170.                     printf("task 1: posted request for %d\n",k);
  171.                     printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  172.                     if(GetMsg(mp)!=NULL)
  173.                     printf("task 1: got it\n");
  174.                     else
  175.                     printf("task 1: didn't get it\n");
  176.                     printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  177.                     Vacate(&ss[k],sm);
  178.                     printf("task 1: released %d\n",k);
  179.                     printf("task 2: %d %d %d\n",u[0],u[1],u[2]);
  180.                 }
  181.             }
  182.             RemTask(t);
  183.  
  184.             FreeMem(s,STACKSIZE);
  185.             }
  186.             FreeMem(t,sizeof(struct Task));
  187.         }
  188.         FreeMem(ss,3*sizeof(struct SignalSemaphore));
  189.         }
  190.         DeleteIORequest((struct IORequest *)sm);
  191.     }
  192.     DeleteMsgPort(mp);
  193.     }
  194.     return 0;
  195. }
  196.  
  197.  
  198.