忍者ブログ
ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
[618]  [617]  [616]  [614]  [613]  [612]  [611]  [610]  [609]  [608]  [607
どうも一部のソフトウェアでOilのCORBA通信が上手くいかないことがあるらしい。
ネームサーバーへの登録などクライアント側で動作する分には問題ないのですが、サーバー側で動作しているときにクライアントから操作しようとした瞬間に落ちます。

調べてみた結果、Oilの使用しているLOOPライブラリのCoSocket.luaの以下の部分で落ちていることが分かりました。






function select(self, recvt, sendt, timeout) 

・・・・・

local readok, writeok, errmsg = scheduler.select(recvt, sendt, 0)

・・・・

readok[#readok+1] = wrapper






どうやら、scheduler.select関数でLuaSocketライブラリのselect関数が呼ばれているらしく、このselect関数で取得したテーブルに上みたいに要素を追加しようとすると途端に落ちます。


落ちるコードの簡単な例は以下の通りなので、今後Oil、というかLOOPを使う予定のある人は試してみてください。






local socket = require( "socket" )

local server = socket.bind("localhost", 2810)
local servers = {server}
local readok = socket.select(servers, nil, 0)
readok[1] = 100






ちなみに、以下のような感じでテーブルをコピーしてから処理すると何も問題は起こらないので、場合によってはLOOPライブラリの修正が必要です。



local readok, writeok, errmsg = scheduler.select(recvt, sendt, 0)
readok = {unpack(readok)}
writeok = {unpack(writeok)}



OilもLOOPも2008年ごろから開発が止まっているみたいなので、不具合があったら自分で何とかするしかありません。





正直これの原因究明はかなりきつかったと思います。
エラーが出るならともかく、突然落ちる理由が見当もつかず、調べるのに1週間近くかかりました。

おそらくですが、この修正をする事で20以上のソフトウェア上にOilを使用したLuaスクリプトを組み込むことができるようなります。
つまりLua版RTミドルウェアも動作できます。




まあ問題はLua版RTミドルウェアの中身が全く実装できていない事ですけど、気が向いたら作業はするかもしれないですし、飽きたらやめるかもしれません。












にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
カレンダー
06 2018/07 08
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
フリーエリア
最新CM
[08/24 Nobu]
[08/24 puku]
[08/22 Nobu]
[08/22 puku]
[04/17 Nobu]
プロフィール
HN:
Nobu
年齢:
29
性別:
男性
誕生日:
1988/09/22
職業:
あれ
趣味:
妄想、自堕落
バーコード
ブログ内検索
P R
カウンター
忍者ブログ [PR]