You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/09/03 22:29:36 UTC
svn commit: r811108 -
/commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
Author: mturk
Date: Thu Sep 3 20:29:36 2009
New Revision: 811108
URL: http://svn.apache.org/viewvc?rev=811108&view=rev
Log:
Make sure ACR_GET_OS_ERROR always returns non zero
Modified:
commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h?rev=811108&r1=811107&r2=811108&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h Thu Sep 3 20:29:36 2009
@@ -1366,16 +1366,37 @@
/** @} */
#if defined(WIN32) && !defined(DOXYGEN)
+/**
+ * Special version of GetLastError that never returns 0
+ * If GetLastError is zero, ERROR_RETRY (EAGAIN) is returned instead.
+ * Make sure you call ACR_GET_OS_ERROR only when error happens.
+ */
+static __inline DWORD _SysGetLastError()
+{
+ DWORD err = GetLastError();
+ return err == ERROR_SUCCESS ? ERROR_RETRY : err;
+}
+
+/**
+ * Special version of WSAGetLastError that never returns 0
+ * If WSAGetLastError is zero, WSAEWOULDBLOCK (EAGAIN) is returned instead.
+ * Make sure you call ACR_GET_NETOS_ERROR only when error happens.
+ */
+static __inline DWORD _NetGetLastError()
+{
+ DWORD err = WSAGetLastError();
+ return err == ERROR_SUCCESS ? WSAEWOULDBLOCK : err;
+}
#define ACR_FROM_OS_ERROR(e) (e == 0 ? ACR_SUCCESS : e + ACR_OS_START_SYSERR)
#define ACR_TO_OS_ERROR(e) (e == 0 ? ACR_SUCCESS : e - ACR_OS_START_SYSERR)
-#define ACR_GET_OS_ERROR() (ACR_FROM_OS_ERROR(GetLastError()))
+#define ACR_GET_OS_ERROR() (ACR_FROM_OS_ERROR(_SysGetLastError()))
#define ACR_SET_OS_ERROR(e) (SetLastError(ACR_TO_OS_ERROR(e)))
/* A special case, only socket calls require this:
*/
-#define ACR_GET_NETOS_ERROR() (ACR_FROM_OS_ERROR(WSAGetLastError()))
+#define ACR_GET_NETOS_ERROR() (ACR_FROM_OS_ERROR(_NetGetLastError()))
#define ACR_SET_NETOS_ERROR(e) (WSASetLastError(ACR_TO_OS_ERROR(e)))
/* ACR CANONICAL ERROR TESTS */
@@ -1437,6 +1458,7 @@
|| (s) == ACR_OS_START_SYSERR + ERROR_NESTING_NOT_ALLOWED \
|| (s) == ACR_OS_START_SYSERR + ERROR_MAX_THRDS_REACHED \
|| (s) == ACR_OS_START_SYSERR + ERROR_LOCK_VIOLATION \
+ || (s) == ACR_OS_START_SYSERR + ERROR_RETRY \
|| (s) == ACR_OS_START_SYSERR + WSAEWOULDBLOCK)
#define ACR_STATUS_IS_EINTR(s) ((s) == ACR_EINTR \
|| (s) == ACR_OS_START_SYSERR + WSAEINTR)
@@ -1485,12 +1507,12 @@
#define ACR_FROM_OS_ERROR(e) (e)
#define ACR_TO_OS_ERROR(e) (e)
-#define ACR_GET_OS_ERROR() (errno)
+#define ACR_GET_OS_ERROR() (errno ? errno : EAGAIN)
#define ACR_SET_OS_ERROR(e) (errno = (e))
/* A special case, only socket calls require this:
*/
-#define ACR_GET_NETOS_ERROR() (errno)
+#define ACR_GET_NETOS_ERROR() (errno ? errno : EAGAIN)
#define ACR_SET_NETOS_ERROR(e) (errno = (e))
/**