Thread_TreeNode * Thread_TreeNode_Add_New(Thread_TreeNode *ttn, thread_t tid) /* 功能:在线程树中添加新的结点 */ { int temp = 0, i; LCUI_ID pos = 0; if(ttn->child.total_num > 0) { /* 先遍历数据,找未使用的空位 */ for(i = 0; i < ttn->child.max_num; ++i) { if(ttn->child.queue[i] == NULL) { if(temp == 0) { temp = 1; pos = i; } } else if(ttn->child.queue[i]->tid == tid) { /* 如果该线程ID一致 */ return ttn->child.queue[i]; } } ttn->child.total_num += 1; /* 增加该程序的总窗口数量 */ } else { pos = 0; ttn->child.total_num = 1; ttn->child.max_num = ttn->child.total_num; ttn->child.queue = (Thread_TreeNode**)calloc(1, sizeof( Thread_TreeNode*)); if(ttn->child.queue == NULL) {/* 如果申请内存失败 */ // return NULL; } temp = 1; } if(temp == 0) {/* 如果没有空位,那就扩增内存 */ pos = ttn->child.max_num; ++ttn->child.max_num; ttn->child.queue = (Thread_TreeNode**)realloc(ttn->child.queue, ttn->child.max_num * sizeof(Thread_TreeNode*)); if(ttn->child.queue == NULL) {/* 如果扩增内存失败 */ return NULL; } } ttn->child.queue[pos] = (Thread_TreeNode*)calloc(1, sizeof(Thread_TreeNode)); /* 以下需要初始化 */ Thread_TreeNode_Init(ttn->child.queue[pos]); ttn->child.queue[pos]->tid = tid; /* 保存线程ID */ ttn->child.queue[pos]->parent = ttn; /* 保存父线程的结点指针 */ return ttn->child.queue[pos]; }
static Thread_TreeNode * ThreadTreeNode_AddNew( Thread_TreeNode *ttn, LCUI_Thread tid ) /* 功能:在线程树中添加新的结点 */ { Thread_TreeNode *new_ttn; new_ttn = malloc(sizeof(Thread_TreeNode)); Thread_TreeNode_Init( new_ttn ); new_ttn->tid = tid; new_ttn->parent = ttn; Queue_AddPointer(& ttn->child, new_ttn ); return new_ttn; }
LCUIModule_Thread_Init( void ) { Thread_TreeNode_Init( &thread_tree ); /* 初始化根线程结点 */ thread_tree.tid = LCUIThread_SelfID(); /* 当前线程ID作为根结点 */ LCUI_Sys.self_id = thread_tree.tid; /* 保存线程ID */ }