20
20
#define native_thread_yield() Sleep(0)
21
21
#define remove_signal_thread_list(th)
23
static volatile DWORD ruby_native_thread_key = TLS_OUT_OF_INDEXES;
26
ruby_thread_from_native(void)
28
return TlsGetValue(ruby_native_thread_key);
32
ruby_thread_set_native(rb_thread_t *th)
34
return TlsSetValue(ruby_native_thread_key, th);
38
Init_native_thread(void)
26
40
rb_thread_t *th = GET_THREAD();
42
ruby_native_thread_key = TlsAlloc();
27
43
DuplicateHandle(GetCurrentProcess(),
28
44
GetCurrentThread(),
29
45
GetCurrentProcess(),
123
BLOCKING_REGION(ret = rb_w32_wait_events_blocking(events, num, timeout), ubf_handle);
139
BLOCKING_REGION(ret = rb_w32_wait_events_blocking(events, num, timeout), ubf_handle, 0);
160
#define HAVE__BEGINTHREADEX 1
162
#undef HAVE__BEGINTHREADEX
165
#ifdef HAVE__BEGINTHREADEX
166
#define start_thread (HANDLE)_beginthreadex
167
typedef unsigned long (_stdcall *w32_thread_start_func)(void*);
169
#define start_thread CreateThread
170
typedef LPTHREAD_START_ROUTINE w32_thread_start_func;
144
w32_create_thread(DWORD stack_size, void *func, void *val)
174
w32_create_thread(DWORD stack_size, w32_thread_start_func func, void *val)
146
return (HANDLE)_beginthreadex(0, stack_size, func, val, CREATE_SUSPENDED, 0);
176
return start_thread(0, stack_size, func, val, CREATE_SUSPENDED, 0);
284
thread_start_func_2(rb_thread_t *th, VALUE *stack_start));
312
struct cond_event_entry {
313
struct cond_event_entry* next;
317
struct rb_thread_cond_struct {
318
struct cond_event_entry *next;
319
struct cond_event_entry *last;
323
native_cond_signal(rb_thread_cond_t *cond)
325
/* cond is guarded by mutex */
326
struct cond_event_entry *e = cond->next;
329
cond->next = e->next;
333
rb_bug("native_cond_signal: no pending threads");
338
native_cond_broadcast(rb_thread_cond_t *cond)
340
/* cond is guarded by mutex */
341
struct cond_event_entry *e = cond->next;
351
native_cond_wait(rb_thread_cond_t *cond, rb_thread_lock_t *mutex)
354
struct cond_event_entry entry;
357
entry.event = CreateEvent(0, FALSE, FALSE, 0);
359
/* cond is guarded by mutex */
361
cond->last->next = &entry;
369
native_mutex_unlock(mutex);
371
r = WaitForSingleObject(entry.event, INFINITE);
372
if (r != WAIT_OBJECT_0) {
373
rb_bug("native_cond_wait: WaitForSingleObject returns %d", r);
376
native_mutex_lock(mutex);
378
w32_close_handle(entry.event);
382
native_cond_initialize(rb_thread_cond_t *cond)
389
native_cond_destroy(rb_thread_cond_t *cond)
287
395
native_thread_destroy(rb_thread_t *th)
305
413
thread_debug("thread created (th: %p, thid: %p, event: %p)\n", th,
306
414
th->thread_id, th->native_thread_data.interrupt_event);
307
thread_start_func_2(th, &stack_start);
415
thread_start_func_2(th, &stack_start, 0);
309
417
w32_close_handle(thread_id);
310
418
thread_debug("thread deleted (th: %p)\n", th);
360
ubf_handle(rb_thread_t *th)
468
ubf_handle(rb_thread_t *th, void *ptr)
362
470
thread_debug("ubf_handle: %p\n", th);
363
471
w32_set_event(th->native_thread_data.interrupt_event);
368
476
static HANDLE timer_thread_id = 0;
370
static unsigned int _stdcall
478
static unsigned long _stdcall
371
479
timer_thread_func(void *dummy)
373
481
thread_debug("timer_thread\n");