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.18 by root, Thu May 6 15:05:57 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}
222 226
223 Safefree (req); 227 Safefree (req);
224 } 228 }
225 229
226 if (qs) 230 if (qs)
227 {
228 printf ("outstanding %p %d\n", qs, nreqs);
229 send_reqs (); 231 send_reqs ();
230 }
231 232
232 return count; 233 return count;
233} 234}
234 235
235static sigset_t fullsigset; 236static sigset_t fullsigset;
236 237
237#undef errno 238#undef errno
238#include <asm/unistd.h> 239#include <asm/unistd.h>
240#include <sys/prctl.h>
239 241
240static int 242static int
241aio_proc (void *thr_arg) 243aio_proc (void *thr_arg)
242{ 244{
243 aio_thread *thr = thr_arg; 245 aio_thread *thr = thr_arg;
257 259
258 _syscall2(int,stat64, const char *, filename, struct stat64 *, buf) 260 _syscall2(int,stat64, const char *, filename, struct stat64 *, buf)
259 _syscall2(int,lstat64, const char *, filename, struct stat64 *, buf) 261 _syscall2(int,lstat64, const char *, filename, struct stat64 *, buf)
260 _syscall2(int,fstat64, int, fd, struct stat64 *, buf) 262 _syscall2(int,fstat64, int, fd, struct stat64 *, buf)
261 263
264 _syscall1(int,unlink, char *, filename);
265
262 sigprocmask (SIG_SETMASK, &fullsigset, 0); 266 sigprocmask (SIG_SETMASK, &fullsigset, 0);
267 prctl (PR_SET_PDEATHSIG, SIGKILL);
263 268
264 /* then loop */ 269 /* then loop */
265 while (read (reqpipe[0], (void *)&req, sizeof (req)) == sizeof (req)) 270 while (read (reqpipe[0], (void *)&req, sizeof (req)) == sizeof (req))
266 { 271 {
267 req->thread = thr; 272 req->thread = thr;
268 errno = 0; /* strictly unnecessary */ 273 errno = 0; /* strictly unnecessary */
269 274
270 switch (req->type) 275 switch (req->type)
271 { 276 {
272 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;
273 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;
274 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;
275 case REQ_CLOSE: req->result = close (req->fd); break; 280 case REQ_CLOSE: req->result = close (req->fd); break;
276 case REQ_STAT: req->result = stat64 (req->dataptr, req->statdata); break; 281 case REQ_STAT: req->result = stat64 (req->dataptr, req->statdata); break;
277 case REQ_LSTAT: req->result = lstat64 (req->dataptr, req->statdata); break; 282 case REQ_LSTAT: req->result = lstat64 (req->dataptr, req->statdata); break;
278 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;
279 285
280 case REQ_QUIT: 286 case REQ_QUIT:
281 default: 287 default:
282 write (respipe[1], (void *)&req, sizeof (req)); 288 write (respipe[1], (void *)&req, sizeof (req));
283 return 0; 289 return 0;
441 447
442 req->callback = SvREFCNT_inc (callback); 448 req->callback = SvREFCNT_inc (callback);
443 449
444 send_req (req); 450 send_req (req);
445 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
446int 472int
447poll_fileno() 473poll_fileno()
448 PROTOTYPE: 474 PROTOTYPE:
449 CODE: 475 CODE:
450 RETVAL = respipe[0]; 476 RETVAL = respipe[0];

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines