home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / lang / odinlib2_7.lzh / ODINTEST.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-10-16  |  6.6 KB  |  295 lines

  1. /***********************************************************
  2. * odintest.c                                               *
  3. * Created 12-Jul-90 by Peter Oerbaek                       *
  4. * This is supposed to be a complete test-suite of the      *
  5. * functions in odin.library                                *
  6. * Modified 13-Jul-90 for ANSI compatibility                *
  7. * Modified 23-Aug-90 for testing of version 2              *
  8. ************************************************************/
  9.  
  10. #include    "exec/types.h"
  11. #include    "exec/tasks.h"
  12. #include    "exec/semaphores.h"
  13. #include    "exec/execbase.h"
  14. #include    "odin.h"
  15. #include    "stdio.h"
  16.  
  17. void *OpenLibrary();
  18. struct Task *FindTask();
  19. struct Message *GetMsg();
  20. void WaitPort(),FreeMem(),DeletePort();
  21. struct MsgPort *CreatePort();
  22.  
  23. struct OdinBase *OdinBase;
  24. struct SignalSemaphore ss;
  25. #define CR(s) ObtainSemaphore(&ss); { s } ReleaseSemaphore(&ss);
  26. #define debug(str) CR(printf(str);)
  27.  
  28. Envelope e1,e2,e3,e4;
  29.  
  30. struct MsgPort *mp;
  31. struct EnvMsg *msg;
  32.  
  33. Envelope *my_copyfunc(src,tar)
  34. Envelope *src,*tar;
  35. {
  36.     int i;
  37.     register char *a,*b;
  38.  
  39.     a = (char *)src; b = (char *)tar;
  40.     for(i = 0; i < e_sizeof; i++) {
  41.         *a++ = *b++;
  42.     }
  43.  
  44.     return tar;
  45. }
  46.  
  47. Envelope *process1(e)
  48. Envelope *e;
  49. {
  50.     struct Task *tsk;
  51.     Envelope *env;
  52.  
  53.     debug("process1 started\n");
  54.     CR(printf("lenght = %ld\n",e->e_len);)
  55.  
  56.     tsk = FindTask(NULL);
  57.     
  58.     CR(printf("stacksize = %d\n",(int)(tsk->tc_SPUpper - tsk->tc_SPLower));)
  59.     CR(printf("pri = %d\n",(int)tsk->tc_Node.ln_Pri);)
  60.     CR(printf("taskname=%s\n",tsk->tc_Node.ln_Name);)
  61.  
  62.     debug("creating envelope\n");
  63.     env = CreateEnvelope("Env2",e_sizeof);
  64.     if(env == NULL) { debug("create returned NULL\n"); return e; }
  65.  
  66.     debug("envelope created\n");
  67.  
  68.     Delay(100L);
  69.     debug("copyouting\n");
  70.     CopyOut(env);
  71.  
  72.     Delay(199L);
  73.     debug("copy outing with copyfunc\n");
  74.     env->e_copyfunc = my_copyfunc;
  75.     CopyOut(env);
  76.  
  77.     debug("normal out\n");
  78.     Out(env);
  79.  
  80.     debug("wait for V3\n");
  81.     while(!(env = PollNamedEnvelope("V3"))) { 
  82.         debug("waiting with poll.\n");
  83.     }
  84.  
  85.     debug("got V3 dispose\n");
  86.     DisposeEnvelope(env);
  87.  
  88.     debug("wait for V4 and dispose\n");
  89.     DisposeEnvelope(AwaitNamedEnvelope("V4"));
  90.  
  91.     debug("wait for task1\n");
  92.     DisposeEnvelope(AwaitNamedEnvelope("V5"));
  93.     debug("shake hands\n");
  94.     (void)OutEmptyEnvelope("R1");
  95.  
  96.     (void)OutEmptyEnvelope("envelope3");
  97.  
  98.     Delay(200L);
  99.     (void)OutEmptyEnvelope("envelope4");
  100.     debug("2 envelopes outed\n");
  101.  
  102.     (void)OutEmptyEnvelope("te1");
  103.     Delay(300L);
  104.     (void)OutEmptyEnvelope("te2");
  105.  
  106.     debug("te1 and te2 outed\n");
  107.  
  108.     (void)AwaitTimed("never",10L,0L);
  109.     debug("awaittaimed timed out after 10 secs\n");
  110.  
  111.     return e;
  112. }
  113.  
  114. void task1()
  115. {
  116.     (void)OutEmptyEnvelope("V5");    /* shake hands with process */
  117.     DisposeEnvelope(AwaitNamedEnvelope("R1"));
  118. }
  119.  
  120. main()
  121. {
  122.     Envelope *ptr;
  123.     struct Task *tsk;
  124.     char buffer[30];
  125.     int i;
  126.  
  127.     if(!(OdinBase = (struct OdinBase *)OpenLibrary("RAM:odin.library",0L)))
  128.     {
  129.         printf("couldn't find odin.library.\n");
  130.         exit(20);
  131.     }
  132.  
  133.     mp = CreatePort("testport",0L);
  134.  
  135.     InitSemaphore(&ss);
  136.  
  137.     debug("begin\n");
  138.  
  139.     debug("test InitEnvelope():\n");
  140.     ptr = InitEnvelope(&e1,"Test",e_sizeof,NoCopyFunc);
  141.     debug("init envelope finished\n");
  142.     if(ptr == &e1) {
  143.         debug("returnvalue ok.\n");
  144.         if(strcmp(ptr->e_name,"Test") == 0) {
  145.             debug("name inited ok\n");
  146.         } else {
  147.             debug("name wrong\n");
  148.         }
  149.         if(ptr->e_len == e_sizeof && ptr->e_copyfunc == NULL) {
  150.             debug("inited ok\n");
  151.         } else {
  152.             debug("wrong init\n");
  153.         }
  154.     } else {
  155.         debug("returned wrong value.\n");
  156.     }
  157.  
  158.  
  159.     debug("test Eval():\n");
  160.     e1.e_proc = process1;
  161.     (void)Eval(&e1,(long)0,(ULONG)8000,EVAL_PROCESS);
  162.     debug("eval finished\n");
  163.  
  164.     debug("test rdp\n");
  165.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  166.     while(!(ptr = Rdp(&e2))) { debug("waiting in rdp\n"); }
  167.     if(ptr == &e2) {
  168.         debug("rdp returned ok\n");
  169.     } else {
  170.         debug("rdp returned wrong\n");
  171.     }
  172.     CR(printf("name returned by rdp: %s\n",e2.e_name);)
  173.  
  174.     debug("test rd\n");
  175.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  176.     ptr = Rd(&e2);
  177.     if(ptr == &e2) {
  178.         debug("rd returned ok\n");
  179.     } else {
  180.         debug("rd returned wrong\n");
  181.     }
  182.     CR(printf("name returned by rd: %s\n",ptr->e_name);)
  183.  
  184.     debug("test In()\n");
  185.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  186.     ptr = In(&e2);
  187.     if(ptr != &e2) {
  188.         debug("in returned ok\n");
  189.     } else {
  190.         debug("in returned wrong\n");
  191.     }
  192.     CR(printf("name returned by in: %s\n",ptr->e_name);)
  193.     DisposeEnvelope(ptr);
  194.  
  195.     debug("test AwaitNamedEnvelope()\n");
  196.     ptr = AwaitNamedEnvelope("Env2");
  197.     CR(printf("name returned by Await..: %s\n",ptr->e_name);)
  198.     DisposeEnvelope(ptr);
  199.  
  200.     debug("test rdp with copyfunc\n");
  201.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  202.     while(!(ptr = Rdp(&e2))) { debug("waiting in rdp2\n"); }
  203.     if(ptr == &e2) {
  204.         debug("rdp2 returned ok\n");
  205.     } else {
  206.         debug("rdp2 returned wrong\n");
  207.     }
  208.     CR(printf("name returned by rdp2: %s\n",e2.e_name);)
  209.  
  210.     debug("rd with copyfunc\n");
  211.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  212.     ptr = Rd(&e2);
  213.     if(ptr == &e2) {
  214.         debug("rd2 returned ok\n");
  215.     } else {
  216.         debug("rd2 returned wrong\n");
  217.     }
  218.     CR(printf("name returned by rd2: %s\n",e2.e_name);)
  219.  
  220.     DisposeEnvelope(AwaitNamedEnvelope("Env2"));
  221.  
  222.     Delay(100L);
  223.     Out(CreateEnvelope("V3",e_sizeof));
  224.  
  225.     (void)OutEmptyEnvelope("V4");
  226.  
  227.     tsk = StartTask(task1,"Task1",0L,4000L);
  228.     if(tsk == NULL) { debug("couldn't start task\n"); }
  229.     debug("task started\n");
  230.  
  231.     /*** version 2 additions ***/
  232.  
  233.     (void)InitEnvelope(&e3,"envelope3",e_sizeof,NoCopyFunc);
  234.  
  235.     /* wait max 5 secs */
  236.     ptr = TimedRd(&e3,5L,0L);
  237.     if(ptr == &e3) {
  238.         debug("timedrd returned ok\n");
  239.         CR(printf("name returned by TimedRd: %s\n",ptr->e_name);)
  240.     } else {
  241.         debug("timedrd timed out\n");
  242.     }
  243.  
  244.     debug("ready for timedin\n");
  245.     ptr = TimedIn(&e3,3L,0L);
  246.     if(ptr != 0L) {
  247.         debug("timedin returned ok\n");
  248.         CR(printf("name returned by TimedIn: %s\n",ptr->e_name);)
  249.         DisposeEnvelope(ptr);
  250.     } else {
  251.         debug("timedin timed out\n");
  252.     }
  253.     
  254.     (void)InitEnvelope(&e4,"envelope4",e_sizeof,NoCopyFunc);
  255.     AsyncIn(&e4,mp);
  256.  
  257.     debug("returned from asyncin, waiting\n");
  258.  
  259.     WaitPort(mp);
  260.     msg = (struct EnvMsg *)GetMsg(mp);
  261.     debug("got message\n");
  262.     DisposeEnvelope(msg->em_env);
  263.     debug("disposed of envelope\n");
  264.     FreeMem(msg,(long)sizeof(struct EnvMsg));
  265.     debug("freed message\n");
  266.  
  267.     ptr = AwaitTimed("te1",1L,0L);
  268.     if(ptr != 0L) {
  269.         debug("te1 arrived\n");
  270.         DisposeEnvelope(ptr);
  271.     } else {
  272.         debug("te1 didn't arrive in time\n");
  273.     }
  274.  
  275.     AsyncRequest("te2",mp);
  276.     debug("waiting for te2\n");
  277.  
  278.     WaitPort(mp); msg = (struct EnvMsg *)GetMsg(mp);
  279.     DisposeEnvelope(msg->em_env); FreeMem(msg,(long)sizeof(struct EnvMsg));
  280.  
  281.     /* generate some unique names */
  282.     for(i = 1; i < 200; i++) {
  283.         (void)strcpy(buffer,"prefix");
  284.         CR(printf("%s\n",UniqueName(buffer));)
  285.     }
  286.     
  287.     debug("wait for process to die\n");
  288.     (void)AwaitNamedEnvelope("Test");    
  289.     debug("exiting\n");
  290.  
  291.     DeletePort(mp);
  292.     CloseLibrary(OdinBase);
  293. }
  294.  
  295.