⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread-internal.h

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 H
字号:
/* * thread-impl.h - pthread based ThreadInterface implementation * * Copyright (c) 1998 *      Transvirtual Technologies, Inc.  All rights reserved. * * Copyright (c) 2005 *      Kaffe.org contributors.  See ChangeLog for details. *      All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file. */#ifndef __thread_internal_h#define __thread_internal_h#define __USE_GNU#include <pthread.h>#include "repsemaphore.h"#include "gtypes.h"#include "threadData.h"#include "debug.h"#if !defined(STACKREDZONE)#define STACKREDZONE    8192#endif/* For jthread_get_status */#define THREAD_SUSPENDED	0#define THREAD_RUNNING		1#define THREAD_DEAD		2#define THREAD_KILL             3/* suspend states (these are exclusive) */typedef enum {  SS_PENDING_SUSPEND =  0x01,  /* suspend signal has been sent, but not handled */  SS_SUSPENDED       =  0x02,  /* suspend signal has been handled */  SS_PENDING_RESUME  =  0x04   /* resume signal  has been sent */} suspend_state_t;/* blocking states (might be accumulative) */typedef enum {  BS_THREAD          =  0x01,  /* blocked on tLock (thread system internal) */  BS_MUTEX           =  0x02,  /* blocked on a external mutex lock */  BS_CV              =  0x04,  /* blocked on a external convar wait */  BS_CV_TO           =  0x08,   /* blocked on a external convar timeout wait */  BS_SYSCALL         =  0x10  /* blocked on a real blocking syscall */} block_state_t;/* * 'jthread' is our link between native and Java thread objects. * It also serves as a container for our pthread extensions (namely * enumeration, and inter-thread suspend) */typedef struct _jthread {  threadData		data;  /* these are our links to the native pthread implementation */  pthread_t             tid;  pthread_attr_t        attr;  /* To release the lock */  pthread_mutex_t       suspendLock;  /* wether this is a daemon thread */  int			daemon;  int                   interrupting;  int                  status;  /* convars and mutexes aren't useful in signal handlers, semaphores are */  repsem_t                 sem;  /* the following fields hold our extensions */  int                   active;         /* are we in our user thread function 'func'? */  suspend_state_t       suspendState;   /* are we suspended for a critSection?  */  block_state_t         blockState;     /* are we in a Lwait or Llock (can handle signals)? */  void                  (*func)(void*);  /* this kicks off the user thread func */  void                  *stackMin;  void                  *stackCur;      /* just useful if blocked or suspended */  void                  *stackMax;  struct _jthread	*next;} *jthread_t;extern pthread_key_t   ntKey;/** * Returns the current native thread. * */jthread_t jthread_current(void);/** * Attaches the calling thread to the vm. * * @param is_daemon wether the thread is to be treated as a daemon thread * */bool jthread_attach_current_thread (bool is_daemon);/** * Detaches the calling thread from the vm. * */bool jthread_detach_current_thread (void);void jthread_sleep (jlong timeout);/** * Disable stopping the calling thread. * * Needed to avoid stopping a thread while it holds a lock. */void jthread_disable_stop(void);/** * Enable stopping the calling thread. * * Needed to avoid stopping a thread while it holds a lock. */void jthread_enable_stop(void);/**  * Stop a thread. *  * @param tid the thread to stop. */void jthread_stop(UNUSED jthread_t tid);/** * Interrupt a thread. *  * @param tid the thread to interrupt */void jthread_interrupt(jthread_t tid);/** * Register a function to be called when the all non-daemon threads have exited. *  * @param func the func to execute. */void jthread_atexit(void (* func)(void));/** * Dump some information about a thread to stderr. * * @param tid the thread whose info is to be dumped. */void jthread_dumpthreadinfo(UNUSED jthread_t tid);/** * Return the java.lang.Thread instance attached to a thread * * @param tid the native thread whose corresponding java thread *            is to be returned. * @return the java.lang.Thread instance. */threadData *jthread_get_data(jthread_t tid);/** * Test whether an address is on the stack of the calling thread. * * @param p the address to check * * @return true if address is on the stack * * Needed for locking and for exception handling. */bool jthread_on_current_stack(void* p);/** * Check for room on stack. * * @param left number of bytes that are needed * * @return true if @left bytes are free, otherwise false  * * Needed by intrp in order to implement stack overflow checking. */bool jthread_stackcheck(int left);/** * Extract the range of the stack that's in use. *  * @param tid the thread whose stack is to be examined * @param from storage for the address of the start address * @param len storage for the size of the used range * * @return true if successful, otherwise false * * Needed by the garbage collector. */bool jthread_extract_stack(jthread_t tid, void** from, unsigned* len);/** * Returns the upper bound of the stack of the calling thread. * * Needed by support.c in order to implement stack overflow checking.  */void* jthread_stacklimit(void);/* * Get the current stack limit. */void jthread_relaxstack(int yes);/** * yield. * */void jthread_yield (void);/** * Acquire a spin lock. * */void jthread_spinon(UNUSED void *dummy);/** * Release a spin lock. * */void jthread_spinoff(UNUSED void *dummy);struct _exceptionFrame;typedef void (*exchandler_t)(struct _exceptionFrame*);/** * Initialize handlers for null pointer accesses and div by zero         * */             void jthread_initexceptions(exchandler_t _nullHandler,			    exchandler_t _floatingHandler,			    exchandler_t _stackOverflowHandler);/** * Initialize the thread subsystem. * */struct _Collector;void jthread_init(int preemptive,                	/* preemptive scheduling */		  int maxpr,                     	/* maximum priority */		  int minpr,                     	/* minimum priority */		  struct _Collector *collector,		  void (*_destructor1)(void*),		/* called when a thread exits */		  void (*_onstop)(void),		/* called when a thread is stopped */		  void (*_ondeadlock)(void));		/* called when we detect deadlock *//** * Bind the main thread of the vm to a java.lang.Thread instance. * */jthread_t jthread_createfirst(size_t, unsigned int, void*);/** * Create a new native thread. * */jthread_t jthread_create (unsigned int pri, void* func, int is_daemon,			  void* jlThread, size_t threadStackSize );/** * Set the priority of a native thread. * */void jthread_setpriority (jthread_t thread, jint prio);/** * Called by thread.c when a thread is finished.  *  */void jthread_exit ( void );/** * Destroys the a native thread. * * @param thread the thread to destroy. * * Called when finalizing a java.lang.Thread instance. */void jthread_destroy (jthread_t thread);/** * Lock the special GC mutex. This mutex must be available to anyone doing * some GC sensitive operations (like intra-thread handling and the GC itself). * It may not be handled using the standard scheme as we can neither use fast * lock at some point of the thread handling nor the standard mutex for * the same reason. This call must be available in any circumstances after  * jthread_init. */void jthread_lockGC(void);/** * Unlock the special GC mutex. */void jthread_unlockGC(void);/** * Suspends all threads but the calling one.  * * Currently needed by the garbage collector. */void jthread_suspendall (void);/** * Unsuspends all threads but the calling one.  * * Currently needed by the garbage collector. */void jthread_unsuspendall (void);/** * Call a function once for each active thread. * Caution. This should only be used when all threads * are suspended using jthread_suspendall. */void jthread_walkLiveThreads (void(*)(jthread_t,void*), void *);/** * Call a function once for each active thread. * This is a reentrant version. */void jthread_walkLiveThreads_r (void(*)(jthread_t,void*), void *);/** * Return thread status */int jthread_get_status (jthread_t thread);/** * Specify the blocking state of a file descriptor */void jthread_set_blocking (int fd, int blocking);/** * Check the blocking state of a file descriptor */int jthread_is_blocking (int fd);/** * Check whether the specified thread is locked in a condvar. *  * @param th The thread to check. * @return 1 if it is locked, 0 else. */int jthread_on_condvar (jthread_t th);/** * Check whether the specified thread is locked in a mutex. * * @param th The thread to check. * @return 1 if it is locked, 0 else. */int jthread_on_mutex (jthread_t th);/** * Check whether the thread has been run since the last * clear. * * @param jt The thread to check the status of. * @return 1 if it has been run, 0 else. */int jthread_has_run (jthread_t jt);/** * Clear the run state of the specified thread. * * @param jt The thread to clear the run status of. */void jthread_clear_run (jthread_t jt);void jthread_suspend(UNUSED jthread_t jt, UNUSED void *suspender);void jthread_resume(UNUSED jthread_t jt, UNUSED void *suspender);jthread_t jthread_from_data(UNUSED threadData *td, UNUSED void *suspender);jlong jthread_get_usage(UNUSED jthread_t jt);int jthread_is_interrupted(jthread_t jt);int jthread_interrupted(jthread_t jt);void KaffePThread_WaitForResume(int releaseMutex, unsigned int state);void KaffePThread_AckAndWaitForResume(jthread_t cur, unsigned int newState);int KaffePThread_getSuspendSignal(void);void detectStackBoundaries(jthread_t jtid, size_t mainThreadStackSize);#endif /* __thread_impl_h */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -