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

Comparing libeio/eio.c (file contents):
Revision 1.92 by root, Sun Jul 17 18:27:17 2011 UTC vs.
Revision 1.93 by root, Mon Jul 18 01:27:03 2011 UTC

302/* 302/*
303 * make our pread/pwrite emulation safe against themselves, but not against 303 * make our pread/pwrite emulation safe against themselves, but not against
304 * normal read/write by using a mutex. slows down execution a lot, 304 * normal read/write by using a mutex. slows down execution a lot,
305 * but that's your problem, not mine. 305 * but that's your problem, not mine.
306 */ 306 */
307static xmutex_t preadwritelock = X_MUTEX_INIT; 307static xmutex_t preadwritelock;
308#endif 308#endif
309 309
310typedef struct etp_worker 310typedef struct etp_worker
311{ 311{
312 /* locked by wrklock */ 312 /* locked by wrklock */
318 ETP_REQ *req; /* currently processed request */ 318 ETP_REQ *req; /* currently processed request */
319 319
320 ETP_WORKER_COMMON 320 ETP_WORKER_COMMON
321} etp_worker; 321} etp_worker;
322 322
323static etp_worker wrk_first = { &wrk_first, &wrk_first, 0 }; /* NOT etp */ 323static etp_worker wrk_first; /* NOT etp */
324 324
325#define ETP_WORKER_LOCK(wrk) X_LOCK (wrklock) 325#define ETP_WORKER_LOCK(wrk) X_LOCK (wrklock)
326#define ETP_WORKER_UNLOCK(wrk) X_UNLOCK (wrklock) 326#define ETP_WORKER_UNLOCK(wrk) X_UNLOCK (wrklock)
327 327
328/* worker threads management */ 328/* worker threads management */
453 } 453 }
454 454
455 abort (); 455 abort ();
456} 456}
457 457
458static void ecb_cold 458static int ecb_cold
459etp_thread_init (void) 459etp_init (void (*want_poll)(void), void (*done_poll)(void))
460{ 460{
461#if !HAVE_PREADWRITE
462 X_MUTEX_CREATE (preadwritelock);
463#endif
464 X_MUTEX_CREATE (wrklock); 461 X_MUTEX_CREATE (wrklock);
465 X_MUTEX_CREATE (reslock); 462 X_MUTEX_CREATE (reslock);
466 X_MUTEX_CREATE (reqlock); 463 X_MUTEX_CREATE (reqlock);
467 X_COND_CREATE (reqwait); 464 X_COND_CREATE (reqwait);
468}
469 465
470static void ecb_cold
471etp_atfork_child (void)
472{
473 reqq_init (&req_queue); 466 reqq_init (&req_queue);
474 reqq_init (&res_queue); 467 reqq_init (&res_queue);
475 468
476 wrk_first.next = 469 wrk_first.next =
477 wrk_first.prev = &wrk_first; 470 wrk_first.prev = &wrk_first;
479 started = 0; 472 started = 0;
480 idle = 0; 473 idle = 0;
481 nreqs = 0; 474 nreqs = 0;
482 nready = 0; 475 nready = 0;
483 npending = 0; 476 npending = 0;
484
485 etp_thread_init ();
486}
487
488static void ecb_cold
489etp_once_init (void)
490{
491 etp_thread_init ();
492 X_THREAD_ATFORK (0, 0, etp_atfork_child);
493}
494
495static int ecb_cold
496etp_init (void (*want_poll)(void), void (*done_poll)(void))
497{
498 static pthread_once_t doinit = PTHREAD_ONCE_INIT;
499
500 pthread_once (&doinit, etp_once_init);
501 477
502 want_poll_cb = want_poll; 478 want_poll_cb = want_poll;
503 done_poll_cb = done_poll; 479 done_poll_cb = done_poll;
504 480
505 return 0; 481 return 0;
1991/*****************************************************************************/ 1967/*****************************************************************************/
1992 1968
1993int ecb_cold 1969int ecb_cold
1994eio_init (void (*want_poll)(void), void (*done_poll)(void)) 1970eio_init (void (*want_poll)(void), void (*done_poll)(void))
1995{ 1971{
1972#if !HAVE_PREADWRITE
1973 X_MUTEX_CREATE (preadwritelock);
1974#endif
1975
1996 return etp_init (want_poll, done_poll); 1976 return etp_init (want_poll, done_poll);
1997} 1977}
1998 1978
1999ecb_inline void 1979ecb_inline void
2000eio_api_destroy (eio_req *req) 1980eio_api_destroy (eio_req *req)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines