- Timestamp:
- Jan 22, 2009, 9:34:20 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/samba-3.0/source/lib/system.c
r161 r163 29 29 #endif 30 30 31 #ifdef __OS2__ 32 unsigned long _System DosSleep (unsigned long ulInterval); 33 // On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these 34 // ticket:69 code may enter an infinite loop, added a 60sec timeout 35 #define OS2_EAGAIN_RETRY_INIT time_t t1 = time(NULL); 36 #define OS2_EAGAIN_RETRY_CHECK \ 37 if (ret == -1) { \ 38 DEBUG(10,("sys_read: op failed, errno: %d,%s\n", errno, strerror(errno))); \ 39 } \ 40 if (ret==-1 && errno==EAGAIN) { \ 41 DosSleep(100); \ 42 if (time(NULL) - t1 > 60) \ 43 break; \ 44 errno = EINTR; \ 45 } 46 #else 47 #define OS2_EAGAIN_RETRY_INIT 48 #define OS2_EAGAIN_RETRY_CHECK 49 #endif 50 31 51 /* 32 52 The idea is that this file will eventually have wrappers around all … … 122 142 ssize_t sys_read(int fd, void *buf, size_t count) 123 143 { 144 OS2_EAGAIN_RETRY_INIT; 124 145 ssize_t ret; 125 DEBUG(0,("sys_read - count = %d\n",count));126 146 do { 127 147 ret = read(fd, buf, count); 128 #ifndef __OS2__x 148 OS2_EAGAIN_RETRY_CHECK; 149 } while (ret == -1 && errno == EINTR); 150 return ret; 151 } 152 153 /******************************************************************* 154 A write wrapper that will deal with EINTR. 155 ********************************************************************/ 156 157 ssize_t sys_write(int fd, const void *buf, size_t count) 158 { 159 ssize_t ret; 160 do { 161 ret = write(fd, buf, count); 162 #ifndef __OS2__ 129 163 } while (ret == -1 && errno == EINTR); 130 164 #else … … 133 167 #endif 134 168 if (errno == EAGAIN) 135 DEBUG(0,("sys_read - EAGAIN returned - count = %d\n",count));136 return ret;137 }138 139 /*******************************************************************140 A write wrapper that will deal with EINTR.141 ********************************************************************/142 143 ssize_t sys_write(int fd, const void *buf, size_t count)144 {145 ssize_t ret;146 DEBUG(0,("sys_write - count = %d\n",count));147 do {148 ret = write(fd, buf, count);149 #ifndef __OS2__x150 } while (ret == -1 && errno == EINTR);151 #else152 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */153 } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));154 #endif155 if (errno == EAGAIN)156 DEBUG(0,("sys_write - EAGAIN returned - count = %d\n",count));157 169 return ret; 158 170 }
Note:
See TracChangeset
for help on using the changeset viewer.