blob: 43e749acb752042a2f5fab842d22f941e332a3d6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#if !defined(HYTHREAD_H)
#define HYTHREAD_H
#if defined(__cplusplus)
extern "C"
{
#endif
#include <stddef.h>
#include "hycomp.h"
typedef UDATA hythread_tls_key_t;
#define HYTHREAD_PROC VMCALL
typedef int (HYTHREAD_PROC * hythread_entrypoint_t) (void *);
typedef void (HYTHREAD_PROC * hythread_tls_finalizer_t) (void *);
typedef struct HyThread *hythread_t;
typedef struct HyThreadMonitor *hythread_monitor_t;
typedef struct HySemaphore *hysem_t;
struct HyPortLibrary;
#define HYTHREAD_PRIORITY_MIN 0
#define HYTHREAD_PRIORITY_USER_MIN 1
#define HYTHREAD_PRIORITY_NORMAL 5
#define HYTHREAD_PRIORITY_USER_MAX 10
#define HYTHREAD_PRIORITY_MAX 11
#define HYTHREAD_LOCKING_DEFAULT 0 /* default locking policy for platform */
#define HYTHREAD_LOCKING_NO_DATA (-1) /* if no policy data is provided */
#define HYTHREAD_FLAG_BLOCKED 1
#define HYTHREAD_ALREADY_INITIALIZED 4
#define HYTHREAD_TIMED_OUT 3
#define HYTHREAD_FLAG_STARTED 0x800
#define HYTHREAD_FLAG_JLM_HAS_BEEN_ENABLED 0x20000
#define HYTHREAD_ILLEGAL_MONITOR_STATE 1
#define HYTHREAD_FLAG_PRIORITY_INTERRUPTED 0x100
#define HYTHREAD_FLAG_JLMHST_ENABLED 0x10000
#define HYTHREAD_FLAG_JLM_ENABLED 0x4000
#define HYTHREAD_FLAG_INTERRUPTED 4
#define HYTHREAD_INVALID_ARGUMENT 7
#define HYTHREAD_FLAG_DETACHED 0x80
#define HYTHREAD_PRIORITY_INTERRUPTED 5
#define HYTHREAD_FLAG_CANCELED 0x400
#define HYTHREAD_FLAG_NOTIFIED 16
#define HYTHREAD_FLAG_ATTACHED 0x200
#define HYTHREAD_WOULD_BLOCK 8
#define HYTHREAD_FLAG_DEAD 32
#define HYTHREAD_FLAG_WAITING 2
#define HYTHREAD_FLAG_PARKED 0x40000
#define HYTHREAD_FLAG_UNPARKED 0x80000
#define HYTHREAD_FLAG_INTERRUPTABLE 0x2000
#define HYTHREAD_FLAG_TIMER_SET 0x100000
#define HYTHREAD_FLAG_JLM_ENABLED_ALL 0x1C000
#define HYTHREAD_FLAG_JLMTS_ENABLED 0x8000
#define HYTHREAD_INTERRUPTED 2
#define HYTHREAD_FLAG_BLOCKED_AFTER_WAIT 0x1000
#define HYTHREAD_ALREADY_ATTACHED 6
#define HYTHREAD_FLAG_SUSPENDED 8
#define HYTHREAD_FLAG_SLEEPING 64
#define HYTHREAD_MONITOR_INFLATED 0x10000
#define HYTHREAD_MONITOR_INTERRUPTABLE 0x20000
#define HYTHREAD_MONITOR_PRIORITY_INTERRUPTABLE 0x40000
#define HYTHREAD_MONITOR_SYSTEM 0
#define HYTHREAD_MONITOR_OBJECT 0x60000
#define HYTHREAD_MONITOR_MUTEX_UNINITIALIZED 0x80000
#define HYTHREAD_MONITOR_SUPPRESS_CONTENDED_EXIT 0x100000
#define HYTHREAD_MONITOR_MUTEX_IN_USE 0x200000
#define HYTHREAD_MONITOR_SPINLOCK_UNOWNED 0
#define HYTHREAD_MONITOR_SPINLOCK_OWNED 1
#define HYTHREAD_MONITOR_SPINLOCK_EXCEEDED 2
#define HYTHREAD_LIB_FLAG_JLMHST_ENABLED 0x10000
#define HYTHREAD_LIB_FLAG_JLM_ENABLED 0x4000
#define HYTHREAD_LIB_FLAG_JLM_ENABLED_ALL 0x1C000
#define HYTHREAD_LIB_FLAG_JLM_HAS_BEEN_ENABLED 0x20000
#define HYTHREAD_LIB_FLAG_JLMTS_ENABLED 0x8000
typedef struct HyThreadMonitorTracing
{
const char *monitor_name;
UDATA enter_count;
UDATA slow_count;
UDATA recursive_count;
UDATA spin2_count;
UDATA yield_count;
} HyThreadMonitorTracing;
extern HY_CFUNC void VMCALL hythread_detach PROTOTYPE ((hythread_t thread));
extern HY_CFUNC UDATA VMCALL
hythread_lib_set_flags PROTOTYPE ((UDATA flags));
extern HY_CFUNC IDATA VMCALL
hythread_tls_alloc PROTOTYPE ((hythread_tls_key_t * handle));
extern HY_CFUNC IDATA VMCALL
hythread_sleep_interruptable PROTOTYPE ((I_64 millis, IDATA nanos));
extern HY_CFUNC IDATA VMCALL
hythread_monitor_enter_using_threadId
PROTOTYPE ((hythread_monitor_t monitor, hythread_t threadId));
extern HY_CFUNC void VMCALL hythread_cancel PROTOTYPE ((hythread_t thread));
extern HY_CFUNC UDATA VMCALL hythread_clear_interrupted PROTOTYPE ((void));
extern HY_CFUNC void VMCALL
hythread_lib_unlock PROTOTYPE ((hythread_t self));
extern HY_CFUNC IDATA VMCALL
hythread_monitor_enter PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL
hythread_monitor_notify_all PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL
hythread_attach PROTOTYPE ((hythread_t * handle));
extern HY_CFUNC HyThreadMonitorTracing *VMCALL
hythread_jlm_get_gc_lock_tracing PROTOTYPE (());
extern HY_CFUNC UDATA VMCALL
hythread_priority_interrupted PROTOTYPE ((hythread_t thread));
extern HY_CFUNC IDATA VMCALL
hythread_monitor_destroy PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL hysem_post PROTOTYPE ((hysem_t s));
extern HY_CFUNC UDATA VMCALL
hythread_monitor_num_waiting PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC UDATA VMCALL
hythread_interrupted PROTOTYPE ((hythread_t thread));
extern HY_CFUNC void VMCALL
hythread_monitor_lock
PROTOTYPE ((hythread_t self, hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL hythread_park
PROTOTYPE ((I_64 millis, IDATA nanos));
extern HY_CFUNC IDATA VMCALL hythread_monitor_init_with_name
PROTOTYPE ((hythread_monitor_t * handle, UDATA flags, const char *name));
extern HY_CFUNC IDATA VMCALL hythread_monitor_try_enter
PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC void VMCALL hythread_jlm_thread_clear
PROTOTYPE ((hythread_t thread));
extern HY_CFUNC hythread_t VMCALL hythread_self PROTOTYPE ((void));
extern HY_CFUNC IDATA VMCALL
hythread_tls_free PROTOTYPE ((hythread_tls_key_t key));
extern HY_CFUNC UDATA VMCALL
hythread_clear_priority_interrupted PROTOTYPE ((void));
extern HY_CFUNC void VMCALL
hythread_jlm_thread_init PROTOTYPE ((hythread_t thread));
extern HY_CFUNC void VMCALL hythread_jlm_gc_lock_init PROTOTYPE (());
extern HY_CFUNC void VMCALL
hythread_monitor_unlock
PROTOTYPE ((hythread_t self, hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL hysem_wait PROTOTYPE ((hysem_t s));
extern HY_CFUNC void VMCALL hythread_yield PROTOTYPE ((void));
extern HY_CFUNC void VMCALL hythread_suspend PROTOTYPE ((void));
extern HY_CFUNC void VMCALL
hythread_interrupt PROTOTYPE ((hythread_t thread));
extern HY_CFUNC IDATA VMCALL
hythread_tls_set
PROTOTYPE ((hythread_t thread, hythread_tls_key_t key, void *value));
extern HY_CFUNC IDATA VMCALL hythread_create
PROTOTYPE ((hythread_t * handle, UDATA stacksize, UDATA priority,
UDATA suspend, hythread_entrypoint_t entrypoint,
void *entryarg));
extern HY_CFUNC IDATA VMCALL hysem_init
PROTOTYPE ((hysem_t * sp, I_32 initValue));
extern HY_CFUNC IDATA VMCALL hythread_monitor_wait
PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL hythread_monitor_init_policy
PROTOTYPE ((hythread_monitor_t * handle, UDATA flags, IDATA policy,
IDATA policyData));
extern HY_CFUNC void VMCALL hythread_jlm_monitor_init
PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL hysem_destroy PROTOTYPE ((hysem_t s));
extern HY_CFUNC IDATA VMCALL
hythread_monitor_wait_interruptable
PROTOTYPE ((hythread_monitor_t monitor, I_64 millis, IDATA nanos));
extern HY_CFUNC IDATA VMCALL hythread_monitor_try_enter_using_threadId
PROTOTYPE ((hythread_monitor_t monitor, hythread_t threadId));
extern HY_CFUNC IDATA VMCALL hythread_monitor_exit
PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL hythread_set_priority
PROTOTYPE ((hythread_t thread, UDATA priority));
extern HY_CFUNC void VMCALL hythread_unpark PROTOTYPE ((hythread_t thread));
extern HY_CFUNC void VMCALL hythread_lib_lock PROTOTYPE ((hythread_t self));
extern HY_CFUNC IDATA VMCALL
hythread_monitor_init
PROTOTYPE ((hythread_monitor_t * handle, UDATA flags));
extern HY_CFUNC IDATA VMCALL hythread_sleep PROTOTYPE ((I_64 millis));
extern HY_CFUNC UDATA *VMCALL hythread_global PROTOTYPE ((const char *name));
extern HY_CFUNC IDATA VMCALL
hythread_tls_alloc_with_finalizer
PROTOTYPE ((hythread_tls_key_t * handle,
hythread_tls_finalizer_t finalizer));
extern HY_CFUNC void VMCALL hythread_jlm_monitor_clear
PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL hythread_monitor_wait_timed
PROTOTYPE ((hythread_monitor_t monitor, I_64 millis, IDATA nanos));
extern HY_CFUNC void VMCALL hythread_resume PROTOTYPE ((hythread_t thread));
extern HY_CFUNC UDATA VMCALL
hythread_lib_clear_flags PROTOTYPE ((UDATA flags));
extern HY_CFUNC void VMCALL
hythread_priority_interrupt PROTOTYPE ((hythread_t thread));
extern HY_CFUNC void VMCALL NORETURN
hythread_exit PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC IDATA VMCALL
hythread_monitor_exit_using_threadId
PROTOTYPE ((hythread_monitor_t monitor, hythread_t threadId));
extern HY_CFUNC UDATA VMCALL hythread_lib_get_flags PROTOTYPE (());
extern HY_CFUNC IDATA VMCALL
hythread_monitor_notify PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC void VMCALL
hythread_enable_stack_usage PROTOTYPE ((UDATA enable));
extern HY_CFUNC UDATA VMCALL
hythread_get_handle PROTOTYPE ((hythread_t thread));
extern HY_CFUNC UDATA VMCALL
hythread_get_stack_usage PROTOTYPE ((hythread_t thread));
extern HY_CFUNC I_64 VMCALL
hythread_get_cpu_time PROTOTYPE ((hythread_t thread));
extern HY_CFUNC UDATA VMCALL
hythread_get_stack_size PROTOTYPE ((hythread_t thread));
extern HY_CFUNC I_64 VMCALL
hythread_get_user_time PROTOTYPE ((hythread_t thread));
extern HY_CFUNC IDATA VMCALL hythread_get_os_priority
PROTOTYPE ((hythread_t thread, IDATA * policy, IDATA * priority));
extern HY_CFUNC UDATA VMCALL hythread_get_flags
PROTOTYPE ((hythread_t thread, hythread_monitor_t * blocker));
extern HY_CFUNC HyThreadMonitorTracing *VMCALL hythread_monitor_get_tracing
PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC UDATA VMCALL hythread_get_priority
PROTOTYPE ((hythread_t thread));
extern HY_CFUNC void *VMCALL hythread_tls_get
PROTOTYPE ((hythread_t thread, hythread_tls_key_t key));
extern HY_CFUNC const char *VMCALL hythread_monitor_get_name
PROTOTYPE ((hythread_monitor_t monitor));
extern HY_CFUNC hythread_monitor_t VMCALL hythread_monitor_walk
PROTOTYPE ((hythread_monitor_t monitor));
struct RWMutex;
typedef struct RWMutex *hythread_rwmutex_t;
extern HY_CFUNC IDATA VMCALL
hythread_rwmutex_enter_read PROTOTYPE ((hythread_rwmutex_t mutex));
extern HY_CFUNC IDATA VMCALL
hythread_rwmutex_destroy PROTOTYPE ((hythread_rwmutex_t mutex));
extern HY_CFUNC IDATA VMCALL
hythread_rwmutex_exit_read PROTOTYPE ((hythread_rwmutex_t mutex));
extern HY_CFUNC IDATA VMCALL
hythread_rwmutex_exit_write PROTOTYPE ((hythread_rwmutex_t mutex));
extern HY_CFUNC IDATA VMCALL
hythread_rwmutex_init
PROTOTYPE ((hythread_rwmutex_t * handle, UDATA flags, const char *name));
extern HY_CFUNC IDATA VMCALL hythread_rwmutex_enter_write
PROTOTYPE ((hythread_rwmutex_t mutex));
/* HyVMThreadHelpers*/
#if !defined(_HYVMTHREADHELPERS_)
#define _HYVMTHREADHELPERS_
extern HY_CFUNC UDATA VMCALL current_stack_depth ();
extern HY_CFUNC void VMCALL hythread_monitor_unpin (hythread_monitor_t
monitor,
hythread_t osThread);
extern HY_CFUNC void VMCALL hythread_monitor_pin (hythread_monitor_t
monitor,
hythread_t osThread);
#endif /* _HYVMTHREADHELPERS_ */
/* HyVMThreadSpinlocks*/
#if !defined(_HYVMTHREADSPINLOCKS_)
#define _HYVMTHREADSPINLOCKS_
extern HY_CFUNC IDATA VMCALL hythread_spinlock_acquire (hythread_t self,
hythread_monitor_t
monitor);
extern HY_CFUNC UDATA VMCALL hythread_spinlock_swapState (hythread_monitor_t
monitor,
UDATA newState);
#endif /* _HYVMTHREADSPINLOCKS_ */
#define hythread_global_monitor() (*(hythread_monitor_t*)hythread_global("global_monitor"))
#define hythread_monitor_init(pMon,flags) hythread_monitor_init_with_name(pMon,flags, #pMon)
#define hythread_monitor_set_name(pMon,pName)
#if defined(__cplusplus)
}
#endif
#endif /* HYTHREAD_H */