summaryrefslogtreecommitdiff
path: root/ACE/ace/OS_NS_errno.inl
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/ace/OS_NS_errno.inl')
-rw-r--r--ACE/ace/OS_NS_errno.inl83
1 files changed, 83 insertions, 0 deletions
diff --git a/ACE/ace/OS_NS_errno.inl b/ACE/ace/OS_NS_errno.inl
new file mode 100644
index 00000000000..9e8ce9e7bc2
--- /dev/null
+++ b/ACE/ace/OS_NS_errno.inl
@@ -0,0 +1,83 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "ace/config-all.h" /* Need ACE_TRACE */
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE int
+ACE_OS::last_error (void)
+{
+ // ACE_OS_TRACE ("ACE_OS::last_error");
+
+#if defined (ACE_WIN32)
+ // ACE_OS::last_error() prefers errnor since started out as a way to
+ // avoid directly accessing errno in ACE code - particularly the ACE
+ // C++ socket wrapper facades. On Windows, some things that would
+ // use errno on UNIX require ::GetLastError(), so this method tries
+ // to shield the rest of ACE from having to know about this.
+ int lerror = ::GetLastError ();
+ int lerrno = errno;
+ return lerrno == 0 ? lerror : lerrno;
+#else
+ return errno;
+#endif /* ACE_WIN32 */
+}
+
+ACE_INLINE void
+ACE_OS::last_error (int error)
+{
+ ACE_OS_TRACE ("ACE_OS::last_error");
+#if defined (ACE_WIN32)
+ ::SetLastError (error);
+#endif /* ACE_WIN32 */
+ errno = error;
+}
+
+ACE_INLINE int
+ACE_OS::set_errno_to_last_error (void)
+{
+# if defined (ACE_WIN32)
+ return errno = ::GetLastError ();
+#else
+ return errno;
+# endif /* defined(ACE_WIN32) */
+}
+
+ACE_INLINE int
+ACE_OS::set_errno_to_wsa_last_error (void)
+{
+# if defined (ACE_WIN32)
+ return errno = ::WSAGetLastError ();
+#else
+ return errno;
+# endif /* defined(ACE_WIN32) */
+}
+
+#if defined (ACE_HAS_WINCE_BROKEN_ERRNO)
+
+ACE_INLINE ACE_CE_Errno *
+ACE_CE_Errno::instance ()
+{
+ // This should be inlined.
+ return ACE_CE_Errno::instance_;
+}
+
+ACE_INLINE
+ACE_CE_Errno::operator int (void) const
+{
+ return (int) TlsGetValue (ACE_CE_Errno::errno_key_);
+}
+
+ACE_INLINE int
+ACE_CE_Errno::operator= (int x)
+{
+ // error checking?
+ TlsSetValue (ACE_CE_Errno::errno_key_, (void *) x);
+ return x;
+}
+
+#endif /* ACE_HAS_WINCE_BROKEN_ERRNO */
+
+ACE_END_VERSIONED_NAMESPACE_DECL