ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/libeio/eio.c
(Generate patch)

Comparing cvsroot/libeio/eio.c (file contents):
Revision 1.118 by root, Mon Apr 2 17:53:27 2012 UTC vs.
Revision 1.123 by root, Tue Oct 9 04:53:53 2012 UTC

132 #define sync() EIO_ENOSYS () 132 #define sync() EIO_ENOSYS ()
133 #define readlink(path,buf,s) EIO_ENOSYS () 133 #define readlink(path,buf,s) EIO_ENOSYS ()
134 #define statvfs(path,buf) EIO_ENOSYS () 134 #define statvfs(path,buf) EIO_ENOSYS ()
135 #define fstatvfs(fd,buf) EIO_ENOSYS () 135 #define fstatvfs(fd,buf) EIO_ENOSYS ()
136 136
137 #define pread(fd,buf,count,offset) eio__pread (fd, buf, count, offset)
138 #define pwrite(fd,buf,count,offset) eio__pwrite (fd, buf, count, offset)
139
140 #if __GNUC__
141 typedef long long eio_off_t; /* signed for compatibility to msvc */
142 #else
143 typedef __int64 eio_off_t; /* unsigned not supported by msvc */
144 #endif
145
146 static eio_ssize_t
147 eio__pread (int fd, void *buf, eio_ssize_t count, eio_off_t offset)
148 {
149 OVERLAPPED o = { 0 };
150 DWORD got;
151
152 o.Offset = offset;
153 o.OffsetHigh = offset >> 32;
154
155 return ReadFile ((HANDLE)EIO_FD_TO_WIN32_HANDLE (fd), buf, count, &got, &o)
156 ? got : -1;
157 }
158
159 static eio_ssize_t
160 eio__pwrite (int fd, void *buf, eio_ssize_t count, eio_off_t offset)
161 {
162 OVERLAPPED o = { 0 };
163 DWORD got;
164
165 o.Offset = offset;
166 o.OffsetHigh = offset >> 32;
167
168 return WriteFile ((HANDLE)EIO_FD_TO_WIN32_HANDLE (fd), buf, count, &got, &o)
169 ? got : -1;
170 }
171
137 /* rename() uses MoveFile, which fails to overwrite */ 172 /* rename() uses MoveFile, which fails to overwrite */
138 #define rename(old,neu) eio__rename (old, neu) 173 #define rename(old,neu) eio__rename (old, neu)
139 174
140 static int 175 static int
141 eio__rename (const char *old, const char *neu) 176 eio__rename (const char *old, const char *neu)
379static xmutex_t wrklock; 414static xmutex_t wrklock;
380static xmutex_t reslock; 415static xmutex_t reslock;
381static xmutex_t reqlock; 416static xmutex_t reqlock;
382static xcond_t reqwait; 417static xcond_t reqwait;
383 418
384#if !HAVE_PREADWRITE
385/*
386 * make our pread/pwrite emulation safe against themselves, but not against
387 * normal read/write by using a mutex. slows down execution a lot,
388 * but that's your problem, not mine.
389 */
390static xmutex_t preadwritelock;
391#endif
392
393typedef struct etp_worker 419typedef struct etp_worker
394{ 420{
395 struct tmpbuf tmpbuf; 421 struct tmpbuf tmpbuf;
396 422
397 /* locked by wrklock */ 423 /* locked by wrklock */
943} 969}
944 970
945/*****************************************************************************/ 971/*****************************************************************************/
946/* work around various missing functions */ 972/* work around various missing functions */
947 973
948#if !HAVE_PREADWRITE
949# undef pread
950# undef pwrite
951# define pread eio__pread
952# define pwrite eio__pwrite
953
954static eio_ssize_t
955eio__pread (int fd, void *buf, size_t count, off_t offset)
956{
957 eio_ssize_t res;
958 off_t ooffset;
959
960 X_LOCK (preadwritelock);
961 ooffset = lseek (fd, 0, SEEK_CUR);
962 lseek (fd, offset, SEEK_SET);
963 res = read (fd, buf, count);
964 lseek (fd, ooffset, SEEK_SET);
965 X_UNLOCK (preadwritelock);
966
967 return res;
968}
969
970static eio_ssize_t
971eio__pwrite (int fd, void *buf, size_t count, off_t offset)
972{
973 eio_ssize_t res;
974 off_t ooffset;
975
976 X_LOCK (preadwritelock);
977 ooffset = lseek (fd, 0, SEEK_CUR);
978 lseek (fd, offset, SEEK_SET);
979 res = write (fd, buf, count);
980 lseek (fd, ooffset, SEEK_SET);
981 X_UNLOCK (preadwritelock);
982
983 return res;
984}
985#endif
986
987#ifndef HAVE_UTIMES 974#ifndef HAVE_UTIMES
988 975
989# undef utimes 976# undef utimes
990# define utimes(path,times) eio__utimes (path, times) 977# define utimes(path,times) eio__utimes (path, times)
991 978
1032 int res; 1019 int res;
1033 1020
1034#if HAVE_SYS_SYNCFS 1021#if HAVE_SYS_SYNCFS
1035 res = (int)syscall (__NR_syncfs, (int)(fd)); 1022 res = (int)syscall (__NR_syncfs, (int)(fd));
1036#else 1023#else
1037 res = -1; 1024 res = EIO_ENOSYS ();
1038 errno = ENOSYS;
1039#endif 1025#endif
1040 1026
1041 if (res < 0 && errno == ENOSYS && fd >= 0) 1027 if (res < 0 && errno == ENOSYS && fd >= 0)
1042 sync (); 1028 sync ();
1043 1029
1073} 1059}
1074 1060
1075static int 1061static int
1076eio__fallocate (int fd, int mode, off_t offset, size_t len) 1062eio__fallocate (int fd, int mode, off_t offset, size_t len)
1077{ 1063{
1078#if HAVE_FALLOCATE 1064#if HAVE_LINUX_FALLOCATE
1079 return fallocate (fd, mode, offset, len); 1065 return fallocate (fd, mode, offset, len);
1080#else 1066#else
1081 errno = ENOSYS; 1067 return EIO_ENOSYS ();
1082 return -1;
1083#endif 1068#endif
1084} 1069}
1085 1070
1086#if !HAVE_READAHEAD 1071#if !HAVE_READAHEAD
1087# undef readahead 1072# undef readahead
1186 HANDLE h = TO_SOCKET (ifd); 1171 HANDLE h = TO_SOCKET (ifd);
1187 SetFilePointer (h, offset, 0, FILE_BEGIN); 1172 SetFilePointer (h, offset, 0, FILE_BEGIN);
1188 res = TransmitFile (TO_SOCKET (ofd), h, count, 0, 0, 0, 0); 1173 res = TransmitFile (TO_SOCKET (ofd), h, count, 0, 0, 0, 0);
1189 1174
1190#else 1175#else
1191 res = -1; 1176 res = EIO_ENOSYS ();
1192 errno = ENOSYS;
1193#endif 1177#endif
1194 1178
1195 /* we assume sendfile can copy at least 128mb in one go */ 1179 /* we assume sendfile can copy at least 128mb in one go */
1196 if (res <= 128 * 1024 * 1024) 1180 if (res <= 128 * 1024 * 1024)
1197 { 1181 {
1934 #ifdef DT_FIFO 1918 #ifdef DT_FIFO
1935 case DT_FIFO: ent->type = EIO_DT_FIFO; break; 1919 case DT_FIFO: ent->type = EIO_DT_FIFO; break;
1936 #endif 1920 #endif
1937 #ifdef DT_CHR 1921 #ifdef DT_CHR
1938 case DT_CHR: ent->type = EIO_DT_CHR; break; 1922 case DT_CHR: ent->type = EIO_DT_CHR; break;
1939 #endif 1923 #endif
1940 #ifdef DT_MPC 1924 #ifdef DT_MPC
1941 case DT_MPC: ent->type = EIO_DT_MPC; break; 1925 case DT_MPC: ent->type = EIO_DT_MPC; break;
1942 #endif 1926 #endif
1943 #ifdef DT_DIR 1927 #ifdef DT_DIR
1944 case DT_DIR: ent->type = EIO_DT_DIR; break; 1928 case DT_DIR: ent->type = EIO_DT_DIR; break;
1945 #endif 1929 #endif
1946 #ifdef DT_NAM 1930 #ifdef DT_NAM
1947 case DT_NAM: ent->type = EIO_DT_NAM; break; 1931 case DT_NAM: ent->type = EIO_DT_NAM; break;
1948 #endif 1932 #endif
1949 #ifdef DT_BLK 1933 #ifdef DT_BLK
1950 case DT_BLK: ent->type = EIO_DT_BLK; break; 1934 case DT_BLK: ent->type = EIO_DT_BLK; break;
1951 #endif 1935 #endif
1952 #ifdef DT_MPB 1936 #ifdef DT_MPB
1953 case DT_MPB: ent->type = EIO_DT_MPB; break; 1937 case DT_MPB: ent->type = EIO_DT_MPB; break;
1954 #endif 1938 #endif
1955 #ifdef DT_REG 1939 #ifdef DT_REG
1956 case DT_REG: ent->type = EIO_DT_REG; break; 1940 case DT_REG: ent->type = EIO_DT_REG; break;
1957 #endif 1941 #endif
1958 #ifdef DT_NWK 1942 #ifdef DT_NWK
1959 case DT_NWK: ent->type = EIO_DT_NWK; break; 1943 case DT_NWK: ent->type = EIO_DT_NWK; break;
1960 #endif 1944 #endif
1961 #ifdef DT_CMP 1945 #ifdef DT_CMP
1962 case DT_CMP: ent->type = EIO_DT_CMP; break; 1946 case DT_CMP: ent->type = EIO_DT_CMP; break;
1963 #endif 1947 #endif
1964 #ifdef DT_LNK 1948 #ifdef DT_LNK
1965 case DT_LNK: ent->type = EIO_DT_LNK; break; 1949 case DT_LNK: ent->type = EIO_DT_LNK; break;
1966 #endif 1950 #endif
1967 #ifdef DT_SOCK 1951 #ifdef DT_SOCK
1968 case DT_SOCK: ent->type = EIO_DT_SOCK; break; 1952 case DT_SOCK: ent->type = EIO_DT_SOCK; break;
2252/*****************************************************************************/ 2236/*****************************************************************************/
2253 2237
2254int ecb_cold 2238int ecb_cold
2255eio_init (void (*want_poll)(void), void (*done_poll)(void)) 2239eio_init (void (*want_poll)(void), void (*done_poll)(void))
2256{ 2240{
2257#if !HAVE_PREADWRITE
2258 X_MUTEX_CREATE (preadwritelock);
2259#endif
2260
2261 return etp_init (want_poll, done_poll); 2241 return etp_init (want_poll, done_poll);
2262} 2242}
2263 2243
2264ecb_inline void 2244ecb_inline void
2265eio_api_destroy (eio_req *req) 2245eio_api_destroy (eio_req *req)
2266{ 2246{
2267 free (req); 2247 free (req);
2268} 2248}
2269 2249
2270#define REQ(rtype) \ 2250#define REQ(rtype) \
2271 eio_req *req; \ 2251 eio_req *req; \
2272 \ 2252 \
2273 req = (eio_req *)calloc (1, sizeof *req); \ 2253 req = (eio_req *)calloc (1, sizeof *req); \
2274 if (!req) \ 2254 if (!req) \
2275 return 0; \ 2255 return 0; \
2495 case EIO_CUSTOM: 2475 case EIO_CUSTOM:
2496 req->feed (req); 2476 req->feed (req);
2497 break; 2477 break;
2498 2478
2499 default: 2479 default:
2500 errno = ENOSYS;
2501 req->result = -1; 2480 req->result = EIO_ENOSYS ();
2502 break; 2481 break;
2503 } 2482 }
2504 2483
2505 req->errorno = errno; 2484 req->errorno = errno;
2506} 2485}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines