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

Comparing libeio/eio.c (file contents):
Revision 1.22 by root, Fri Jul 11 10:54:50 2008 UTC vs.
Revision 1.23 by root, Sun Sep 21 00:23:45 2008 UTC

950 res = -1; 950 res = -1;
951 951
952 req->result = res; 952 req->result = res;
953} 953}
954 954
955#if !(_POSIX_MAPPED_FILES && _POSIX_SYNCHRONIZED_IO)
956# define msync(a,b,c) ENOSYS
957#endif
958
959int
960eio__mtouch (void *mem, size_t len, int flags)
961{
962 intptr_t addr = (intptr_t)mem;
963 intptr_t end = addr + len;
964#ifdef PAGESIZE
965 const intptr_t page = PAGESIZE;
966#else
967 static intptr_t page;
968
969 if (!page)
970 page = sysconf (_SC_PAGESIZE);
971#endif
972
973 addr &= ~(page - 1); /* assume page size is always a power of two */
974
975 if (addr < end)
976 if (flags) /* modify */
977 do { *((volatile sig_atomic_t *)addr) |= 0; } while ((addr += page) < len);
978 else
979 do { *((volatile sig_atomic_t *)addr) ; } while ((addr += page) < len);
980
981 return 0;
982}
983
955/*****************************************************************************/ 984/*****************************************************************************/
956 985
957#define ALLOC(len) \ 986#define ALLOC(len) \
958 if (!req->ptr2) \ 987 if (!req->ptr2) \
959 { \ 988 { \
1124 req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break; 1153 req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break;
1125 1154
1126 case EIO_SYNC: req->result = 0; sync (); break; 1155 case EIO_SYNC: req->result = 0; sync (); break;
1127 case EIO_FSYNC: req->result = fsync (req->int1); break; 1156 case EIO_FSYNC: req->result = fsync (req->int1); break;
1128 case EIO_FDATASYNC: req->result = fdatasync (req->int1); break; 1157 case EIO_FDATASYNC: req->result = fdatasync (req->int1); break;
1158 case EIO_MSYNC: req->result = msync (req->ptr2, req->size, req->int1); break;
1159 case EIO_MTOUCH: req->result = eio__mtouch (req->ptr2, req->size, req->int1); break;
1129 1160
1130 case EIO_READDIR: eio__scandir (req, self); break; 1161 case EIO_READDIR: eio__scandir (req, self); break;
1131 1162
1132 case EIO_BUSY: 1163 case EIO_BUSY:
1133#ifdef _WIN32 1164#ifdef _WIN32
1172 case EIO_NOP: 1203 case EIO_NOP:
1173 req->result = 0; 1204 req->result = 0;
1174 break; 1205 break;
1175 1206
1176 case EIO_CUSTOM: 1207 case EIO_CUSTOM:
1177 req->feed (req); 1208 ((void (*)(eio_req *))req->feed) (req);
1178 break; 1209 break;
1179 1210
1180 default: 1211 default:
1181 req->result = -1; 1212 req->result = -1;
1182 break; 1213 break;
1203} 1234}
1204 1235
1205eio_req *eio_fsync (int fd, int pri, eio_cb cb, void *data) 1236eio_req *eio_fsync (int fd, int pri, eio_cb cb, void *data)
1206{ 1237{
1207 REQ (EIO_FSYNC); req->int1 = fd; SEND; 1238 REQ (EIO_FSYNC); req->int1 = fd; SEND;
1239}
1240
1241eio_req *eio_msync (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data)
1242{
1243 REQ (EIO_MSYNC); req->ptr2 = addr; req->size = length; req->int1 = flags; SEND;
1244}
1245
1246eio_req *eio_mtouch (void *addr, size_t length, int flags, int pri, eio_cb cb, void *data)
1247{
1248 REQ (EIO_MTOUCH); req->ptr2 = addr; req->size = length; req->int1 = flags; SEND;
1208} 1249}
1209 1250
1210eio_req *eio_fdatasync (int fd, int pri, eio_cb cb, void *data) 1251eio_req *eio_fdatasync (int fd, int pri, eio_cb cb, void *data)
1211{ 1252{
1212 REQ (EIO_FDATASYNC); req->int1 = fd; SEND; 1253 REQ (EIO_FDATASYNC); req->int1 = fd; SEND;
1369 return eio__2path (EIO_RENAME, path, new_path, pri, cb, data); 1410 return eio__2path (EIO_RENAME, path, new_path, pri, cb, data);
1370} 1411}
1371 1412
1372eio_req *eio_custom (eio_cb execute, int pri, eio_cb cb, void *data) 1413eio_req *eio_custom (eio_cb execute, int pri, eio_cb cb, void *data)
1373{ 1414{
1374 REQ (EIO_CUSTOM); req->feed = execute; SEND; 1415 REQ (EIO_CUSTOM); req->feed = (void (*)(eio_req *))execute; SEND;
1375} 1416}
1376 1417
1377#endif 1418#endif
1378 1419
1379eio_req *eio_grp (eio_cb cb, void *data) 1420eio_req *eio_grp (eio_cb cb, void *data)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines