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

📄 jthread.h

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 H
字号:
/* * Copyright (c) 1998 The University of Utah. All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file. * * Contributed by the Flux Research Group at the University of Utah. * Authors: Godmar Back, Leigh Stoller *//* Modified for BeOS R4 */#ifndef __jthread_h#define __jthread_h#include <OS.h>#include "config.h"#include "config-setjmp.h"#include "config-std.h"#include "config-mem.h"#include "config-io.h"#include "jtypes.h"#include "gtypes.h"#include "thread.h"#include "support.h"#include "md.h"#include "lerrno.h"/* * We set an arbitrary limit on the number of threads just so we can * use MAX_THREADS to determine the size of the "area" allocated for * per-thread information.  Because thread ids are hashed to indices * using a simple modulo function, in practice the number of threads * supported will be somewhat less than this number. */#define MAX_THREADS 	2048/* * This amount of memory must be large enough to contain an array * of MAX_THREADS instances of the per_thread_info_t structure * defined later. */#define PTI_AREA_SIZE	(B_PAGE_SIZE * 6)/* * This is our internal structure representing a "jthread" which is mapped * on top of a BeOS native thread. */typedef struct jthread {	struct jthread*		nextlive;	  /* Live threads chain */	int			daemon;		  /* Is a daemon thread? */	void			(*func)(void*);	  /* Startup function */	void*			jlThread;         /* java_lang_thread ptr */	thread_id		native_thread;    /* BeOS tid */	unsigned char		status;		  /* Thread status */	int32			stop_allowed;	  /* non-zero if STOPpable */	int32			stop_pending;	  /* remember when STOPped */	void*			stack_top;	  /* "static" address */	void*			stack_bottom;	  /* this one, too */} *jthread_t;/* * The cookie is the Java_lang_thread class structure for the current thread. * The jthread is the local jthread_t structure for the current thread. * * These two are kept together in an array of structures, one per thread, * maintained in a BeOS "area" that is created by jthread_init. * The index of the entry for thread N is simply (N % MAX_THREADS), * at least for now. */typedef struct {	void*		cookie;	jthread_t	jtid;} per_thread_info_t;extern per_thread_info_t* per_thread_info;	  /* addr of a BeOS area */#define TIDX		(find_thread(NULL) % MAX_THREADS)#define GET_JTHREAD()	(per_thread_info[TIDX].jtid)#define SET_JTHREAD(x)	{ per_thread_info[TIDX].jtid = (x); }#define GET_COOKIE()	(per_thread_info[TIDX].cookie)/* * This is somewhat bogus. Set jthread->jlthread at the same time so * as not to change the code in internal.c, which is going to be shared * at some point.  */#define SET_COOKIE(x) \	{ \		int i = TIDX;						\		jthread_t jthread = per_thread_info[i].jtid;		\									\		jthread->jlThread = (x);				\		per_thread_info[i].cookie = (x);			\	}/*  * return thread-specific data for a given native thread (not a jthread!) * as returned by jthread_current(). */static inline void*jthread_getcookie(void* tid){	return per_thread_info[(thread_id)tid % MAX_THREADS].cookie;}/**************************************************************************** * * The following functions form the interface provided by the  * revised internal threading system. *//*  * initialize the threading system */jthread_tjthread_init(	int preemptive,			/* preemptive scheduling */	int maxpr, 			/* maximum priority */	int minpr, 			/* minimum priority */        void *(*_allocator)(size_t),	/* memory allocator */	void (*_deallocator)(void*),	/* memory deallocator */	void (*_destructor1)(void*),	/* called when a thread exits */ 	void (*_onstop)(void),		/* called when a thread is stopped */	void (*_ondeadlock)(void));     /* called on deadlock *//* * Create the first thread - actually bind the first thread to the java * context. */jthread_tjthread_createfirst(size_t mainThreadStackSize, 		    unsigned char prio, 		    void* jlThread);/* * create a thread with a given priority */jthread_tjthread_create(unsigned int pri, 	/* initial priority */	void (*func)(void *), 		/* start function */	int daemon, 			/* is this thread a daemon? */	void *jlThread, 		/* cookie for this thread */	size_t threadStackSize);	/* stack size to be allocated */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);/* * set a function to be run when last non-daemon dies  * this is used to run the finalizer on exit. */void 	jthread_atexit(void (*f)(void));/* * walk all live threads, and invoke `func', passing in their cookie * this is used with `func' set to walkMemory */void 	jthread_walkLiveThreads(void (*func)(void *jlThread));/*  * destroy this jthread structure  */void	jthread_destroy(jthread_t jtid);/* * set the priority of a thread  */void	jthread_setpriority(jthread_t jtid, int prio);/* * yield to another thread */static inline void 	jthread_yield(void){ 	snooze(1);}/* * sleep for time milliseconds */void 	jthread_sleep(jlong time);/*  * return the current native thread  */static inline thread_idjthread_current(void) { 	return find_thread(NULL);}/*  * count the number of stack frames - unimplemented  */int 	jthread_frames(jthread_t thrd);/*  * return whether this thread is alive or not */int 	jthread_alive(jthread_t jtid);/* * stop this thread */void 	jthread_stop(jthread_t jtid);/* * interrupt this thread */void 	jthread_interrupt(jthread_t jtid);/* * have the current thread exit */void 	jthread_exit(void) NONRETURNING;/* * determine whether a location is on the stack of the current thread * (was FRAMEOKAY) */int 	jthread_on_current_stack(void *bp);/* * Check for room on stack. */int 	jthread_stackcheck(int left);#define	REDZONE	1024static inline void*jthread_stacklimit(void){	jthread_t currentJThread = GET_JTHREAD();	return ((void*)((char*)currentJThread->stack_bottom + REDZONE));}/* * determine the "interesting" stack range a conservative gc must walk */int jthread_extract_stack(jthread_t jtid, void **from, unsigned *len);/* * Disallow cancellation for current thread */void jthread_disable_stop(void);/* * Reallow cancellation for current thread * If a cancellation is pending, the stop method will be called */void jthread_enable_stop(void);/* * Print info about a given jthread to stderr */void jthread_dumpthreadinfo(jthread_t tid);/* * Implement a spin lock on a given addr */void jthread_spinon(void *arg);void jthread_spinoff(void *arg);/* * Prevent all other threads from running. */void jthread_suspendall(void);/* * Reallow other threads. */void jthread_unsuspendall(void);/* * Signals */void catchSignal(int sig, void* handler);#endif

⌨️ 快捷键说明

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