This is Unofficial EPICS BASE Doxygen Site
epicsStdio.c
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2009 UChicago Argonne LLC, as Operator of Argonne
3 * National Laboratory.
4 * Copyright (c) 2002 The Regents of the University of California, as
5 * Operator of Los Alamos National Laboratory.
6 * EPICS BASE is distributed subject to a Software License Agreement found
7 * in file LICENSE that is included with this distribution.
8 \*************************************************************************/
9 
10 /* epicsStdio.c */
11 
12 /* Author: Marty Kraimer */
13 
14 #include <stdlib.h>
15 #include <stddef.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include <fcntl.h>
19 #include <errno.h>
20 
21 #define epicsStdioStdStreams
22 #include "libComAPI.h"
23 #include "epicsThread.h"
24 #include "epicsStdio.h"
25 
27 static epicsThreadPrivateId stdinThreadPrivateId;
28 static epicsThreadPrivateId stdoutThreadPrivateId;
29 static epicsThreadPrivateId stderrThreadPrivateId = 0;
30 
31 static void once(void *junk)
32 {
33  stdinThreadPrivateId = epicsThreadPrivateCreate();
34  stdoutThreadPrivateId = epicsThreadPrivateCreate();
35  stderrThreadPrivateId = epicsThreadPrivateCreate();
36 }
37 
38 FILE * epicsStdCall epicsGetStdin(void)
39 {
40  FILE *fp = epicsGetThreadStdin();
41 
42  if (!fp)
43  fp = stdin;
44  return fp;
45 }
46 
47 FILE * epicsStdCall epicsGetStdout(void)
48 {
49  FILE *fp = epicsGetThreadStdout();
50 
51  if (!fp)
52  fp = stdout;
53  return fp;
54 }
55 
56 FILE * epicsStdCall epicsGetStderr(void)
57 {
58  FILE *fp = epicsGetThreadStderr();
59 
60  if (!fp)
61  fp = stderr;
62  return fp;
63 }
64 
65 FILE * epicsStdCall epicsGetThreadStdin(void)
66 {
67  epicsThreadOnce(&onceId,once,0);
68  return epicsThreadPrivateGet(stdinThreadPrivateId);
69 }
70 
71 FILE * epicsStdCall epicsGetThreadStdout(void)
72 {
73  epicsThreadOnce(&onceId,once,0);
74  return epicsThreadPrivateGet(stdoutThreadPrivateId);
75 }
76 
77 FILE * epicsStdCall epicsGetThreadStderr(void)
78 {
79  /* Deliberately don't do the epicsThreadOnce() here; epicsThreadInit()
80  * is allowed to use stderr inside its once() routine, in which case we
81  * must return the OS's stderr instead. There may be a tiny chance of a
82  * race happening here during initialization for some architectures, so
83  * we only use it for stderr to reduce the chance of that happening.
84  */
85  if (!stderrThreadPrivateId)
86  return NULL;
87  return epicsThreadPrivateGet(stderrThreadPrivateId);
88 }
89 
90 void epicsStdCall epicsSetThreadStdin(FILE *fp)
91 {
92  epicsThreadOnce(&onceId,once,0);
93  epicsThreadPrivateSet(stdinThreadPrivateId,fp);
94 }
95 
96 void epicsStdCall epicsSetThreadStdout(FILE *fp)
97 {
98  epicsThreadOnce(&onceId,once,0);
99  epicsThreadPrivateSet(stdoutThreadPrivateId,fp);
100 }
101 
102 void epicsStdCall epicsSetThreadStderr(FILE *fp)
103 {
104  epicsThreadOnce(&onceId,once,0);
105  epicsThreadPrivateSet(stderrThreadPrivateId,fp);
106 }
107 
108 int epicsStdCall epicsStdoutPrintf(const char *pFormat, ...)
109 {
110  va_list pvar;
111  int nchar;
112  FILE *stream = epicsGetStdout();
113 
114  va_start(pvar, pFormat);
115  nchar = vfprintf(stream, pFormat, pvar);
116  va_end(pvar);
117  return nchar;
118 }
119 
120 int epicsStdCall epicsStdoutPuts(const char *str)
121 {
122  return fprintf(epicsGetStdout(), "%s\n", str);
123 }
124 
125 int epicsStdCall epicsStdoutPutchar(int c)
126 {
127  return putc(c, epicsGetStdout());
128 }
int epicsStdCall epicsStdoutPuts(const char *str)
Definition: epicsStdio.c:120
FILE *epicsStdCall epicsGetStderr(void)
Definition: epicsStdio.c:56
FILE *epicsStdCall epicsGetThreadStderr(void)
Definition: epicsStdio.c:77
int epicsStdCall epicsStdoutPrintf(const char *pFormat,...)
Definition: epicsStdio.c:108
void epicsStdCall epicsSetThreadStderr(FILE *fp)
Definition: epicsStdio.c:102
LIBCOM_API void *epicsStdCall epicsThreadPrivateGet(epicsThreadPrivateId)
Definition: osdThread.c:973
#define NULL
Definition: catime.c:38
int epicsStdCall epicsStdoutPutchar(int c)
Definition: epicsStdio.c:125
#define str(v)
FILE *epicsStdCall epicsGetStdout(void)
Definition: epicsStdio.c:47
#define EPICS_THREAD_ONCE_INIT
Definition: epicsThread.h:109
LIBCOM_API void epicsStdCall epicsThreadOnce(epicsThreadOnceId *id, EPICSTHREADFUNC, void *arg)
LIBCOM_API void epicsStdCall epicsThreadPrivateSet(epicsThreadPrivateId, void *)
Definition: osdThread.c:961
void epicsStdCall epicsSetThreadStdout(FILE *fp)
Definition: epicsStdio.c:96
#define stdout
Definition: epicsStdio.h:30
FILE *epicsStdCall epicsGetThreadStdin(void)
Definition: epicsStdio.c:65
#define stdin
Definition: epicsStdio.h:28
#define stderr
Definition: epicsStdio.h:32
void epicsStdCall epicsSetThreadStdin(FILE *fp)
Definition: epicsStdio.c:90
C++ and C descriptions for a thread.
LIBCOM_API epicsThreadPrivateId epicsStdCall epicsThreadPrivateCreate(void)
Definition: osdThread.c:934
FILE *epicsStdCall epicsGetStdin(void)
Definition: epicsStdio.c:38
FILE *epicsStdCall epicsGetThreadStdout(void)
Definition: epicsStdio.c:71