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.59 by root, Wed Dec 1 07:30:39 2010 UTC vs.
Revision 1.61 by root, Fri Feb 11 00:53:24 2011 UTC

1/* 1/*
2 * libeio implementation 2 * libeio implementation
3 * 3 *
4 * Copyright (c) 2007,2008,2009,2010 Marc Alexander Lehmann <libeio@schmorp.de> 4 * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libeio@schmorp.de>
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without modifica- 7 * Redistribution and use in source and binary forms, with or without modifica-
8 * tion, are permitted provided that the following conditions are met: 8 * tion, are permitted provided that the following conditions are met:
9 * 9 *
79# include <unistd.h> 79# include <unistd.h>
80# include <utime.h> 80# include <utime.h>
81# include <signal.h> 81# include <signal.h>
82# include <dirent.h> 82# include <dirent.h>
83 83
84#if _POSIX_MEMLOCK || _POSIX_MAPPED_FILES 84#if _POSIX_MEMLOCK || _POSIX_MEMLOCK_RANGE || _POSIX_MAPPED_FILES
85# include <sys/mman.h> 85# include <sys/mman.h>
86#endif 86#endif
87 87
88/* POSIX_SOURCE is useless on bsd's, and XOPEN_SOURCE is unreliable there, too */ 88/* POSIX_SOURCE is useless on bsd's, and XOPEN_SOURCE is unreliable there, too */
89# if __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ 89# if __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__
1431 /* round up length */ 1431 /* round up length */
1432 *length = (*length + mask) & ~mask; 1432 *length = (*length + mask) & ~mask;
1433} 1433}
1434 1434
1435#if !_POSIX_MEMLOCK 1435#if !_POSIX_MEMLOCK
1436# define eio__mlock(a,b) ((errno = ENOSYS), -1)
1437# define eio__mlockall(a) ((errno = ENOSYS), -1) 1436# define eio__mlockall(a) ((errno = ENOSYS), -1)
1438#else 1437#else
1439
1440static int
1441eio__mlock (void *addr, size_t length)
1442{
1443 eio_page_align (&addr, &length);
1444
1445 return mlock (addr, length);
1446}
1447 1438
1448static int 1439static int
1449eio__mlockall (int flags) 1440eio__mlockall (int flags)
1450{ 1441{
1451 #if __GLIBC__ == 2 && __GLIBC_MINOR__ <= 7 1442 #if __GLIBC__ == 2 && __GLIBC_MINOR__ <= 7
1461 | (flags & EIO_MCL_FUTURE ? MCL_FUTURE : 0); 1452 | (flags & EIO_MCL_FUTURE ? MCL_FUTURE : 0);
1462 } 1453 }
1463 1454
1464 return mlockall (flags); 1455 return mlockall (flags);
1465} 1456}
1457#endif
1458
1459#if !_POSIX_MEMLOCK_RANGE
1460# define eio__mlock(a,b) ((errno = ENOSYS), -1)
1461#else
1462
1463static int
1464eio__mlock (void *addr, size_t length)
1465{
1466 eio_page_align (&addr, &length);
1467
1468 return mlock (addr, length);
1469}
1470
1466#endif 1471#endif
1467 1472
1468#if !(_POSIX_MAPPED_FILES && _POSIX_SYNCHRONIZED_IO) 1473#if !(_POSIX_MAPPED_FILES && _POSIX_SYNCHRONIZED_IO)
1469# define eio__msync(a,b,c) ((errno = ENOSYS), -1) 1474# define eio__msync(a,b,c) ((errno = ENOSYS), -1)
1470#else 1475#else
1676 case EIO_RMDIR: req->result = rmdir (req->ptr1); break; 1681 case EIO_RMDIR: req->result = rmdir (req->ptr1); break;
1677 case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break; 1682 case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break;
1678 case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; 1683 case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break;
1679 case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; 1684 case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break;
1680 case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; 1685 case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break;
1681 case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->int3); break; 1686 case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break;
1682 1687
1683 case EIO_READLINK: ALLOC (PATH_MAX); 1688 case EIO_READLINK: ALLOC (PATH_MAX);
1684 req->result = readlink (req->ptr1, req->ptr2, PATH_MAX); break; 1689 req->result = readlink (req->ptr1, req->ptr2, PATH_MAX); break;
1685 1690
1686 case EIO_SYNC: req->result = 0; sync (); break; 1691 case EIO_SYNC: req->result = 0; sync (); break;
1936 REQ (EIO_READDIR); PATH; req->int1 = flags; SEND; 1941 REQ (EIO_READDIR); PATH; req->int1 = flags; SEND;
1937} 1942}
1938 1943
1939eio_req *eio_mknod (const char *path, mode_t mode, dev_t dev, int pri, eio_cb cb, void *data) 1944eio_req *eio_mknod (const char *path, mode_t mode, dev_t dev, int pri, eio_cb cb, void *data)
1940{ 1945{
1941 REQ (EIO_MKNOD); PATH; req->int2 = (long)mode; req->int3 = (long)dev; SEND; 1946 REQ (EIO_MKNOD); PATH; req->int2 = (long)mode; req->offs = (off_t)dev; SEND;
1942} 1947}
1943 1948
1944static eio_req * 1949static eio_req *
1945eio__2path (int type, const char *path, const char *new_path, int pri, eio_cb cb, void *data) 1950eio__2path (int type, const char *path, const char *new_path, int pri, eio_cb cb, void *data)
1946{ 1951{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines