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

📄 jthread.h

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 H
字号:
/* * jthread.h * Internal threading backend of Kaffe for DROPS *  * Copyright (c) 2004, 2005 *	TU Dresden, Operating System Group.  All rights reserved. * * See the file "license.terms" for information on usage and redistribution * of this file. * * written by Alexander Boettcher <ab764283@os.inf.tu-dresden.de> */#ifndef __l4_jthread_h#define __l4_jthread_h#include <l4/sys/types.h>#include <l4/sys/syscalls.h>#include "config.h"#include "config-setjmp.h"#include "config-std.h"#include "config-mem.h"#include "config-io.h"#include "gtypes.h"#include "support.h"#include "md.h"#include "lerrno.h"#include "lock-impl.h"#include "threadData.h"#include <l4/util/macros.h> /* l4util_idfmt, l4util_idstr *///#include "thread.h"#define GET_STACK_PTR(var) asm volatile ("mov %%esp, %%eax" : "=a" (var))typedef struct _jthread {        threadData data;        /* threadData from the JavaThreads*/        int daemon;             /* a daemon thread? */        struct _jthread * next; /* next live thread */        struct _jthread * prev; /* prev live thread */	void   (*func)(void *); /* Start function */        l4_umword_t eip;         l4_umword_t esp;        l4thread_t l4thread;    /* native thread id */	int interrupting;       /* FLAG, if thread is in interrupting state */#ifdef REALTIME_EXTENSION        int threadtype;        unsigned status;#endif} jthread, *jthread_t;#include "l4thread.h"extern __leaflet leaflet;struct _Collector;/*  * initialize the threading system */jthread_tjthread_init(	int preemptive,			/* preemptive scheduling */	int maxpr, 			/* maximum priority */	int minpr, 			/* minimum priority */        struct _Collector *collector,   /* memory de-/re- & allocator */	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 int prio, 		    void* jlThread);/* * create a thread with a given priority */jthread_tjthread_create(unsigned int pri, 	/* initial priority */	void (*func)(void *),  		/* start function */	int isDaemon, 			/* is this thread a daemon? */	void *jlThread, 		/* cookie for this thread */	size_t threadStackSize);	/* stack size to be allocated */#ifdef REALTIME_EXTENSION/* * create a realtime thread with a given priority */jthread_tjthread_createRT(unsigned int pri,		 void (*func)(void *),		 int isDaemon,	         void *jlThread,		 size_t threadStackSize,		 int threadtype);#endif /*REALTME_EXTENSION */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);/* * walk all live threads, and invoke `func', passing in their cookie * this is used with `func' set to walkMemory */void jthread_walkLiveThreads   (void (*)(jthread_t,void*), void *);void jthread_walkLiveThreads_r (void (*)(jthread_t,void*), void *); inline static threadData* jthread_get_data(jthread_t tid){  return (&tid->data);}/*  * destroy this jthread structure  */void	jthread_destroy(jthread_t jtid);/* * sleep for time milliseconds */void 	jthread_sleep(jlong jtime);/* * returns the Kaffe thread data structure of the current native L4 thread. */inline static jthread_t jthread_current(void){ return (jthread_t)l4thread_data_get_current(leaflet.datakey);}/* * set the priority of a thread  */inline static voidjthread_setpriority(jthread_t jtid, int prio){  if (l4thread_set_prio(jtid->l4thread,prio + leaflet.startPrio)!=0)    assert(!"l4thread_set_prio failed !");}/*  * 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 a thread */static inline void jthread_interrupt(jthread_t thread) {  thread->interrupting = 1;  /* bad hack, because of races ! */  if (thread->data.sem.l4sem.counter < 0 ) {    thread->data.sem.failed = true;    ksem_put(&thread->data.sem);  }}/* * have the current thread exit */void 	jthread_exit(void) NONRETURNING;/* * 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));/* * determine whether a location is on the stack of the current thread * (was FRAMEOKAY) */static inline intjthread_on_current_stack(void *bp) {  int nReturn = 0;  l4_addr_t low,high;  l4_addr_t addr = (l4_addr_t)bp;  if (l4thread_get_stack_current(&low,&high)){    assert(!"l4thread_get_stack_current problem!");  }else if (low <= addr && addr <= high) nReturn = 1; //on stack !   return nReturn;}/* * Check for room on stack. */static inline intjthread_stackcheck(int need) {  int nReturn = 0;  l4_addr_t low,high;  unsigned long old_esp;  GET_STACK_PTR(old_esp);  if (l4thread_get_stack_current(&low,&high)){    assert(!"l4thread_get_stack_current problem!");  }else{    if (old_esp - need >= low) nReturn = 1;  }  return nReturn;}static inline voidjthread_relaxstack(int yes UNUSED) {  printf("todo - jthread_relaxstack\n");}static inline void*jthread_stacklimit(void) {  printf("todo - jthread_stacklimit \n");  return 0;}/* * determine the "interesting" stack range a conservative gc must walk */intjthread_extract_stack(jthread_t jtid, void **from, unsigned *len);/* * Disallow cancellation for current thread * * Need while thread is holding a lock. */static inline void jthread_disable_stop(void){};/* * Reallow cancellation for current thread * If a cancellation is pending, the stop method will be called */static inline 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. * - Currently, addr is unused in Kaffe. * - Kaffe's AWT QT backend uses this functions for malloc. */static inline void jthread_spinon(UNUSED void *arg){  l4semaphore_down(&leaflet.systemLock);}static inline void jthread_spinoff(UNUSED void *arg){  l4semaphore_up(&leaflet.systemLock);}/* * Prevent all other threads from running. */void jthread_suspendall(void);/* * Reallow other threads. */void jthread_unsuspendall(void);void drops_registerForExceptions(void);/** * Specify the blocking state of a file descriptor */void jthread_set_blocking (int fd, int blocking);/** * Peek at the interrupted flag of a thread. * * @return true if thread was interrupted. */static inline int jthread_is_interrupted(jthread_t thread) {  return thread->interrupting;}/** * Read and clear the interrupted flag of a thread. * * @return true if thread was interrupted. */static inline int jthread_interrupted(jthread_t thread){  int i = thread->interrupting;  thread->interrupting = 0;  return i;}static inline bool jthread_attach_current_thread (bool isDaemon UNUSED) {  return false; //to do}bool jthread_detach_current_thread (void);	/* * yield to another thread */static inline void 	jthread_yield(void){  l4_yield();}static inline void jthread_lockGC(void){//  l4semaphore_down(&leaflet.gcLock);}static inline void jthread_unlockGC(void){//  l4semaphore_up(&leaflet.gcLock);}#ifdef REALTIME_EXTENSIONvoid * jthread_createarea(l4_size_t size);void * jthread_reservearea(l4_size_t size);/** * Consumed time (in us) of a thread reported by the kernel. */jlong jthread_ctime(jthread_t thread);jint jthread_startPeriodic(jlong start_ms,                           jint  start_ns,                           jlong period_ms,                           jint  period_ns,                           jlong wcet_ms,                           jint  wcet_ns);void jthread_stopPeriodic(void);void jthread_nextPeriod(void);/* * set a function to be run when deadline is missed or  * cost (wcet) is overruned. */void jthread_misshandler(void (*f)(jthread_t, unsigned), unsigned costoverrun,                         unsigned deadlineoverrun);#endif /* REALTIME_EXTENSION */#endif

⌨️ 快捷键说明

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