KJAVA虚拟机Hack笔记-实现MIDP的SLAVE事件模型
734 views| 2008-11-26| 李先静| KVM hack notes| | 发表评论转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli@gmail.com>
MIDP有两种事件模型,一种称为MASTER模型,在这种模型中,以虚拟机为主GUI为从,事件的主循环在虚拟机中实现。另外一种称为SLAVE,在这种模型中,以GUI为主虚拟机为从,主循环在GUI中实现,目前只有QTE使用这种方式。我想GTK+和QTE的事件处理很类似,猜测GTK+也应该采用SLAVE模型。
移植到GTK+上时,我们仿照QTE建立events/slavemode_port/linux_gtk目录。主要实现两个函数就行了:
1. midp_slavemode_port_schedule_vm_timeslice 这是虚拟机调度的定时器,这个可以用glib的timeout来实现。
void midp_slavemode_port_schedule_vm_timeslice(void) { g_source_remove(g_schedule_tinfo.timer_id); g_schedule_tinfo.timer_id = g_timeout_add(g_schedule_tinfo.time_slice, schedule_timer, &g_schedule_tinfo); return; } static gboolean schedule_timer(gpointer data) { jlong ms = 0; ScheduleTimerInfo* info = (ScheduleTimerInfo*)data; if(info->vm_stoped) { return FALSE; } midp_checkAndResume(); ms = JVM_TimeSlice(); if (midp_getSRState() == SR_SUSPENDED) { ms = SR_RESUME_CHECK_TIMEOUT; } if (ms <= -2) { info->vm_stoped = TRUE; } else if(ms == -1) { gtk_main_quit(); } else { ms = ms & 0x7fffffff; info->timer_id = g_timeout_add(ms, schedule_timer, data); } return FALSE; }
这里要注意的是,JVM_TimeSlice返回-2表示虚拟机暂停了,返回-1表示要退出虚拟机,其它的则表示下一个定时器的时间,默认时间片长度为SR_RESUME_CHECK_TIMEOUT。
2.midp_slavemode_port_event_loop 这个就是GUI事件的主循环,实现很简单,直接调用gtk_main就好了。这时还要加一个初始的定时器。
void midp_slavemode_port_event_loop(void) { g_schedule_tinfo.vm_stoped = FALSE; g_schedule_tinfo.time_slice = SR_RESUME_CHECK_TIMEOUT; g_schedule_tinfo.timer_id = g_timeout_add(g_schedule_tinfo.time_slice, schedule_timer, &g_schedule_tinfo); gtk_main(); g_schedule_tinfo.vm_stoped = TRUE; return; }
Share
Tags
Recent Posts
Most Viewed
- 系统程序员成长计划写作提纲 - 19,605 views
- Android IPC机制详解 - 6,277 views
- 系统程序员成长计划-走近专业程序员(上) - 6,253 views
- 系统程序员成长计划-写得又快又好的秘诀(一) - 5,390 views
- 系统程序员成长计划-背景知识 - 5,070 views
- i++循环与i–循环的执行效率 - 4,712 views
- 系统程序员成长计划-Write once, run anywhere(WORA)(上) - 4,700 views
- 系统程序员成长计划-走近专业程序员(下) - 4,254 views
- Linux下的调试工具 - 4,017 views
- Advanced Linux Sound Architecture (ALSA) 研究笔记 - 4,017 views
- 系统程序员成长计划-序 - 3,985 views
- 系统程序员成长计划-写得又快又好的秘诀(三) - 3,929 views
- 中国人与自由软件文化研究(搞笑版) - 3,735 views
- Android中的MessageQueue,Handler,Looper和Thread - 3,686 views
- 答复:我不会OOO,仍然可以XXX - 3,658 views
Categories
- Android (28)
- Broncho-A1-Hack (6)
- DirectFB (7)
- FTK(嵌入式GUI) (24)
- GTK+ (29)
- KVM hack notes (8)
- Linux Mobile (65)
- Management (5)
- Mozilla (9)
- Open Source (5)
- Programming (34)
- Tools (9)
- Uncategorized (23)
- Win32 (3)
- X Windows (31)
- 沉思录 (29)
- 系统程序员成长计划 (67)
Blogroll
gallery
Linux guru
推荐网站
Recent Comments
- Dig on 嵌入式GUI FTK设计与实现-事件源(FtkSource)
- 用心生活每一天 » GNU gprof: linux profiling tools 使用 on gcc profiling的工作原理
- JavaScript for: i++ vs i–-传播、沟通、分享-一直“有你” on i++循环与i–循环的执行效率
- Frankly Law on 嵌入式GUI FTK介绍(11)-交叉编译
- tracing on Linux下的调试工具
- ndljsn on FTK移植指南(初稿)
- tracing on 爬塘朗山
- tracing on GTK+(基于DirectFB)的字体处理
- Kely on 系统程序员成长计划写作提纲
- tracing on 爬塘朗山



November 26th, 2008