From cb34e16385be98148e8c9a51f2fd18b37b592138 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Thu, 8 Jul 2004 11:55:46 +0000 Subject: [PATCH] added epicsGetStdin/epicsSetStdin and stdout and stderr --- src/libCom/osi/epicsStdio.c | 64 ++++++++++++++++++++++++++++- src/libCom/osi/epicsStdio.h | 16 ++++++++ src/libCom/osi/os/posix/osdThread.c | 5 +-- 3 files changed, 80 insertions(+), 5 deletions(-) diff --git a/src/libCom/osi/epicsStdio.c b/src/libCom/osi/epicsStdio.c index ff1b6be4e..420cd8e21 100644 --- a/src/libCom/osi/epicsStdio.c +++ b/src/libCom/osi/epicsStdio.c @@ -16,7 +16,69 @@ #include #include #include + +#include "epicsThread.h" + #define epicsExportSharedSymbols +#define epicsStdioPVT #include "epicsStdio.h" -/* Currently this file has nothing*/ +static epicsThreadOnceId onceId = EPICS_THREAD_ONCE_INIT; +static epicsThreadPrivateId stdinThreadPrivateId; +static epicsThreadPrivateId stdoutThreadPrivateId; +static epicsThreadPrivateId stderrThreadPrivateId; + +static void once(void *junk) +{ + stdinThreadPrivateId = epicsThreadPrivateCreate(); + stdoutThreadPrivateId = epicsThreadPrivateCreate(); + stderrThreadPrivateId = epicsThreadPrivateCreate(); +} + +FILE * epicsShareAPI epicsGetStdin(void) +{ + FILE *fp; + + epicsThreadOnce(&onceId,once,0); + fp = epicsThreadPrivateGet(stdinThreadPrivateId); + if(!fp) fp = stdin; + return fp; +} + +void epicsShareAPI epicsSetStdin(FILE *fp) +{ + epicsThreadOnce(&onceId,once,0); + epicsThreadPrivateSet(stdinThreadPrivateId,fp); +} + +FILE * epicsShareAPI epicsGetStdout(void) +{ + FILE *fp; + + epicsThreadOnce(&onceId,once,0); + fp = epicsThreadPrivateGet(stdoutThreadPrivateId); + if(!fp) fp = stdout; + return fp; +} + +void epicsShareAPI epicsSetStdout(FILE *fp) +{ + epicsThreadOnce(&onceId,once,0); + epicsThreadPrivateSet(stdoutThreadPrivateId,fp); +} + +FILE * epicsShareAPI epicsGetStderr(void) +{ + FILE *fp; + + epicsThreadOnce(&onceId,once,0); + fp = epicsThreadPrivateGet(stderrThreadPrivateId); + if(!fp) fp = stderr; + return fp; +} + +void epicsShareAPI epicsSetStderr(FILE *fp) +{ + epicsThreadOnce(&onceId,once,0); + epicsThreadPrivateSet(stderrThreadPrivateId,fp); +} diff --git a/src/libCom/osi/epicsStdio.h b/src/libCom/osi/epicsStdio.h index 3e4d72fdd..d4d2226d5 100644 --- a/src/libCom/osi/epicsStdio.h +++ b/src/libCom/osi/epicsStdio.h @@ -29,6 +29,22 @@ epicsShareFunc void epicsShareAPI epicsTempName ( char * pNameBuf, size_t nameBufLength ); epicsShareFunc FILE * epicsShareAPI epicsTempFile (); +epicsShareFunc FILE * epicsShareAPI epicsGetStdin(void); +epicsShareFunc FILE * epicsShareAPI epicsGetStdout(void); +epicsShareFunc FILE * epicsShareAPI epicsGetStderr(void); +epicsShareFunc void epicsShareAPI epicsSetStdin(FILE *); +epicsShareFunc void epicsShareAPI epicsSetStdout(FILE *); +epicsShareFunc void epicsShareAPI epicsSetStderr(FILE *); + +#ifndef epicsStdioPVT +#undef stdin +#define stdin epicsGetStdin() +#undef stdout +#define stdout epicsGetStdout() +#undef stderr +#define stderr epicsGetStderr() +#endif /* epicsStdioPVT */ + /* * truncate to specified size (we dont use truncate() diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index c813a6b4f..543249a80 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -699,10 +699,7 @@ void *epicsThreadPrivateGet(epicsThreadPrivateId id) void *value; assert(epicsThreadOnceCalled); - value = pthread_getspecific(*key); - if(errVerbose && !value) - errlogPrintf("epicsThreadPrivateGet: pthread_getspecific returned 0\n"); - return(value); + return pthread_getspecific(*key); } double epicsThreadSleepQuantum ()