mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
1e8abe5d03
The timer function used on windows system set timer interrupt flag of current main ractor's executing ec and thread can detect the end of time slice. However, to set all ec->interrupt_flag for all running ractors, it is requires to synchronize with other ractors. However, timer thread can not acquire the ractor-wide lock because of some limitation. To solve this issue, this patch introduces USE_VM_CLOCK compile option to introduce rb_vm_t::clock. This clock will be incremented by the timer thread and each thread can check the incrementing by comparison with previous checked clock. At last, on windows platform this patch introduces some overhead, but I think there is no critical performance issue because of this modification.
72 lines
1.9 KiB
C
72 lines
1.9 KiB
C
#ifndef RUBY_THREAD_WIN32_H
|
|
#define RUBY_THREAD_WIN32_H
|
|
/**********************************************************************
|
|
|
|
thread_win32.h -
|
|
|
|
$Author$
|
|
|
|
Copyright (C) 2004-2007 Koichi Sasada
|
|
|
|
**********************************************************************/
|
|
|
|
/* interface */
|
|
|
|
# ifdef __CYGWIN__
|
|
# undef _WIN32
|
|
# endif
|
|
|
|
#define USE_VM_CLOCK 1
|
|
|
|
WINBASEAPI BOOL WINAPI
|
|
TryEnterCriticalSection(IN OUT LPCRITICAL_SECTION lpCriticalSection);
|
|
|
|
typedef struct rb_thread_cond_struct {
|
|
struct cond_event_entry *next;
|
|
struct cond_event_entry *prev;
|
|
} rb_nativethread_cond_t;
|
|
|
|
typedef struct native_thread_data_struct {
|
|
HANDLE interrupt_event;
|
|
} native_thread_data_t;
|
|
|
|
typedef struct rb_global_vm_lock_struct {
|
|
HANDLE lock;
|
|
} rb_global_vm_lock_t;
|
|
|
|
typedef DWORD native_tls_key_t; // TLS index
|
|
|
|
static inline void *
|
|
native_tls_get(native_tls_key_t key)
|
|
{
|
|
void *ptr = TlsGetValue(key);
|
|
if (UNLIKELY(ptr == NULL)) {
|
|
rb_bug("TlsGetValue() returns NULL");
|
|
}
|
|
return ptr;
|
|
}
|
|
|
|
static inline void
|
|
native_tls_set(native_tls_key_t key, void *ptr)
|
|
{
|
|
if (UNLIKELY(TlsSetValue(key, ptr) == 0)) {
|
|
rb_bug("TlsSetValue() error");
|
|
}
|
|
}
|
|
|
|
void rb_native_mutex_lock(rb_nativethread_lock_t *lock);
|
|
void rb_native_mutex_unlock(rb_nativethread_lock_t *lock);
|
|
void rb_native_mutex_initialize(rb_nativethread_lock_t *lock);
|
|
void rb_native_mutex_destroy(rb_nativethread_lock_t *lock);
|
|
void rb_native_cond_signal(rb_nativethread_cond_t *cond);
|
|
void rb_native_cond_broadcast(rb_nativethread_cond_t *cond);
|
|
void rb_native_cond_wait(rb_nativethread_cond_t *cond, rb_nativethread_lock_t *mutex);
|
|
void rb_native_cond_timedwait(rb_nativethread_cond_t *cond, rb_nativethread_lock_t *mutex, unsigned long msec);
|
|
void rb_native_cond_initialize(rb_nativethread_cond_t *cond);
|
|
void rb_native_cond_destroy(rb_nativethread_cond_t *cond);
|
|
|
|
RUBY_SYMBOL_EXPORT_BEGIN
|
|
RUBY_EXTERN native_tls_key_t ruby_current_ec_key;
|
|
RUBY_SYMBOL_EXPORT_END
|
|
|
|
#endif /* RUBY_THREAD_WIN32_H */
|