diff options
Diffstat (limited to 'portable/src/UNIX/PFileSystemUNIXImpl.c')
-rw-r--r-- | portable/src/UNIX/PFileSystemUNIXImpl.c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/portable/src/UNIX/PFileSystemUNIXImpl.c b/portable/src/UNIX/PFileSystemUNIXImpl.c new file mode 100644 index 0000000..06655f3 --- /dev/null +++ b/portable/src/UNIX/PFileSystemUNIXImpl.c @@ -0,0 +1,142 @@ +/*---------------------------------------------------------------------------* + * PFileSystemUNIXImpl.c * + * * + * Copyright 2007, 2008 Nuance Communciations, Inc. * + * * + * Licensed under the Apache License, Version 2.0 (the 'License'); * + * you may not use this file except in compliance with the License. * + * * + * You may obtain a copy of the License at * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, software * + * distributed under the License is distributed on an 'AS IS' BASIS, * + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and * + * limitations under the License. * + * * + *---------------------------------------------------------------------------*/ + +#include "PANSIFileImpl.h" +#include "PANSIFileSystemImpl.h" +#include "PFileSystem.h" +#include "PFileSystemImpl.h" +#include "PANSIFileSystem.h" +#include "phashtable.h" +#include "plog.h" +#include "pmemory.h" + + +#ifdef USE_THREAD + /* Prototype of private function */ + PORTABLE_API ESR_ReturnCode PtrdFlush(); +#endif + + +/** + * Initializes STDIN, STDOUT, STDERR. + */ +ESR_ReturnCode PFileSystemInitializeStreamsImpl(void) +{ + ESR_ReturnCode rc; + PANSIFileImpl* impl; +#ifdef USE_THREAD + ESR_BOOL threadingEnabled; +#endif + ESR_BOOL isLittleEndian; + PANSIFileSystemImpl* ANSIImpl = NULL; + +#if __BYTE_ORDER==__LITTLE_ENDIAN + isLittleEndian = ESR_TRUE; +#else + isLittleEndian = ESR_FALSE; +#endif + CHKLOG(rc, PANSIFileSystemCreate()); + ANSIImpl = (PANSIFileSystemImpl*) PANSIFileSystemSingleton; + CHKLOG(rc, PMemSetLogEnabled(ESR_FALSE)); + CHKLOG(rc, PHashTablePutValue(PFileSystemPathMap, L("/"), PANSIFileSystemSingleton, NULL)); + CHKLOG(rc, PHashTablePutValue(ANSIImpl->directoryMap, L("/"), L("/"), NULL)); + CHKLOG(rc, PANSIFileSystemSingleton->createPFile(PANSIFileSystemSingleton, L("/dev/stdin"), isLittleEndian, &PSTDIN)); + impl = (PANSIFileImpl*) PSTDIN; + impl->value = stdin; + + CHKLOG(rc, PANSIFileSystemSingleton->createPFile(PANSIFileSystemSingleton, L("/dev/stdout"), isLittleEndian, &PSTDOUT)); + impl = (PANSIFileImpl*) PSTDOUT; + setvbuf(stdout, NULL, _IONBF, 0); + impl->value = stdout; + + CHKLOG(rc, PANSIFileSystemSingleton->createPFile(PANSIFileSystemSingleton, L("/dev/stderr"), isLittleEndian, &PSTDERR)); + impl = (PANSIFileImpl*) PSTDERR; + setvbuf(stderr, NULL, _IONBF, 0); + impl->value = stderr; + + #ifdef USE_THREAD + /* Have STDERR and STDOUT share the same lock */ + CHKLOG(rc, PtrdIsEnabled(&threadingEnabled)); + if (threadingEnabled) + { + CHKLOG(rc, PtrdMonitorDestroy(impl->Interface.lock)); + impl->Interface.lock = ((PANSIFileImpl*) PSTDOUT)->Interface.lock; + } + #endif + CHKLOG(rc, PHashTableRemoveValue(PFileSystemPathMap, L("/"), NULL)); + CHKLOG(rc, PHashTableRemoveValue(ANSIImpl->directoryMap, L("/"), NULL)); + CHKLOG(rc, PMemSetLogEnabled(ESR_TRUE)); + return ESR_SUCCESS; +CLEANUP: + PHashTableRemoveValue(PFileSystemPathMap, L("/"), NULL); + if (ANSIImpl!=NULL) + PHashTableRemoveValue(ANSIImpl->directoryMap, L("/"), NULL); + PMemSetLogEnabled(ESR_TRUE); + return rc; +} + +ESR_ReturnCode PFileSystemShutdownStreamsImpl(void) +{ + ESR_ReturnCode rc; + PANSIFileImpl* impl; + + /* It is illegal to log to file after the file system has shutdown so we do it now */ +#ifdef USE_THREAD + PtrdFlush(); +#endif + PMemDumpLogFile(); + + if (PSTDIN!=NULL) + { + CHKLOG(rc, PFileFlush(PSTDIN)); + impl = (PANSIFileImpl*) PSTDIN; + impl->value = NULL; + CHKLOG(rc, PFileDestroy(PSTDIN)); + PSTDIN = NULL; + } + if (PSTDOUT!=NULL) + { +#ifdef USE_THREAD + if (PSTDERR!=NULL) + { + /* stdout, stderr share the same lock, only one of them should destroy it */ + PFileImpl* impl = (PFileImpl*) PSTDOUT; + + impl->lock = NULL; + } +#endif + CHKLOG(rc, PFileFlush(PSTDOUT)); + impl = (PANSIFileImpl*) PSTDOUT; + impl->value = NULL; + CHKLOG(rc, PFileDestroy(PSTDOUT)); + PSTDOUT = NULL; + } + if (PSTDERR!=NULL) + { + CHKLOG(rc, PFileFlush(PSTDERR)); + impl = (PANSIFileImpl*) PSTDERR; + impl->value = NULL; + CHKLOG(rc, PFileDestroy(PSTDERR)); + PSTDERR = NULL; + } + CHKLOG(rc, PANSIFileSystemDestroy()); + return ESR_SUCCESS; +CLEANUP: + return rc; +} |