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

Comparing Linux-AIO/AIO.xs (file contents):
Revision 1.19 by root, Fri May 7 00:57:29 2004 UTC vs.
Revision 1.20 by root, Sun Jul 18 10:55:34 2004 UTC

22# define __NR_pwrite64 __NR_pwrite 22# define __NR_pwrite64 __NR_pwrite
23#endif 23#endif
24 24
25#define STACKSIZE 1024 /* yeah */ 25#define STACKSIZE 1024 /* yeah */
26 26
27enum { REQ_QUIT, REQ_OPEN, REQ_CLOSE, REQ_READ, REQ_WRITE, REQ_STAT, REQ_LSTAT, REQ_FSTAT}; 27enum {
28 REQ_QUIT,
29 REQ_OPEN, REQ_CLOSE, REQ_READ, REQ_WRITE,
30 REQ_STAT, REQ_LSTAT, REQ_FSTAT, REQ_UNLINK
31};
28 32
29typedef struct { 33typedef struct {
30 char stack[STACKSIZE]; 34 char stack[STACKSIZE];
31} aio_thread; 35} aio_thread;
32 36
66 70
67 New (0, thr, 1, aio_thread); 71 New (0, thr, 1, aio_thread);
68 72
69 if (clone (aio_proc, 73 if (clone (aio_proc,
70 &(thr->stack[STACKSIZE]), 74 &(thr->stack[STACKSIZE]),
71 CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND, 75 CLONE_VM|CLONE_FS|CLONE_FILES,
72 thr) >= 0) 76 thr) >= 0)
73 started++; 77 started++;
74 else 78 else
75 Safefree (thr); 79 Safefree (thr);
76} 80}
231 235
232static sigset_t fullsigset; 236static sigset_t fullsigset;
233 237
234#undef errno 238#undef errno
235#include <asm/unistd.h> 239#include <asm/unistd.h>
240#include <sys/prctl.h>
236 241
237static int 242static int
238aio_proc (void *thr_arg) 243aio_proc (void *thr_arg)
239{ 244{
240 aio_thread *thr = thr_arg; 245 aio_thread *thr = thr_arg;
254 259
255 _syscall2(int,stat64, const char *, filename, struct stat64 *, buf) 260 _syscall2(int,stat64, const char *, filename, struct stat64 *, buf)
256 _syscall2(int,lstat64, const char *, filename, struct stat64 *, buf) 261 _syscall2(int,lstat64, const char *, filename, struct stat64 *, buf)
257 _syscall2(int,fstat64, int, fd, struct stat64 *, buf) 262 _syscall2(int,fstat64, int, fd, struct stat64 *, buf)
258 263
264 _syscall1(int,unlink, char *, filename);
265
259 sigprocmask (SIG_SETMASK, &fullsigset, 0); 266 sigprocmask (SIG_SETMASK, &fullsigset, 0);
267 prctl (PR_SET_PDEATHSIG, SIGKILL);
260 268
261 /* then loop */ 269 /* then loop */
262 while (read (reqpipe[0], (void *)&req, sizeof (req)) == sizeof (req)) 270 while (read (reqpipe[0], (void *)&req, sizeof (req)) == sizeof (req))
263 { 271 {
264 req->thread = thr; 272 req->thread = thr;
265 errno = 0; /* strictly unnecessary */ 273 errno = 0; /* strictly unnecessary */
266 274
267 switch (req->type) 275 switch (req->type)
268 { 276 {
269 case REQ_READ: req->result = pread64 (req->fd, req->dataptr, req->length, req->offset & 0xffffffff, req->offset >> 32); break; 277 case REQ_READ: req->result = pread64 (req->fd, req->dataptr, req->length, req->offset & 0xffffffff, req->offset >> 32); break;
270 case REQ_WRITE: req->result = pwrite64(req->fd, req->dataptr, req->length, req->offset & 0xffffffff, req->offset >> 32); break; 278 case REQ_WRITE: req->result = pwrite64(req->fd, req->dataptr, req->length, req->offset & 0xffffffff, req->offset >> 32); break;
271 case REQ_OPEN: req->result = open (req->dataptr, req->fd, req->mode); break; 279 case REQ_OPEN: req->result = open (req->dataptr, req->fd, req->mode); break;
272 case REQ_CLOSE: req->result = close (req->fd); break; 280 case REQ_CLOSE: req->result = close (req->fd); break;
273 case REQ_STAT: req->result = stat64 (req->dataptr, req->statdata); break; 281 case REQ_STAT: req->result = stat64 (req->dataptr, req->statdata); break;
274 case REQ_LSTAT: req->result = lstat64 (req->dataptr, req->statdata); break; 282 case REQ_LSTAT: req->result = lstat64 (req->dataptr, req->statdata); break;
275 case REQ_FSTAT: req->result = fstat64 (req->fd, req->statdata); break; 283 case REQ_FSTAT: req->result = fstat64 (req->fd, req->statdata); break;
284 case REQ_UNLINK: req->result = unlink (req->dataptr); break;
276 285
277 case REQ_QUIT: 286 case REQ_QUIT:
278 default: 287 default:
279 write (respipe[1], (void *)&req, sizeof (req)); 288 write (respipe[1], (void *)&req, sizeof (req));
280 return 0; 289 return 0;
438 447
439 req->callback = SvREFCNT_inc (callback); 448 req->callback = SvREFCNT_inc (callback);
440 449
441 send_req (req); 450 send_req (req);
442 451
452void
453aio_unlink(pathname,callback)
454 SV * pathname
455 SV * callback
456 PROTOTYPE: $$
457 CODE:
458 aio_req req;
459
460 Newz (0, req, 1, aio_cb);
461
462 if (!req)
463 croak ("out of memory during aio_req allocation");
464
465 req->type = REQ_UNLINK;
466 req->data = newSVsv (pathname);
467 req->dataptr = SvPV_nolen (req->data);
468 req->callback = SvREFCNT_inc (callback);
469
470 send_req (req);
471
443int 472int
444poll_fileno() 473poll_fileno()
445 PROTOTYPE: 474 PROTOTYPE:
446 CODE: 475 CODE:
447 RETVAL = respipe[0]; 476 RETVAL = respipe[0];

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines