static void tt_check_stack(TT_THREAD_T *thread) { if (thread == NULL) return; //Calculate max stack used. if ((uint32_t)thread->stack_max_used == 0 || (uint32_t)thread->stack_max_used > thread->uSP) thread->stack_max_used = (void *)thread->uSP; //Check stack overflow if ((uint32_t)thread->stack_base > 0) /* For main thread, do not check this. */ { if (thread->uSP < (uint32_t)thread->stack_limit) { tt_printf ("Stack down overflow for task: (%08x, %08x) %s\n", (int)thread, (int)thread->uSP, thread->name); /* Indicate stack down overflow if run to here. */ while(1); } if (thread->uSP > (uint32_t)thread->stack_base - sizeof (TT_THREAD_PUSH_STACK)) { tt_printf ("Stack up overflow for task: (%08xk, %08x) %s\n", (int)thread, (int)thread->uSP, thread->name); /* Indicate stack up overflow if run to here, It rarely happens unless the program is damaged. */ while(1); } } }
void thread_entry(void *arg) { THREAD_ARG_T *the_arg = (THREAD_ARG_T *)arg; while(1) { int i; int value; /* Show LED so that users know that the thread is running. */ int cur_ticks = tt_get_ticks (); if(cur_ticks % 64 < 32) DrvGPIO_SetBit(the_arg->gpio_group, the_arg->gpio_bit); /* Turn off LED */ else DrvGPIO_ClrBit(the_arg->gpio_group, the_arg->gpio_bit); /* Turn on LED */ /* Lock the mutex */ tt_rmutex_lock(the_arg->mutex); /* Update value */ for(i = 0; i < THREAD_NUM; ++i) ++the_arg->value[i]; /* (Recursive) Lock the mutex again */ tt_rmutex_lock(the_arg->mutex); /* Check the lock operation by checking value */ value = the_arg->value[0]; for(i = 0; i < THREAD_NUM; ++i) { if(the_arg->value[i] != value) { /* To run to here indicates that the test for mutex lock has been failed. */ tt_printf("Failed\n"); while(1); } } /* (Recursive) Unlock the mutex */ tt_rmutex_unlock(the_arg->mutex); /* Unlock the mutex */ tt_rmutex_unlock(the_arg->mutex); } }
void tt_skt_status_dump_ntv(IN tt_u32_t flag) { char path[PATH_MAX + 1]; int len; DIR *d; struct dirent entry; struct dirent *result = NULL; len = snprintf(path, PATH_MAX, "/proc/%d/fd/", getpid()); d = opendir(path); if (d == NULL) { tt_printf("fail to open %s", path); return; } while ((readdir_r(d, &entry, &result) == 0) && (result != NULL)) { char link[PATH_MAX + 1]; ssize_t n; int s; if ((strcmp(entry.d_name, ".") == 0) || (strcmp(entry.d_name, "..") == 0)) { continue; } path[len] = 0; strncat(path, entry.d_name, PATH_MAX); if ((n = readlink(path, link, PATH_MAX)) < 0) { continue; } link[n] = 0; if (strncmp(link, "socket", 6) != 0) { // only show socket continue; } s = strtol(entry.d_name, NULL, 10); __dump_socket_fdinfo(s, flag); } closedir(d); }
void tt_fs_status_dump_ntv(IN tt_u32_t flag) { pid_t pid; int size; struct proc_fdinfo *fdinfo; pid = getpid(); size = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0); if (size <= 0) { return; } fdinfo = (struct proc_fdinfo *)malloc(size); if (fdinfo == NULL) { return; } size = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, fdinfo, size); if (size > 0) { int n, i; n = size / PROC_PIDLISTFD_SIZE; for (i = 0; i < n; ++i) { if (fdinfo[i].proc_fdtype == PROX_FDTYPE_VNODE) { struct vnode_fdinfowithpath vi; int vs = proc_pidfdinfo(pid, fdinfo[i].proc_fd, PROC_PIDFDVNODEPATHINFO, &vi, PROC_PIDFDVNODEPATHINFO_SIZE); if (vs == PROC_PIDFDVNODEPATHINFO_SIZE) { tt_printf("%s[fd: %d] [%s]\n", TT_COND(flag & TT_FS_STATUS_PREFIX, "<<FS>> ", ""), fdinfo[i].proc_fd, vi.pvip.vip_path); } } } } free(fdinfo); }
unsigned char sb_handle_button_press(event_t *ev) { D_EVENTS(("sb_handle_button_press(ev [%8p] on window 0x%08x)\n", ev, ev->xany.window)); REQUIRE_RVAL(XEVENT_IS_MYWIN(ev, &scrollbar_event_data), 0); button_state.bypass_keystate = (ev->xbutton.state & (Mod1Mask | ShiftMask)); button_state.report_mode = (button_state.bypass_keystate ? 0 : ((PrivateModes & PrivMode_mouse_report) ? 1 : 0)); scrollbar_cancel_motion(); #ifndef NO_SCROLLBAR_REPORT if (button_state.report_mode) { /* Mouse report disabled scrollbar. Arrows send cursor key up/down, trough sends pageup/pagedown */ if (scrollbar_win_is_uparrow(ev->xany.window)) tt_printf((unsigned char *) "\033[A"); else if (scrollbar_win_is_downarrow(ev->xany.window)) tt_printf((unsigned char *) "\033[B"); else { switch (ev->xbutton.button) { case Button2: tt_printf((unsigned char *) "\014"); break; case Button1: tt_printf((unsigned char *) "\033[6~"); break; case Button3: tt_printf((unsigned char *) "\033[5~"); break; } } } else #endif /* NO_SCROLLBAR_REPORT */ { D_EVENTS(("ButtonPress event for window 0x%08x at %d, %d\n", ev->xany.window, ev->xbutton.x, ev->xbutton.y)); D_EVENTS((" up [0x%08x], down [0x%08x], anchor [0x%08x], trough [0x%08x]\n", scrollbar.up_win, scrollbar.dn_win, scrollbar.sa_win, scrollbar.win)); if (scrollbar_win_is_uparrow(ev->xany.window)) { scrollbar_draw_uparrow(IMAGE_STATE_CLICKED, 0); #ifdef SCROLLBAR_BUTTON_CONTINUAL_SCROLLING scroll_arrow_delay = SCROLLBAR_INITIAL_DELAY; #endif if (scr_page(UP, 1)) { scrollbar_set_uparrow_pressed(1); } } else if (scrollbar_win_is_downarrow(ev->xany.window)) { scrollbar_draw_downarrow(IMAGE_STATE_CLICKED, 0); #ifdef SCROLLBAR_BUTTON_CONTINUAL_SCROLLING scroll_arrow_delay = SCROLLBAR_INITIAL_DELAY; #endif if (scr_page(DN, 1)) { scrollbar_set_downarrow_pressed(1); } } else { if (scrollbar_win_is_anchor(ev->xany.window)) { scrollbar_set_anchor_pressed(1); scrollbar_draw_anchor(IMAGE_STATE_CLICKED, 0); } switch (ev->xbutton.button) { case Button2: button_state.mouse_offset = scrollbar_anchor_height() / 2; /* Align to center */ if (!scrollbar_win_is_anchor(ev->xany.window)) { scr_move_to(scrollbar_position(ev->xbutton.y) - button_state.mouse_offset, scrollbar_scrollarea_height()); } else if (scrollbar.type == SCROLLBAR_XTERM) { scr_move_to(scrollbar.anchor_top + ev->xbutton.y - button_state.mouse_offset, scrollbar_scrollarea_height()); } scrollbar_set_motion(1); break; case Button1: button_state.mouse_offset = ((scrollbar_win_is_anchor(ev->xany.window)) ? (MAX(ev->xbutton.y, 1)) : (1)); /* drop */ case Button3: #if defined(MOTIF_SCROLLBAR) || defined(NEXT_SCROLLBAR) if (scrollbar.type == SCROLLBAR_MOTIF || scrollbar.type == SCROLLBAR_NEXT) { if (scrollbar_is_above_anchor(ev->xany.window, ev->xbutton.y)) { scrollbar_draw_trough(IMAGE_STATE_CLICKED, 0); scr_page(UP, TermWin.nrow - CONTEXT_LINES); } else if (scrollbar_is_below_anchor(ev->xany.window, ev->xbutton.y)) { scrollbar_draw_trough(IMAGE_STATE_CLICKED, 0); scr_page(DN, TermWin.nrow - CONTEXT_LINES); } else { scrollbar_set_motion(1); } } #endif /* MOTIF_SCROLLBAR || NEXT_SCROLLBAR */ #ifdef XTERM_SCROLLBAR if (scrollbar.type == SCROLLBAR_XTERM) { scr_page((ev->xbutton.button == Button1 ? DN : UP), TermWin.nrow - CONTEXT_LINES); } #endif /* XTERM_SCROLLBAR */ break; } } } return 1; }
void __dump_socket_fdinfo(IN int s, IN tt_u32_t flag) { int val; socklen_t len = sizeof(val); const char *type = "?"; char local[128] = {0}; char remote[128] = {0}; if (getsockopt(s, SOL_SOCKET, SO_TYPE, &val, &len) != 0) { tt_printf("%s[fd: %d] ?\n", TT_COND(flag & TT_SKT_STATUS_PREFIX, "<<Socket>> ", ""), s); } else if (val == SOCK_STREAM) { struct sockaddr_storage a; socklen_t alen = sizeof(a); char local[128] = {0}; char remote[128] = {0}; if (getsockname(s, (struct sockaddr *)&a, &alen) != 0) { tt_snprintf(local, sizeof(local) - 1, "?|?"); } else if (a.ss_family == AF_INET) { struct sockaddr_in *a4 = (struct sockaddr_in *)&a; tt_sktaddr_ip_t ip; char addr[64] = {0}; ip.a32.__u32 = a4->sin_addr.s_addr; tt_sktaddr_ip_n2p(TT_NET_AF_INET, &ip, addr, sizeof(addr) - 1); tt_snprintf(local, sizeof(local) - 1, "%s@%d", addr, ntohs(a4->sin_port)); } else if (a.ss_family == AF_INET6) { struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)&a; tt_sktaddr_ip_t ip; char addr[64] = {0}; tt_memcpy(ip.a128.__u8, a6->sin6_addr.s6_addr, 16); tt_sktaddr_ip_n2p(TT_NET_AF_INET6, &ip, addr, sizeof(addr) - 1); tt_snprintf(local, sizeof(local) - 1, "%s@%d", addr, ntohs(a6->sin6_port)); } else if (a.ss_family == AF_LOCAL) { return; } else { tt_snprintf(local, sizeof(local) - 1, "?|?"); } if (getpeername(s, (struct sockaddr *)&a, &alen) != 0) { tt_snprintf(remote, sizeof(remote) - 1, "?|?"); } else if (a.ss_family == AF_INET) { struct sockaddr_in *a4 = (struct sockaddr_in *)&a; tt_sktaddr_ip_t ip; char addr[64] = {0}; ip.a32.__u32 = a4->sin_addr.s_addr; tt_sktaddr_ip_n2p(TT_NET_AF_INET, &ip, addr, sizeof(addr) - 1); tt_snprintf(remote, sizeof(remote) - 1, "%s@%d", addr, ntohs(a4->sin_port)); } else if (a.ss_family == AF_INET6) { struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)&a; tt_sktaddr_ip_t ip; char addr[64] = {0}; tt_memcpy(ip.a128.__u8, a6->sin6_addr.s6_addr, 16); tt_sktaddr_ip_n2p(TT_NET_AF_INET6, &ip, addr, sizeof(addr) - 1); tt_snprintf(remote, sizeof(remote) - 1, "%s@%d", addr, ntohs(a6->sin6_port)); } else if (a.ss_family == AF_LOCAL) { return; } else { tt_snprintf(remote, sizeof(local) - 1, "?|?"); } tt_printf("%s[fd: %d] tcp [%s --> %s]\n", TT_COND(flag & TT_SKT_STATUS_PREFIX, "<<Socket>> ", ""), s, local, remote); } else if (val == SOCK_DGRAM) { struct sockaddr_storage a; socklen_t alen = sizeof(a); char local[128] = {0}; if (getsockname(s, (struct sockaddr *)&a, &alen) != 0) { tt_snprintf(local, sizeof(local) - 1, "?|?"); } else if (a.ss_family == AF_INET) { struct sockaddr_in *a4 = (struct sockaddr_in *)&a; tt_sktaddr_ip_t ip; char addr[64] = {0}; ip.a32.__u32 = a4->sin_addr.s_addr; tt_sktaddr_ip_n2p(TT_NET_AF_INET, &ip, addr, sizeof(addr) - 1); tt_snprintf(local, sizeof(local) - 1, "%s@%d", addr, ntohs(a4->sin_port)); } else if (a.ss_family == AF_INET6) { struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)&a; tt_sktaddr_ip_t ip; char addr[64] = {0}; tt_memcpy(ip.a128.__u8, a6->sin6_addr.s6_addr, 16); tt_sktaddr_ip_n2p(TT_NET_AF_INET6, &ip, addr, sizeof(addr) - 1); tt_snprintf(local, sizeof(local) - 1, "%s@%d", addr, ntohs(a6->sin6_port)); } else if (a.ss_family == AF_LOCAL) { return; } else { tt_snprintf(local, sizeof(local) - 1, "?|?"); } tt_printf("%s[fd: %d] udp [%s]\n", TT_COND(flag & TT_SKT_STATUS_PREFIX, "<<Socket>> ", ""), s, local); } /*else { tt_printf("%s[fd: %d] ?\n", TT_COND(flag & TT_SKT_STATUS_PREFIX, "<<Socket>> ", ""), s); }*/ }
void __lio_std_output(IN tt_logio_t *lio, IN const tt_char_t *data, IN tt_u32_t data_len) { tt_printf("%s", data); }