00001 #include <kernel.h>
00002 #include <proc.h>
00003 #include <semaphore.h>
00004 #include <stdio.h>
00005
00006 extern void testPass(const char *);
00007 extern void testFail(const char *);
00008
00009 extern bool test_checkSemCount(semaphore s, short c);
00010 extern bool test_checkProcState(ushort pid, uchar state);
00011 extern bool test_checkResult(uchar testResult, uchar expected);
00012
00013 extern void test_semWaiter(semaphore s, int times, uchar *testResult);
00014
00015 int test_semaphore3(int argc, char **argv)
00016 {
00017 int apid, bpid;
00018 bool passed = TRUE;
00019 semaphore s;
00020 uchar testResult = 0;
00021 char msg[50];
00022
00023 printf("Test Suite: Counting Semaphores\n");
00024
00025 printf(" Semaphore creation: ");
00026 s = newsem(1);
00027 if (isbadsem(s))
00028 {
00029 passed = FALSE;
00030 sprintf(msg, "%d", s);
00031 testFail(msg);
00032 }
00033 else if (test_checkSemCount(s, 1))
00034 { testPass(""); }
00035 else
00036 { passed = FALSE; }
00037
00038 ready(apid = create((void *)test_semWaiter, INITSTK, 31, "SEMAPHORE-A",
00039 3, s, 1, &testResult), RESCHED_NO);
00040 ready(bpid = create((void *)test_semWaiter, INITSTK, 31, "SEMAPHORE-B",
00041 3, s, 1, &testResult), RESCHED_YES);
00042
00043 printf(" Wait on semaphore: ");
00044
00045 if ( test_checkProcState(apid, PRFREE)
00046 && test_checkProcState(bpid, PRWAIT)
00047 && test_checkSemCount(s, -1)
00048 && test_checkResult(testResult, 1) )
00049 { testPass(""); }
00050 else
00051 { passed = FALSE; }
00052
00053 signal(s);
00054
00055
00056 printf(" Signal waiting semaphore: ");
00057 if ( test_checkProcState(bpid, PRFREE)
00058 && test_checkSemCount(s, 0)
00059 && test_checkResult(testResult, 2) )
00060 { testPass(""); }
00061 else
00062 { passed = FALSE; }
00063
00064 if (TRUE == passed)
00065 { testPass(""); }
00066 else
00067 { testFail(""); }
00068
00069
00070 kill(apid);
00071 kill(bpid);
00072 freesem(s);
00073
00074 return OK;
00075 }
00076