ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.xs
(Generate patch)

Comparing IO-AIO/AIO.xs (file contents):
Revision 1.39 by root, Mon Feb 6 23:54:12 2006 UTC vs.
Revision 1.42 by root, Fri Jul 21 07:35:31 2006 UTC

8#include "autoconf/config.h" 8#include "autoconf/config.h"
9 9
10#include <pthread.h> 10#include <pthread.h>
11 11
12#include <stddef.h> 12#include <stddef.h>
13#include <errno.h>
13#include <sys/types.h> 14#include <sys/types.h>
14#include <sys/stat.h> 15#include <sys/stat.h>
15#include <limits.h> 16#include <limits.h>
16#include <unistd.h> 17#include <unistd.h>
17#include <fcntl.h> 18#include <fcntl.h>
49 REQ_OPEN, REQ_CLOSE, 50 REQ_OPEN, REQ_CLOSE,
50 REQ_READ, REQ_WRITE, REQ_READAHEAD, 51 REQ_READ, REQ_WRITE, REQ_READAHEAD,
51 REQ_SENDFILE, 52 REQ_SENDFILE,
52 REQ_STAT, REQ_LSTAT, REQ_FSTAT, 53 REQ_STAT, REQ_LSTAT, REQ_FSTAT,
53 REQ_FSYNC, REQ_FDATASYNC, 54 REQ_FSYNC, REQ_FDATASYNC,
54 REQ_UNLINK, REQ_RMDIR, 55 REQ_UNLINK, REQ_RMDIR, REQ_RENAME,
55 REQ_READDIR, 56 REQ_READDIR,
56 REQ_SYMLINK, 57 REQ_LINK, REQ_SYMLINK,
57}; 58};
58 59
59typedef struct aio_cb { 60typedef struct aio_cb {
60 struct aio_cb *volatile next; 61 struct aio_cb *volatile next;
61 62
665 666
666 case REQ_OPEN: req->result = open (req->dataptr, req->fd, req->mode); break; 667 case REQ_OPEN: req->result = open (req->dataptr, req->fd, req->mode); break;
667 case REQ_CLOSE: req->result = close (req->fd); break; 668 case REQ_CLOSE: req->result = close (req->fd); break;
668 case REQ_UNLINK: req->result = unlink (req->dataptr); break; 669 case REQ_UNLINK: req->result = unlink (req->dataptr); break;
669 case REQ_RMDIR: req->result = rmdir (req->dataptr); break; 670 case REQ_RMDIR: req->result = rmdir (req->dataptr); break;
671 case REQ_RENAME: req->result = rename (req->data2ptr, req->dataptr); break;
672 case REQ_LINK: req->result = link (req->data2ptr, req->dataptr); break;
670 case REQ_SYMLINK: req->result = symlink (req->data2ptr, req->dataptr); break; 673 case REQ_SYMLINK: req->result = symlink (req->data2ptr, req->dataptr); break;
671 674
672 case REQ_FDATASYNC: req->result = fdatasync (req->fd); break; 675 case REQ_FDATASYNC: req->result = fdatasync (req->fd); break;
673 case REQ_FSYNC: req->result = fsync (req->fd); break; 676 case REQ_FSYNC: req->result = fsync (req->fd); break;
674 case REQ_READDIR: req->result = scandir_ (req->dataptr, &req->data2ptr); break; 677 case REQ_READDIR: req->result = scandir_ (req->dataptr, &req->data2ptr); break;
780 783
781PROTOTYPES: ENABLE 784PROTOTYPES: ENABLE
782 785
783BOOT: 786BOOT:
784{ 787{
788 HV *stash = gv_stashpv ("IO::AIO", 1);
789 newCONSTSUB (stash, "EXDEV", newSViv (EXDEV));
790 newCONSTSUB (stash, "O_RDONLY", newSViv (O_RDONLY));
791 newCONSTSUB (stash, "O_WRONLY", newSViv (O_WRONLY));
792
785 create_pipe (); 793 create_pipe ();
786 pthread_atfork (atfork_prepare, atfork_parent, atfork_child); 794 pthread_atfork (atfork_prepare, atfork_parent, atfork_child);
787} 795}
788 796
789void 797void
790min_parallel(nthreads) 798min_parallel (nthreads)
791 int nthreads 799 int nthreads
792 PROTOTYPE: $ 800 PROTOTYPE: $
793 801
794void 802void
795max_parallel(nthreads) 803max_parallel (nthreads)
796 int nthreads 804 int nthreads
797 PROTOTYPE: $ 805 PROTOTYPE: $
798 806
799int 807int
800max_outstanding(nreqs) 808max_outstanding (nreqs)
801 int nreqs 809 int nreqs
802 PROTOTYPE: $ 810 PROTOTYPE: $
803 CODE: 811 CODE:
804 RETVAL = max_outstanding; 812 RETVAL = max_outstanding;
805 max_outstanding = nreqs; 813 max_outstanding = nreqs;
806 814
807void 815void
808aio_open(pathname,flags,mode,callback=&PL_sv_undef) 816aio_open (pathname,flags,mode,callback=&PL_sv_undef)
809 SV * pathname 817 SV * pathname
810 int flags 818 int flags
811 int mode 819 int mode
812 SV * callback 820 SV * callback
813 PROTOTYPE: $$$;$ 821 PROTOTYPE: $$$;$
823 831
824 send_req (req); 832 send_req (req);
825} 833}
826 834
827void 835void
828aio_close(fh,callback=&PL_sv_undef) 836aio_close (fh,callback=&PL_sv_undef)
829 SV * fh 837 SV * fh
830 SV * callback 838 SV * callback
831 PROTOTYPE: $;$ 839 PROTOTYPE: $;$
832 ALIAS: 840 ALIAS:
833 aio_close = REQ_CLOSE 841 aio_close = REQ_CLOSE
843 851
844 send_req (req); 852 send_req (req);
845} 853}
846 854
847void 855void
848aio_read(fh,offset,length,data,dataoffset,callback=&PL_sv_undef) 856aio_read (fh,offset,length,data,dataoffset,callback=&PL_sv_undef)
849 SV * fh 857 SV * fh
850 UV offset 858 UV offset
851 UV length 859 UV length
852 SV * data 860 SV * data
853 UV dataoffset 861 UV dataoffset
907 send_req (req); 915 send_req (req);
908 } 916 }
909} 917}
910 918
911void 919void
912aio_sendfile(out_fh,in_fh,in_offset,length,callback=&PL_sv_undef) 920aio_sendfile (out_fh,in_fh,in_offset,length,callback=&PL_sv_undef)
913 SV * out_fh 921 SV * out_fh
914 SV * in_fh 922 SV * in_fh
915 UV in_offset 923 UV in_offset
916 UV length 924 UV length
917 SV * callback 925 SV * callback
930 938
931 send_req (req); 939 send_req (req);
932} 940}
933 941
934void 942void
935aio_readahead(fh,offset,length,callback=&PL_sv_undef) 943aio_readahead (fh,offset,length,callback=&PL_sv_undef)
936 SV * fh 944 SV * fh
937 UV offset 945 UV offset
938 IV length 946 IV length
939 SV * callback 947 SV * callback
940 PROTOTYPE: $$$;$ 948 PROTOTYPE: $$$;$
950 958
951 send_req (req); 959 send_req (req);
952} 960}
953 961
954void 962void
955aio_stat(fh_or_path,callback=&PL_sv_undef) 963aio_stat (fh_or_path,callback=&PL_sv_undef)
956 SV * fh_or_path 964 SV * fh_or_path
957 SV * callback 965 SV * callback
958 ALIAS: 966 ALIAS:
959 aio_stat = REQ_STAT 967 aio_stat = REQ_STAT
960 aio_lstat = REQ_LSTAT 968 aio_lstat = REQ_LSTAT
984 992
985 send_req (req); 993 send_req (req);
986} 994}
987 995
988void 996void
989aio_unlink(pathname,callback=&PL_sv_undef) 997aio_unlink (pathname,callback=&PL_sv_undef)
990 SV * pathname 998 SV * pathname
991 SV * callback 999 SV * callback
992 ALIAS: 1000 ALIAS:
993 aio_unlink = REQ_UNLINK 1001 aio_unlink = REQ_UNLINK
994 aio_rmdir = REQ_RMDIR 1002 aio_rmdir = REQ_RMDIR
1003 aio_readdir = REQ_READDIR
995 CODE: 1004 CODE:
996{ 1005{
997 dREQ; 1006 dREQ;
998 1007
999 req->type = ix; 1008 req->type = ix;
1002 1011
1003 send_req (req); 1012 send_req (req);
1004} 1013}
1005 1014
1006void 1015void
1007aio_symlink(oldpath,newpath,callback=&PL_sv_undef) 1016aio_link (oldpath,newpath,callback=&PL_sv_undef)
1008 SV * oldpath 1017 SV * oldpath
1009 SV * newpath 1018 SV * newpath
1010 SV * callback 1019 SV * callback
1020 ALIAS:
1021 aio_link = REQ_LINK
1022 aio_symlink = REQ_SYMLINK
1023 aio_rename = REQ_RENAME
1011 CODE: 1024 CODE:
1012{ 1025{
1013 dREQ; 1026 dREQ;
1014 1027
1015 req->type = REQ_SYMLINK; 1028 req->type = ix;
1016 req->fh = newSVsv (oldpath); 1029 req->fh = newSVsv (oldpath);
1017 req->data2ptr = SvPVbyte_nolen (req->fh); 1030 req->data2ptr = SvPVbyte_nolen (req->fh);
1018 req->data = newSVsv (newpath); 1031 req->data = newSVsv (newpath);
1019 req->dataptr = SvPVbyte_nolen (req->data); 1032 req->dataptr = SvPVbyte_nolen (req->data);
1020 1033
1021 send_req (req); 1034 send_req (req);
1022} 1035}
1023 1036
1024void 1037#if 0
1025aio_readdir(pathname,callback=&PL_sv_undef)
1026 SV * pathname
1027 SV * callback
1028 CODE:
1029{
1030 dREQ;
1031
1032 req->type = REQ_READDIR;
1033 req->data = newSVsv (pathname);
1034 req->dataptr = SvPVbyte_nolen (req->data);
1035
1036 send_req (req);
1037}
1038 1038
1039# undocumented, because it does not cancel active requests
1039void 1040void
1041cancel_most_requests ()
1042 PROTOTYPE:
1043 CODE:
1044{
1045 aio_req *req;
1046
1047 pthread_mutex_lock (&reqlock);
1048 for (req = reqs; req; req = req->next)
1049 req->flags |= 1;
1050 pthread_mutex_unlock (&reqlock);
1051
1052 pthread_mutex_lock (&reslock);
1053 for (req = ress; req; req = req->next)
1054 req->flags |= 1;
1055 pthread_mutex_unlock (&reslock);
1056}
1057
1058#endif
1059
1060void
1040flush() 1061flush ()
1041 PROTOTYPE: 1062 PROTOTYPE:
1042 CODE: 1063 CODE:
1043 while (nreqs) 1064 while (nreqs)
1044 { 1065 {
1045 poll_wait (); 1066 poll_wait ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines