FreeBSDPlatformUtils.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:20k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 2001, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Log: FreeBSDPlatformUtils.cpp,v $
  58.  * Revision 1.13  2003/05/15 18:37:47  knoaman
  59.  * Partial implementation of the configurable memory manager.
  60.  *
  61.  * Revision 1.12  2003/04/25 17:19:10  peiyongz
  62.  * throw exception if getcwd() fails
  63.  *
  64.  * Revision 1.11  2003/04/24 02:53:29  peiyongz
  65.  * Logical Path Resolution
  66.  *
  67.  * Revision 1.10  2003/04/21 04:27:22  peiyongz
  68.  * performance tuning
  69.  *
  70.  * Revision 1.9  2003/03/09 16:53:27  peiyongz
  71.  * PanicHandler
  72.  *
  73.  * Revision 1.8  2003/02/23 04:36:55  jberry
  74.  * Minor bug fixes to FreeBSD port
  75.  *
  76.  * Revision 1.7  2002/12/12 16:28:48  peiyongz
  77.  * MsgCatalogLoader added.
  78.  *
  79.  * Revision 1.6  2002/12/02 19:16:26  tng
  80.  * [Bug 14723] Memory leak in atomicOpsMutex.  Patch from Adam Zell.
  81.  *
  82.  * Revision 1.5  2002/11/04 15:13:00  tng
  83.  * C++ Namespace Support.
  84.  *
  85.  * Revision 1.4  2002/07/05 21:29:58  peiyongz
  86.  * Bug# 10250: patch from James Berry
  87.  *
  88.  * Revision 1.3  2002/07/05 21:25:20  peiyongz
  89.  * Bug# 10250: Implementation of new platform methods,
  90.  *                      patch from max@cca.usart.ru (Max Gotlib)
  91.  *
  92.  * Revision 1.2  2002/05/21 20:31:47  tng
  93.  * Minor update: Remove obsolete code
  94.  *
  95.  * Revision 1.1.1.1  2002/02/01 22:22:24  peiyongz
  96.  * sane_include
  97.  *
  98.  * Revision 1.3  2001/12/03 16:25:00  tng
  99.  * [Bug 5237] PATH_MAX undefined during build without threading support.
  100.  *
  101.  * Revision 1.2  2001/12/03 14:45:11  tng
  102.  * FreeBSD native transcoder (IconvFBSD) added by Max Gotlib.
  103.  *
  104.  * Revision 1.1  2001/11/29 18:25:18  tng
  105.  * FreeBSD support by Michael Huedepohl.
  106.  *
  107.  */
  108. // ---------------------------------------------------------------------------
  109. //  Includes
  110. // ---------------------------------------------------------------------------
  111. #if !defined(APP_NO_THREADS)
  112. #include    <pthread.h>
  113. #endif
  114. #ifndef _GNU_SOURCE
  115.     #error _GNU_SOURCE is not defined in your compile settings
  116. #endif
  117. #include    <unistd.h>
  118. #include    <stdio.h>
  119. #include    <stdlib.h>
  120. #include    <errno.h>
  121. // #include    <libgen.h>
  122. #include    <sys/time.h>
  123. #include    <string.h>
  124. #include    <limits.h>
  125. #include    <xercesc/util/PlatformUtils.hpp>
  126. #include    <xercesc/util/RuntimeException.hpp>
  127. #include    <xercesc/util/Janitor.hpp>
  128. #include    <xercesc/util/Mutexes.hpp>
  129. #include    <xercesc/util/XMLString.hpp>
  130. #include    <xercesc/util/XMLUniDefs.hpp>
  131. #include    <xercesc/util/XMLUni.hpp>
  132. #include    <xercesc/util/PanicHandler.hpp>
  133. #if defined(XML_USE_ICU_TRANSCODER)
  134.     #include <xercesc/util/Transcoders/ICU/ICUTransService.hpp>
  135. #else
  136.     // Use native transcoder. Same as -DXML_USE_NATIVE_TRANSCODER
  137.     #include <xercesc/util/Transcoders/IconvFBSD/IconvFBSDTransService.hpp>
  138. #endif
  139. #if defined(XML_USE_ICU_MESSAGELOADER)
  140.     #include <xercesc/util/MsgLoaders/ICU/ICUMsgLoader.hpp>
  141. #elif defined (XML_USE_ICONV_MESSAGELOADER)
  142.     #include <xercesc/util/MsgLoaders/MsgCatalog/MsgCatalogLoader.hpp>
  143. #else
  144.     // Same as -DXML_USE_INMEM_MESSAGELOADER
  145.     #include <xercesc/util/MsgLoaders/InMemory/InMemMsgLoader.hpp>
  146. #endif
  147. #if defined (XML_USE_NETACCESSOR_SOCKET)
  148.     #include <xercesc/util/NetAccessors/Socket/SocketNetAccessor.hpp>
  149. #endif
  150. XERCES_CPP_NAMESPACE_BEGIN
  151. // ---------------------------------------------------------------------------
  152. //  XMLPlatformUtils: Private Static Methods
  153. // ---------------------------------------------------------------------------
  154. XMLNetAccessor* XMLPlatformUtils::makeNetAccessor()
  155. {
  156. #if defined (XML_USE_NETACCESSOR_SOCKET)
  157.     return new SocketNetAccessor();
  158. #else
  159.     return 0;
  160. #endif
  161. }
  162. //
  163. //  This method is called by the platform independent part of this class
  164. //  when client code asks to have one of the supported message sets loaded.
  165. //
  166. XMLMsgLoader* XMLPlatformUtils::loadAMsgSet(const XMLCh* const msgDomain)
  167. {
  168.     XMLMsgLoader* retVal;
  169.     try
  170.     {
  171. #if defined (XML_USE_ICU_MESSAGELOADER)
  172.         retVal = new ICUMsgLoader(msgDomain);
  173. #elif defined (XML_USE_ICONV_MESSAGELOADER)
  174.         retVal = new MsgCatalogLoader(msgDomain);        
  175. #else
  176.         // same as -DXML_USE_INMEM_MESSAGELOADER
  177.         retVal = new InMemMsgLoader(msgDomain);
  178. #endif
  179.     }
  180.     catch(...)
  181.     {
  182.         panic(PanicHandler::Panic_CantLoadMsgDomain);
  183.     }
  184.     return retVal;
  185. }
  186. //
  187. //  This method is called very early in the bootstrapping process. This guy
  188. //  must create a transcoding service and return it. It cannot use any string
  189. //  methods, any transcoding services, throw any exceptions, etc... It just
  190. //  makes a transcoding service and returns it, or returns zero on failure.
  191. //
  192. XMLTransService* XMLPlatformUtils::makeTransService()
  193. {
  194. #if defined (XML_USE_ICU_TRANSCODER)
  195.     // Use ICU transcoding services.
  196.     // same as -DXML_USE_ICU_MESSAGELOADER
  197.     return new ICUTransService;
  198. #else
  199.     // Use native transcoding services.
  200.     // same as -DXML_USE_INMEM_MESSAGELOADER
  201.     return new IconvFBSDTransService;
  202. #endif
  203. }
  204. // ---------------------------------------------------------------------------
  205. //  XMLPlatformUtils: The panic method
  206. // ---------------------------------------------------------------------------
  207. void XMLPlatformUtils::panic(const PanicHandler::PanicReasons reason)
  208. {
  209.     fgUserPanicHandler? fgUserPanicHandler->panic(reason) : fgDefaultPanicHandler->panic(reason);
  210. }
  211. // ---------------------------------------------------------------------------
  212. //  XMLPlatformUtils: File Methods
  213. // ---------------------------------------------------------------------------
  214. unsigned int XMLPlatformUtils::curFilePos(FileHandle theFile)
  215. {
  216.     if (theFile == NULL)
  217. ThrowXML(XMLPlatformUtilsException,
  218.  XMLExcepts::CPtr_PointerIsZero);
  219.     off_t curPos = ftell( (FILE*)theFile);
  220.     if (curPos == -1)
  221.         ThrowXML(XMLPlatformUtilsException,
  222.                  XMLExcepts::File_CouldNotGetSize);
  223.     return (unsigned int)curPos;
  224. }
  225. void XMLPlatformUtils::closeFile(FileHandle theFile)
  226. {
  227.     if (theFile == NULL)
  228. ThrowXML(XMLPlatformUtilsException,
  229.  XMLExcepts::CPtr_PointerIsZero);
  230.     if (fclose((FILE*)theFile))
  231.         ThrowXML(XMLPlatformUtilsException,
  232.                  XMLExcepts::File_CouldNotCloseFile);
  233. }
  234. unsigned int XMLPlatformUtils::fileSize(FileHandle theFile)
  235. {
  236.     if (theFile == NULL)
  237. ThrowXML(XMLPlatformUtilsException,
  238.  XMLExcepts::CPtr_PointerIsZero);
  239.     // Get the current position
  240.     off_t curPos = ftell((FILE*) theFile);
  241.     if (curPos == -1)
  242.         ThrowXML(XMLPlatformUtilsException,
  243.                  XMLExcepts::File_CouldNotGetCurPos);
  244.     // Seek to the end and save that value for return
  245.     if (fseek((FILE*) theFile, 0, SEEK_END))
  246.         ThrowXML(XMLPlatformUtilsException,
  247.                  XMLExcepts::File_CouldNotSeekToEnd);
  248.     off_t retVal = ftell((FILE*)theFile);
  249.     if (retVal == -1)
  250.         ThrowXML(XMLPlatformUtilsException,
  251.                  XMLExcepts::File_CouldNotSeekToEnd);
  252.     // And put the pointer back
  253.     if (fseek( (FILE*)theFile, curPos, SEEK_SET) )
  254.         ThrowXML(XMLPlatformUtilsException,
  255.                  XMLExcepts::File_CouldNotSeekToPos);
  256.     return (unsigned int)retVal;
  257. }
  258. FileHandle XMLPlatformUtils::openFile(const XMLCh* const fileName)
  259. {
  260.     if (fileName == NULL)
  261. ThrowXML(XMLPlatformUtilsException,
  262.  XMLExcepts::CPtr_PointerIsZero);
  263.     const char* tmpFileName = XMLString::transcode(fileName, fgMemoryManager);
  264.     ArrayJanitor<char> janText((char*)tmpFileName, fgMemoryManager);
  265.     FileHandle retVal = (FileHandle)fopen( tmpFileName , "r+" );
  266.     return retVal;
  267. }
  268. FileHandle XMLPlatformUtils::openFile(const char* const fileName)
  269. {
  270.     if (fileName == NULL)
  271. ThrowXML(XMLPlatformUtilsException,
  272.  XMLExcepts::CPtr_PointerIsZero);
  273.     FileHandle retVal = (FileHandle)fopen( fileName , "r+" );
  274.     return retVal;
  275. }
  276. FileHandle XMLPlatformUtils::openFileToWrite(const XMLCh* const fileName)
  277. {
  278.     if (fileName == NULL)
  279. ThrowXML(XMLPlatformUtilsException,
  280.  XMLExcepts::CPtr_PointerIsZero);
  281.     const char* tmpFileName = XMLString::transcode(fileName, fgMemoryManager);
  282.     ArrayJanitor<char> janText((char*)tmpFileName, fgMemoryManager);
  283.     return fopen( tmpFileName , "w" );
  284. }
  285. FileHandle XMLPlatformUtils::openFileToWrite(const char* const fileName)
  286. {
  287.     if (fileName == NULL)
  288. ThrowXML(XMLPlatformUtilsException,
  289.  XMLExcepts::CPtr_PointerIsZero);
  290.     return fopen( fileName , "w" );
  291. }
  292. FileHandle XMLPlatformUtils::openStdInHandle()
  293. {
  294.     int nfd = dup(0);
  295.     if (nfd == -1)
  296. ThrowXML(XMLPlatformUtilsException,
  297. XMLExcepts::File_CouldNotDupHandle);
  298.     return (FileHandle) fdopen(nfd, "r");
  299. }
  300. unsigned int
  301. XMLPlatformUtils::readFileBuffer( FileHandle          theFile
  302.                                 , const unsigned int  toRead
  303.                                 , XMLByte* const      toFill)
  304. {
  305.     if ( !theFile || !toFill )
  306. ThrowXML(XMLPlatformUtilsException,
  307.  XMLExcepts::CPtr_PointerIsZero);
  308.     if (toRead == 0)
  309. return 0;
  310.     size_t noOfItemsRead = fread((void*) toFill, 1, toRead, (FILE*)theFile);
  311.     if(ferror((FILE*)theFile))
  312.     {
  313.         ThrowXML(XMLPlatformUtilsException,
  314.                  XMLExcepts::File_CouldNotReadFromFile);
  315.     }
  316.     return (unsigned int)noOfItemsRead;
  317. }
  318. void XMLPlatformUtils::writeBufferToFile( FileHandle     const  theFile
  319. , long                  toWrite
  320. , const XMLByte* const  toFlush )
  321. {
  322.     if ( !theFile || !toFlush )
  323. ThrowXML(XMLPlatformUtilsException,
  324.  XMLExcepts::CPtr_PointerIsZero);
  325.     if ( toWrite <= 0 )
  326. return;
  327.     const XMLByte* tmpFlush = (const XMLByte*) toFlush;
  328.     size_t bytesWritten = 0;
  329.     while (true)
  330.     {
  331.         bytesWritten = fwrite(tmpFlush, sizeof(XMLByte), toWrite, (FILE*)theFile);
  332.         if(ferror((FILE*)theFile))
  333. {
  334. ThrowXML(XMLPlatformUtilsException,
  335. XMLExcepts::File_CouldNotWriteToFile);
  336. }
  337.         if (bytesWritten < (size_t) toWrite) //incomplete write
  338.         {
  339.             tmpFlush += bytesWritten;
  340.             toWrite -= bytesWritten;
  341.             bytesWritten = 0;
  342.         }
  343.         else
  344.             return;
  345.     }
  346. }
  347. void XMLPlatformUtils::resetFile(FileHandle theFile)
  348. {
  349.     if (theFile == NULL)
  350. ThrowXML(XMLPlatformUtilsException,
  351.  XMLExcepts::CPtr_PointerIsZero);
  352.     // Seek to the start of the file
  353.     if (fseek((FILE*)theFile, 0, SEEK_SET))
  354.         ThrowXML(XMLPlatformUtilsException,
  355.                  XMLExcepts::File_CouldNotResetFile);
  356. }
  357. // ---------------------------------------------------------------------------
  358. //  XMLPlatformUtils: File system methods
  359. // ---------------------------------------------------------------------------
  360. XMLCh* XMLPlatformUtils::getFullPath(const XMLCh* const srcPath,
  361.                                      MemoryManager* const manager)
  362. {
  363.     //
  364.     //  NOTE: THe path provided has always already been opened successfully,
  365.     //  so we know that its not some pathological freaky path. It comes in
  366.     //  in native format, and goes out as Unicode always
  367.     //
  368.     char* newSrc = XMLString::transcode(srcPath, fgMemoryManager);
  369.     ArrayJanitor<char> janText(newSrc, fgMemoryManager);
  370.     // Use a local buffer that is big enough for the largest legal path
  371.     char absPath[PATH_MAX + 1];
  372.     // get the absolute path
  373.     char* retPath = realpath(newSrc, &absPath[0]);
  374.     if (!retPath)
  375.     {
  376.         ThrowXML(XMLPlatformUtilsException, XMLExcepts::File_CouldNotGetBasePathName);
  377.     }
  378.     return XMLString::transcode(absPath, manager);
  379. }
  380. bool XMLPlatformUtils::isRelative(const XMLCh* const toCheck)
  381. {
  382.     // Check for pathological case of empty path
  383.     if (!toCheck[0])
  384.         return false;
  385.     //
  386.     //  If it starts with a slash, then it cannot be relative. This covers
  387.     //  both something like "TestFile.xml" and an NT Lan type remote path
  388.     //  that starts with a node like "\MyNodeTestFile.xml".
  389.     //
  390.     if (toCheck[0] == XMLCh('/'))
  391.         return false;
  392.     // Else assume its a relative path
  393.     return true;
  394. }
  395. XMLCh* XMLPlatformUtils::getCurrentDirectory(MemoryManager* const manager)
  396. {
  397.     char  dirBuf[PATH_MAX + 1];
  398.     char  *curDir = getcwd(&dirBuf[0], PATH_MAX + 1);
  399.     if (!curDir)
  400.     {
  401.         ThrowXML(XMLPlatformUtilsException,
  402.                  XMLExcepts::File_CouldNotGetBasePathName);
  403.     }
  404.     return XMLString::transcode(curDir, manager);
  405. }
  406. inline bool XMLPlatformUtils::isAnySlash(XMLCh c) 
  407. {
  408.     return ( chBackSlash == c || chForwardSlash == c);
  409. }
  410. // ---------------------------------------------------------------------------
  411. //  XMLPlatformUtils: Timing Methods
  412. // ---------------------------------------------------------------------------
  413. unsigned long XMLPlatformUtils::getCurrentMillis()
  414. {
  415.     struct timeval aTime;
  416.     gettimeofday(&aTime, NULL);
  417.     return (unsigned long) (aTime.tv_sec * 1000 + aTime.tv_usec / 1000);
  418. }
  419. // -----------------------------------------------------------------------
  420. //  Mutex methods
  421. // -----------------------------------------------------------------------
  422. #if !defined(APP_NO_THREADS)
  423. // ---------------------------------------------------------------------------
  424. //  XMLPlatformUtils: Platform init method
  425. // ---------------------------------------------------------------------------
  426. static XMLMutex atomicOpsMutex;
  427. void XMLPlatformUtils::platformInit()
  428. {
  429.     //
  430.     // The atomicOps mutex needs to be created early.
  431.     // Normally, mutexes are created on first use, but there is a
  432.     // circular dependency between compareAndExchange() and
  433.     // mutex creation that must be broken.
  434.     if (atomicOpsMutex.fHandle == 0)
  435.         atomicOpsMutex.fHandle = XMLPlatformUtils::makeMutex();
  436. }
  437. void* XMLPlatformUtils::makeMutex()
  438. {
  439.     pthread_mutex_t* mutex = new pthread_mutex_t;
  440.     pthread_mutexattr_t*  attr = new pthread_mutexattr_t;
  441.     pthread_mutexattr_init(attr);
  442.     pthread_mutexattr_settype(attr, PTHREAD_MUTEX_RECURSIVE);
  443.     if (pthread_mutex_init(mutex, attr))
  444.     {
  445.         ThrowXML(XMLPlatformUtilsException,
  446.                  XMLExcepts::Mutex_CouldNotCreate);
  447.     }
  448.     pthread_mutexattr_destroy(attr);
  449.     delete attr;
  450.     return (void*)(mutex);
  451. }
  452. void XMLPlatformUtils::closeMutex(void* const mtxHandle)
  453. {
  454.     if (mtxHandle != NULL)
  455.     {
  456.         if (pthread_mutex_destroy((pthread_mutex_t*) mtxHandle))
  457.         {
  458.             ThrowXML(XMLPlatformUtilsException,
  459.                      XMLExcepts::Mutex_CouldNotDestroy);
  460.         }
  461.         delete (pthread_mutex_t*)mtxHandle;
  462.     }
  463. }
  464. void XMLPlatformUtils::lockMutex(void* const mtxHandle)
  465. {
  466.     if (mtxHandle != NULL)
  467.     {
  468.         if (pthread_mutex_lock((pthread_mutex_t*) mtxHandle))
  469.         {
  470.             ThrowXML(XMLPlatformUtilsException,
  471.                      XMLExcepts::Mutex_CouldNotLock);
  472.         }
  473.     }
  474. }
  475. void XMLPlatformUtils::unlockMutex(void* const mtxHandle)
  476. {
  477.     if (mtxHandle != NULL)
  478.     {
  479.         if (pthread_mutex_unlock((pthread_mutex_t*) mtxHandle))
  480.         {
  481.             ThrowXML(XMLPlatformUtilsException,
  482.                      XMLExcepts::Mutex_CouldNotUnlock);
  483.         }
  484.     }
  485. }
  486. // -----------------------------------------------------------------------
  487. //  Miscellaneous synchronization methods
  488. // -----------------------------------------------------------------------
  489. void* XMLPlatformUtils::compareAndSwap(void**            toFill
  490.                                      , const void* const newValue
  491.                                      , const void* const toCompare)
  492. {
  493.     XMLMutexLock lockMutex(&atomicOpsMutex);
  494.     void *retVal = *toFill;
  495.     if (*toFill == toCompare)
  496.         *toFill = (void *)newValue;
  497.     return retVal;
  498. }
  499. int XMLPlatformUtils::atomicIncrement(int &location)
  500. {
  501.     XMLMutexLock localLock(&atomicOpsMutex);
  502.     return ++location;
  503. }
  504. int XMLPlatformUtils::atomicDecrement(int &location)
  505. {
  506.     XMLMutexLock localLock(&atomicOpsMutex);
  507.     return --location;
  508. }
  509. #else // #if !defined (APP_NO_THREADS)
  510. void XMLPlatformUtils::platformInit()
  511. {
  512. }
  513. void* XMLPlatformUtils::makeMutex()
  514. {
  515.         return 0;
  516. }
  517. void XMLPlatformUtils::closeMutex(void* const mtxHandle)
  518. {
  519. }
  520. void XMLPlatformUtils::lockMutex(void* const mtxHandle)
  521. {
  522. }
  523. void XMLPlatformUtils::unlockMutex(void* const mtxHandle)
  524. {
  525. }
  526. void* XMLPlatformUtils::compareAndSwap (void**             toFill,
  527.                                         const void* const  newValue,
  528.                                         const void* const  toCompare)
  529. {
  530.     void *retVal = *toFill;
  531.     if (*toFill == toCompare)
  532.        *toFill = (void *)newValue;
  533.     return retVal;
  534. }
  535. int XMLPlatformUtils::atomicIncrement(int &location)
  536. {
  537.     return ++location;
  538. }
  539. int XMLPlatformUtils::atomicDecrement(int &location)
  540. {
  541.     return --location;
  542. }
  543. #endif // APP_NO_THREADS
  544. void XMLPlatformUtils::platformTerm()
  545. {
  546. #if !defined(APP_NO_THREADS)
  547.     // delete the mutex we created
  548. closeMutex(atomicOpsMutex.fHandle);
  549. atomicOpsMutex.fHandle = 0;
  550. #endif
  551. }
  552. #include <xercesc/util/LogicalPath.c>
  553. XERCES_CPP_NAMESPACE_END