Bug #18818 » 0001-Mark-Fibers-in-Mutex-Queue-SizedQueue-wait-lists.patch
| thread_sync.c | ||
|---|---|---|
|
sync_wakeup(head, LONG_MAX);
|
||
|
}
|
||
|
static void
|
||
|
mark_all(struct ccan_list_head *head)
|
||
|
{
|
||
|
struct sync_waiter *waiter = 0;
|
||
|
ccan_list_for_each(head, waiter, node) {
|
||
|
/* don't need to handle compact. this code isn't storing a VALUE */
|
||
|
rb_gc_mark_movable(rb_fiberptr_self(waiter->fiber));
|
||
|
}
|
||
|
}
|
||
|
#if defined(HAVE_WORKING_FORK)
|
||
|
static void rb_mutex_abandon_all(rb_mutex_t *mutexes);
|
||
|
static void rb_mutex_abandon_keeping_mutexes(rb_thread_t *th);
|
||
| ... | ... | |
|
*
|
||
|
*/
|
||
|
#define mutex_mark ((void(*)(void*))0)
|
||
|
static void
|
||
|
mutex_mark (void *ptr)
|
||
|
{
|
||
|
rb_mutex_t *mutex = ptr;
|
||
|
mark_all(&mutex->waitq);
|
||
|
}
|
||
|
static size_t
|
||
|
rb_mutex_num_waiting(rb_mutex_t *mutex)
|
||
| ... | ... | |
|
{
|
||
|
struct rb_queue *q = ptr;
|
||
|
/* no need to mark threads in waitq, they are on stack */
|
||
|
mark_all(queue_waitq(q));
|
||
|
rb_gc_mark(q->que);
|
||
|
}
|
||
| ... | ... | |
|
szqueue_mark(void *ptr)
|
||
|
{
|
||
|
struct rb_szqueue *sq = ptr;
|
||
|
mark_all(szqueue_pushq(sq));
|
||
|
queue_mark(&sq->q);
|
||
|
}
|
||