void package_release(struct package *P) { while (!queue_empty(&P->response)) { // drop the message struct response resp; queue_pop(&P->response, &resp); skynet_free(resp.msg); } if (P->uncomplete_sz >= 0) skynet_free(P->uncomplete.msg); queue_exit(&P->request); queue_exit(&P->response); skynet_free(P); }
/** * 客户端请求处理函数:这个函数是selector里面的客户端的通信句柄对应的回调函数 **/ si_t client_request_handler(struct egui_uds* uds_ptr, addr_t arg) { struct queue message_queue; si_t ret = 0; NOT_USED(arg); EGUI_PRINT_INFO("callback client_request_handler() is called"); queue_init(&message_queue); /** 接受request回应respond **/ ret = comm_recv_request_and_send_respond(uds_ptr, &message_queue, request_handler); if(EXIT_NUMBER == ret) { return SELECTER_RETURN_TYPE_END; } /** 发送相关消息 **/ while(!queue_empty(&message_queue)) { union message* message_ptr = (union message*)queue_front(&message_queue); if(0 != comm_send_message(uds_ptr, message_ptr)) { EGUI_PRINT_ERROR("failed to send message!"); } queue_pop(&message_queue); } queue_exit(&message_queue); return SELECTER_RETURN_TYPE_CONTINUE; }
static void ascii_exit(void) { timer_exit(); exitEmptyArray(); queue_exit(); exit_semaphores(); device_destroy(class_ascii, MKDEV(major, 0)); class_destroy(class_ascii); printk(KERN_INFO "Device unregistering succeed\n"); return unregister_chrdev(major, DEVICE_NAME); }
si_t application_exit() { struct object * addr; si_t i, n; /** * release focus list **/ list_exit(&(global_application.focus_list)); /* 有多少个窗口 */ n = vector_size(&(global_application.window_vector)); /* 依次删除窗口 */ for(i = n - 1; i >= 0; -- i) { addr = vector_at(&(global_application.window_vector), i); /* 这里没有逐个注销窗口类对象或者它的派生类对象。 因为窗口管理程序收到用户应用程序的退出请求后, 会释放关于这个用户应用程序的所有资源。 */ /* 释放这棵树 */ object_tree_free(addr->parent); /* 从窗口向量中删除这个节点 */ vector_erase(&(global_application.window_vector), i); } vector_exit(&(global_application.window_vector)); if(0 != cancel_application()) { EGUI_PRINT_ERROR("failed to cancle application"); } event_listener_exit(&global_application.app_event_listener); queue_exit(&global_application.message_queue); uds_exit(&global_application.uds); free(global_application.name); free(global_application.icon_root_path); term_restore(); return 0; }