… | |
… | |
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 | */ |
307 | static xmutex_t preadwritelock = X_MUTEX_INIT; |
307 | static xmutex_t preadwritelock; |
308 | #endif |
308 | #endif |
309 | |
309 | |
310 | typedef struct etp_worker |
310 | typedef 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 | |
323 | static etp_worker wrk_first = { &wrk_first, &wrk_first, 0 }; /* NOT etp */ |
323 | static 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 | |
458 | static void ecb_cold |
458 | static int ecb_cold |
459 | etp_thread_init (void) |
459 | etp_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 | |
470 | static void ecb_cold |
|
|
471 | etp_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 | |
|
|
488 | static void ecb_cold |
|
|
489 | etp_once_init (void) |
|
|
490 | { |
|
|
491 | etp_thread_init (); |
|
|
492 | X_THREAD_ATFORK (0, 0, etp_atfork_child); |
|
|
493 | } |
|
|
494 | |
|
|
495 | static int ecb_cold |
|
|
496 | etp_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 | |
1993 | int ecb_cold |
1969 | int ecb_cold |
1994 | eio_init (void (*want_poll)(void), void (*done_poll)(void)) |
1970 | eio_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 | |
1999 | ecb_inline void |
1979 | ecb_inline void |
2000 | eio_api_destroy (eio_req *req) |
1980 | eio_api_destroy (eio_req *req) |