Changeset 163 for branches


Ignore:
Timestamp:
Jan 22, 2009, 9:34:20 AM (17 years ago)
Author:
Paul Smedley
Message:

Partial fix for ticket 69

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/samba-3.0/source/lib/system.c

    r161 r163  
    2929#endif
    3030
     31#ifdef __OS2__
     32unsigned 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
    3151/*
    3252   The idea is that this file will eventually have wrappers around all
     
    122142ssize_t sys_read(int fd, void *buf, size_t count)
    123143{
     144        OS2_EAGAIN_RETRY_INIT;
    124145        ssize_t ret;
    125 DEBUG(0,("sys_read - count = %d\n",count));
    126146        do {
    127147                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/*******************************************************************
     154A write wrapper that will deal with EINTR.
     155********************************************************************/
     156
     157ssize_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__
    129163        } while (ret == -1 && errno == EINTR);
    130164#else
     
    133167#endif
    134168        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__x
    150         } while (ret == -1 && errno == EINTR);
    151 #else
    152 /* On OS/2 - we randomly get 'Resource Temporarily Unavailable' errors - ignore these */
    153         } while (ret == -1 && ((errno == EINTR)||(errno == EAGAIN)));
    154 #endif
    155         if (errno == EAGAIN)
    156                 DEBUG(0,("sys_write - EAGAIN returned - count = %d\n",count));
    157169        return ret;
    158170}
Note: See TracChangeset for help on using the changeset viewer.