am 7abbbc68: Merge "Add TEMP_FAILURE_RETRY to ZipUtils"

* commit '7abbbc680d03dd8e50a709f89b78ace6b81154b0':
  Add TEMP_FAILURE_RETRY to ZipUtils
This commit is contained in:
Kenny Root 2012-10-16 16:26:42 -07:00 committed by Android Git Automerger
commit 125beceefd
3 changed files with 30 additions and 27 deletions

View File

@ -39,4 +39,27 @@ static inline ssize_t pread64(int fd, void* buf, size_t nbytes, off64_t offset)
#endif /* !HAVE_OFF64_T */ #endif /* !HAVE_OFF64_T */
#if HAVE_PRINTF_ZD
# define ZD "%zd"
# define ZD_TYPE ssize_t
#else
# define ZD "%ld"
# define ZD_TYPE long
#endif
/*
* TEMP_FAILURE_RETRY is defined by some, but not all, versions of
* <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
* not already defined, then define it here.
*/
#ifndef TEMP_FAILURE_RETRY
/* Used to retry syscalls that can return EINTR. */
#define TEMP_FAILURE_RETRY(exp) ({ \
typeof (exp) _rc; \
do { \
_rc = (exp); \
} while (_rc == -1 && errno == EINTR); \
_rc; })
#endif
#endif /* __LIB_UTILS_COMPAT_H */ #endif /* __LIB_UTILS_COMPAT_H */

View File

@ -20,6 +20,7 @@
#define LOG_TAG "zipro" #define LOG_TAG "zipro"
//#define LOG_NDEBUG 0 //#define LOG_NDEBUG 0
#include <utils/Log.h> #include <utils/Log.h>
#include <utils/Compat.h>
#include <utils/ZipFileRO.h> #include <utils/ZipFileRO.h>
#include <utils/misc.h> #include <utils/misc.h>
#include <utils/threads.h> #include <utils/threads.h>
@ -32,14 +33,6 @@
#include <assert.h> #include <assert.h>
#include <unistd.h> #include <unistd.h>
#if HAVE_PRINTF_ZD
# define ZD "%zd"
# define ZD_TYPE ssize_t
#else
# define ZD "%ld"
# define ZD_TYPE long
#endif
/* /*
* We must open binary files using open(path, ... | O_BINARY) under Windows. * We must open binary files using open(path, ... | O_BINARY) under Windows.
* Otherwise strange read errors will happen. * Otherwise strange read errors will happen.
@ -48,21 +41,6 @@
# define O_BINARY 0 # define O_BINARY 0
#endif #endif
/*
* TEMP_FAILURE_RETRY is defined by some, but not all, versions of
* <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
* not already defined, then define it here.
*/
#ifndef TEMP_FAILURE_RETRY
/* Used to retry syscalls that can return EINTR. */
#define TEMP_FAILURE_RETRY(exp) ({ \
typeof (exp) _rc; \
do { \
_rc = (exp); \
} while (_rc == -1 && errno == EINTR); \
_rc; })
#endif
using namespace android; using namespace android;
/* /*

View File

@ -21,6 +21,7 @@
#define LOG_TAG "ziputil" #define LOG_TAG "ziputil"
#include <utils/Log.h> #include <utils/Log.h>
#include <utils/Compat.h>
#include <utils/ZipUtils.h> #include <utils/ZipUtils.h>
#include <utils/ZipFileRO.h> #include <utils/ZipFileRO.h>
@ -98,10 +99,11 @@ using namespace android;
ALOGV("+++ reading %ld bytes (%ld left)\n", ALOGV("+++ reading %ld bytes (%ld left)\n",
getSize, compRemaining); getSize, compRemaining);
int cc = read(fd, readBuf, getSize); int cc = TEMP_FAILURE_RETRY(read(fd, readBuf, getSize));
if (cc != (int) getSize) { if (cc < 0) {
ALOGD("inflate read failed (%d vs %ld)\n", ALOGW("inflate read failed: %s", strerror(errno));
cc, getSize); } else if (cc != (int) getSize) {
ALOGW("inflate read failed (%d vs %ld)", cc, getSize);
goto z_bail; goto z_bail;
} }