int main_minthread_create(pthread_t *th,uint8_t detached,void *(*fn)(void *),void *arg) { static pthread_attr_t *thattr = NULL; static uint8_t thattr_detached; if (thattr == NULL) { size_t mystacksize; thattr = malloc(sizeof(pthread_attr_t)); passert(thattr); zassert(pthread_attr_init(thattr)); #ifdef PTHREAD_STACK_MIN mystacksize = PTHREAD_STACK_MIN; if (mystacksize < 0x100000) { mystacksize = 0x100000; } #else mystacksize = 0x100000; #endif zassert(pthread_attr_setstacksize(thattr,mystacksize)); thattr_detached = detached + 1; // make it different } if (detached != thattr_detached) { if (detached) { zassert(pthread_attr_setdetachstate(thattr,PTHREAD_CREATE_DETACHED)); } else { zassert(pthread_attr_setdetachstate(thattr,PTHREAD_CREATE_JOINABLE)); } thattr_detached = detached; } return main_thread_create(th,thattr,fn,arg); }
/* * 内核主函数 */ void kernel_main() { char *str = "\n\nGreenLeafOS version 0.01.\n"; print(str); kernel_stack_top = (u32*)&tss.esp0; kernel_reenter = 0; thread_init(); main_thread_create(); thread_schedule(); restart(); while(1); }