飞机空中换引擎之cool之零
11年12月2日 下午 11:03:43
**严重声明:该例子来自《Erlang程序设计》16.1
这是热切换代码的简单例子...像erlang或java等的带vm动态语言的话,
随便切换运行中的代码是一件极其容易的事情。
但像c语言的这种静态语言的话只能通过动态装载so的方式来干活了。
写语言的语言,必须是可以随心欲为了...
hot_code.erl
-module(hot_code).
-export([start/2, stop/1, rpc/2, swap_code/2]).
start(Name, Mod)->
register(Name,
spawn(fun()->
loop(Name, Mod, Mod:init())
end)).
stop(Name)->
rpc(Name, {stop}).
swap_code(Name, Mod)->
rpc(Name, {swap_code, Mod}).
rpc(Name, Request)->
Name! {self(), Request},
receive
{Name, Response}->
Response
end.
loop(Name, Mod, OldState)->
receive
{From, {swap_code, NewCallBackMod}}->
From! {Name, ack},
loop(Name, NewCallBackMod, OldState);
{From, {stop}} ->
From! {Name, ack};
{From, Request} ->
{Response, NewState} = Mod:handle(Request, OldState),
From! {Name, Response},
loop(Name, Mod, NewState)
end.
name_server1
-module(name_server1).
-export([init/0, add/2, whereis/1, handle/2]).
-import(hot_code, [rpc/2]).
add(Name, Place)->
rpc(name_server, {add, Name, Place}).
whereis(Name)->
rpc(name_server, {whereis, Name}).
init()->
dict:new().
handle({add, Name, Place}, Dict)->
{ok, dict:store(Name, Place, Dict)};
handle({whereis, Name}, Dict) ->
{dict:find(Name, Dict), Dict}.
name_server3
-module(name_server3).
-export([init/0, add/2, whereis/1, handle/2, list_all/0]).
-import(hot_code, [rpc/2]).
add(Name, Place)->
rpc(name_server, {add, Name, Place}).
whereis(Name)->
rpc(name_server, {whereis, Name}).
list_all()->
rpc(name_server, {list_all}).
init()->
dict:new().
handle({add, Name, Place}, Dict)->
io:format("added ~p~n", [Name]),
{ok, dict:store(Name, Place, Dict)};
handle({whereis, Name}, Dict) ->
io:format("query ~p~n", [Name]),
{dict:find(Name, Dict), Dict};
handle({list_all}, Dict)->
io:format("list all~n"),
{dict:fetch_keys(Dict), Dict}.
Run command in erl:
c(hot_code).
c(name_server1).
hot_code:start(name_server, name_server1).
name_server1:add(joe, “usa”).
name_server1:whereis(joe).
hot_code:swap_code(name_server, name_server3).
name_server3:add(mary, “canada”).
name_server3:list_all().
hot_code 是框架, name_server1 是第一个模块...
start时把第一个版本的name_server register到name_server上,
然后正常的增查服务;
之后,有个无聊的家伙写了版本3的name_server3,多添加了一个功能,
list_all(),这时只需要命令框架swap_code一下。
这样,register到name_server上的代码模块是name_server3,
(在loop()的一次迭代后替换了...如果多个操作并发到loop()??)
然后飞机...换了引擎了。
//++++++++++++++++++++++++++++++
c/java 也可以做到这个挺逗的功能。
c语言,dyn_load so模块
framework.cpp
msg_queue q_cmd;
msg_queue q_resp;
load(const char *fname);
start(void *handle, const char *fname){
handle = load(fname);
loop(...);
}
swap_code(const char *fname){
push(q_cmd, “{swap, fname}”)
}
loop(...){
while( true){
msg = pop(q_cmd);
switch(msg){
“{swap, fname}”: handle=load(fname); push(q_resp, “ack”); break;
“{call, func_name, ...}”: ret = handle:handle(“func_name”, ...); push(q_resp, ret); break;
}
}
}
name_server1.cpp
func_a(...);
func_b(...);
handle(“func_name”, args){
switch(“func_name”){
“a”: func_a(args);
“b”: func_b(args);
}
}
Java...just like RPC, and reflect mechanism …
To Be Stupid(TBS)...
分享到:
相关推荐
CoolEdit 音频波形分析 音频格式转换
超级cool的3d引擎原代码,自从0.3版本以来商业化,卖价10000美金. 用vc和opengl(支持shader2.0)实现.支持现在流行引擎的所有cool特征.
著名的3D游戏引擎IRR的UI设计游戏界面的例子,非常COOL。
超级cool的3d游戏引擎,商业版10000美金
cooleditpro2.1出现MISSING RESAMPLE.XMF错误时,下载该文件,然后用该文件替换cool edit pro 2.1安装文件中Resample.xmf文件即可
coolboy连接交换系统
cool edit pro2.1 cool edit pro2.1
Cool Edit Pro Cool Edit Pro Cool Edit Pro Cool Edit Pro Cool Edit Pro Cool Edit Pro
CoolEdit PRO 2.0注册机 --==Cool Edit Pro 2.0 注册程序==-- Name: Peter Quistgard Serial : 200-00-37YQOQ7L
COOL SUMMER 46功能 COOL SUMMER 46功能 COOL SUMMER 46功能 全能挂!! 全能挂!! COOL SUMMER 46功能 COOL SUMMER 46功能
Cool Edit Pro2.1中文注册版(CoolEdit2.1破解版,带插件ZIP )相当强大的音频编辑处理软件!专业版带编辑插件!内附安装说明!
Cool Edit Pro是一个非常出色的音乐编辑软件和MP3制作软件,用声音来“绘”制:音调、歌曲的一部分、声音、弦乐、颤音、噪音或是调整静音。而且CoolEdit还提供有多种特效为你的作品增色,放大、降低噪音、压缩、扩展...
coolpad大神刷机流程
Cool Edit Pro 2.1汉化破解版
cool96语音编辑软件cool96语音编辑软件cool96语音编辑软件
cool edit 中文版,可以播放pcm原生音频文件,修改mp3文件的采样率通道数等,转换音频文件格式
经典的LEGO书籍《Creating Cool MINDSTORMS NXT Robots》
国外的一款超级cool的3d游戏引擎,效果及其不错 对3D游戏的编程设计有很好的借鉴作用 商业版10000美金
cooledit工具完整版含注册序列号,亲测可用。cooledit
Cool Edit PRO (功能强大的多轨录音软件)非常出色的数字音乐编辑器和MP3制作软件。不少人把Cool Edit形容为音频“绘画”程序。你可以用声音来“绘”制:音调、歌曲的一部分、声音、弦乐、颤音、噪音或是调整静音等。...