Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192545
  • 博文数量: 111
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1240
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 07:46
文章分类

全部博文(111)

文章存档

2015年(2)

2014年(1)

2011年(1)

2010年(7)

2009年(100)

我的朋友

分类: LINUX

2009-08-07 10:55:18


转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静

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;
}
Category: KVM hack notes
阅读(390) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~