From 92f32f3c215a7d6bc680d985b97cdcb7fe7a2e3e Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Mon, 21 Nov 2005 19:09:20 +0000 Subject: [PATCH] new test --- src/libCom/test/Makefile | 4 + src/libCom/test/epicsThreadPriorityTest.cpp | 106 ++++++++++++++++++ .../test/epicsThreadPriorityTestMain.cpp | 27 +++++ 3 files changed, 137 insertions(+) create mode 100644 src/libCom/test/epicsThreadPriorityTest.cpp create mode 100644 src/libCom/test/epicsThreadPriorityTestMain.cpp diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index e415278bb..d73bb8065 100644 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -37,6 +37,10 @@ epicsThreadTestHost_SRCS += epicsThreadTestMain.cpp epicsThreadTest.cpp PROD_HOST += epicsThreadTestHost OBJS_IOC_vxWorks += epicsThreadTest +epicsThreadPriorityTestHost_SRCS += epicsThreadPriorityTestMain.cpp epicsThreadPriorityTest.cpp +PROD_HOST += epicsThreadPriorityTestHost +OBJS_IOC_vxWorks += epicsThreadPriorityTest + epicsThreadPrivateTestHost_SRCS += epicsThreadPrivateTestMain.cpp epicsThreadPrivateTest.cpp PROD_HOST += epicsThreadPrivateTestHost OBJS_IOC_vxWorks += epicsThreadPrivateTest diff --git a/src/libCom/test/epicsThreadPriorityTest.cpp b/src/libCom/test/epicsThreadPriorityTest.cpp new file mode 100644 index 000000000..b834252ba --- /dev/null +++ b/src/libCom/test/epicsThreadPriorityTest.cpp @@ -0,0 +1,106 @@ +/*************************************************************************\ +* Copyright (c) 2002 The University of Chicago, as Operator of Argonne +* National Laboratory. +* Copyright (c) 2002 The Regents of the University of California, as +* Operator of Los Alamos National Laboratory. +* EPICS BASE Versions 3.13.7 +* and higher are distributed subject to a Software License Agreement found +* in file LICENSE that is included with this distribution. +\*************************************************************************/ +/* epicsdThreadPriorityTest.cpp */ + +/* Author: Marty Kraimer Date: 21NOV2005 */ + +#include +#include +#include +#include +#include +#include +#include + +#include "epicsThread.h" +#include "epicsEvent.h" +#include "epicsExit.h" + + +typedef struct info { + epicsEventId waitForMaster; + epicsEventId waitForClient; +}info; + +extern "C" { + +static void client(void *arg) +{ + info *pinfo = (info *)arg; + epicsThreadId idSelf = epicsThreadGetIdSelf(); + + while(1) { + epicsEventWaitStatus status; +printf("client calling epicsEventWait\n"); + status = epicsEventWait(pinfo->waitForMaster); + if(status!=epicsEventWaitOK) { + printf("task %p epicsEventWait returned %d\n", idSelf,(int)status); + } + epicsEventSignal(pinfo->waitForClient); +printf("client after epicsEventSignal\n"); + } +} + +extern "C" void epicsThreadPriorityTest(void *) +{ + unsigned int stackSize; + info *pinfo; + epicsThreadId clientId; + epicsThreadId myId; + epicsEventWaitStatus status; + + myId = epicsThreadGetIdSelf(); + epicsThreadSetPriority(myId,50); + pinfo = (info *)calloc(1,sizeof(info)); + pinfo->waitForMaster = epicsEventMustCreate(epicsEventEmpty); + pinfo->waitForClient = epicsEventMustCreate(epicsEventEmpty); + stackSize = epicsThreadGetStackSize(epicsThreadStackSmall); + clientId = epicsThreadCreate("client",50,stackSize,client,pinfo); +printf("master calling epicsEventSignal\n"); + epicsEventSignal(pinfo->waitForMaster); +printf("master calling epicsEventWaitWithTimeout\n"); + status = epicsEventWaitWithTimeout(pinfo->waitForClient,.1); + if(status!=epicsEventWaitOK) { + printf("epicsEventWaitWithTimeout failed. Why????\n"); + goto done; + } + epicsThreadSetPriority(clientId,20); + /* expect that client will not be able to run */ +printf("master calling epicsEventSignal\n"); + epicsEventSignal(pinfo->waitForMaster); +printf("master calling epicsEventTryWait\n"); + status = epicsEventTryWait(pinfo->waitForClient); + if(status!=epicsEventWaitTimeout) { + printf("epicsEventTryWait did not return epicsEventWaitTimeout\n"); + } else { + status = epicsEventWaitWithTimeout(pinfo->waitForClient,.1); + if(status!=epicsEventWaitOK) { + printf("epicsEventWaitWithTimeout failed. Why????\n"); + goto done; + } + } + epicsThreadSetPriority(clientId,80); +printf("master calling epicsEventSignal\n"); + /* expect that client will be able to run */ + epicsEventSignal(pinfo->waitForMaster); +printf("master calling epicsEventTryWait\n"); + status = epicsEventTryWait(pinfo->waitForClient); + if(status!=epicsEventWaitOK) { + printf("epicsEventTryWait did not return epicsEventWaitOK %d\n",status); + status = epicsEventWaitWithTimeout(pinfo->waitForClient,.1); + if(status!=epicsEventWaitOK) { + printf("epicsEventWaitWithTimeout failed. Why????\n"); + goto done; + } + } +done: + epicsExit(0); +} +} diff --git a/src/libCom/test/epicsThreadPriorityTestMain.cpp b/src/libCom/test/epicsThreadPriorityTestMain.cpp new file mode 100644 index 000000000..2cad5098c --- /dev/null +++ b/src/libCom/test/epicsThreadPriorityTestMain.cpp @@ -0,0 +1,27 @@ +/*************************************************************************\ +* Copyright (c) 2002 The University of Chicago, as Operator of Argonne +* National Laboratory. +* Copyright (c) 2002 The Regents of the University of California, as +* Operator of Los Alamos National Laboratory. +* EPICS BASE Versions 3.13.7 +* and higher are distributed subject to a Software License Agreement found +* in file LICENSE that is included with this distribution. +\*************************************************************************/ +/* + * $Id$ + * + * Author Marty Kraimer + */ + +#include "epicsThread.h" + +extern "C" void epicsThreadPriorityTest(void *arg); + +int main ( int argc , char *argv[] ) +{ + epicsThreadCreate("threadPriorityTest",epicsThreadPriorityMedium, + epicsThreadGetStackSize(epicsThreadStackMedium), + epicsThreadPriorityTest,0); + epicsThreadExitMain(); + return 0; +}