下載
軟體開發
帳戶
下載
軟體開發
登入
我忘記帳戶名和密碼了
新增帳戶
語言
手冊
語言
手冊
×
登入
登入名稱
密碼
×
我忘記帳戶名和密碼了
繁體中文翻譯狀態
類別:
軟體
人
PersonalForge
Magazine
Wiki
搜尋
OSDN
>
軟體搜索
>
Text Editors
>
Text Processing
>
Anthy
>
Ticket List/Search
>
待辦事項 #2183
Anthy
描述
專案概要
開發人員儀表板
專案的網頁
Developers
Image Gallery
List of RSS Feeds
活動
使用統計
歷史
檔案下載
發布列表
Stats
待辦事項
待辦事項列表
里程碑列表
類型列表
元件列表
List of frequently used tickets/RSS
新增待辦事項
文檔
溝通
討論區
討論區列表
幫助論壇 (2)
公開討論 (14)
通信論壇
通信論壇列表
anthy-dev
anthy-event
新聞
待辦事項 #2183
待辦事項列表
新增待辦事項
RSS
cygwin上のemacsで使いたい
啟用日期:
2003-05-27 10:52
最後更新:
2003-06-15 17:20
監視
ON
OFF
回報者:
(匿名)
負責人:
(無)
類型:
支援請求
狀態:
開啟
元件:
(無)
里程碑:
(無)
優先權:
5 - 中
嚴重程度:
5 - 中
處理結果:
無
檔案:
無
細節
回覆
cygwin上でコンパイルできて、cygwin上のemacsで使えるよう
になると嬉しいです。
ps:
コンパイルはsrc-diclib/record.cでlockf()がないと言って
怒られるようなので、
fcntl(..., F_SETLK, ...)
あたりを使っていただけるように修正いただくと嬉しいで
す。
Ticket History (3/8 Histories)
Show older Histories
2003-05-31 11:07
Updated by:
yusuke
評語
回覆
Logged In: YES
user_id=110
ということで、fcntlに変更したanthy-4130をリリースしました。
コンパイル結果だけでなく、動作についても結果を教えて
いただけるとうれしいです。
2003-06-13 18:00
Updated by:
(del#1680)
評語
回覆
Logged In: YES
user_id=1680
対応ありがとうございます。
コンパイルは成功し、インストールが出来るようになりました。
しかし、変換(スペースキーを押した)時に固まってしまい、
Emacsまるごと操作不能に陥ってしまいます。
具体的には、C-\で起動し、<Anthy: あ>と表示された状態で
「きょう」と入力すると、Emacs上に「きょう」と表示されます。
しかし、スペースキーを押すとそのままEmacsが無反応となり固ま
ってしまうのです。
cygwin上のEmacsのバージョンは21.2.1。anthyは4210で確認しまし
た。もし、何か調査する必要があれば試しますので、必要な調査方
法を教えてくださいませ。
もしかしたら、デッドロックかなぁ・・。
2003-06-13 18:11
Updated by:
(del#1680)
評語
回覆
Logged In: YES
user_id=1680
src-diclib/record.cでfcntl()を呼び出しているところをコメント
アウトしたら、変換できるようになりました。
cygwinではロックがうまく動作しないのかもしれません。
↓こんな感じに修正し、コンパイルしました。
again:
/*
if (!fcntl(...) {
}
*/
goto again;で無限ループになっているのか、それとも
fcntl()が制御を返していないのか、今から見てみます。
2003-06-13 20:37
Updated by:
(del#1680)
評語
回覆
Logged In: YES
user_id=1680
fcntl()で、ハマっていました。
どうやら、fcntl()に渡すファイルと同じファイルが別のルーチン
でfopen()されていることに問題があるようです。
つまり、ロックのためにrs->journal_fnをopen()しようとしている
ことに問題があり、別のファイル名でopen()してfnctl()すること
で正常に動作するようです。また、fcntl()の使い方にも問題があ
るようなので修正しています。さらに、goto again; の前にちょっ
とだけスリープしてあげるようにもしています。
以下、record.cへのパッチです。
cygwin上のemacs(21.2)とlinux上のemacs(21.3)で
動作確認をしています。この修正で私はcygwin上で
anthyによる日本語入力が可能になり幸せになりました。
複数スレッドからなどの厳密な動作確認はしていないので、
参考までに・・・。
--- record.c.org 2003-06-13 20:14:31.000000000 +0900
+++ record.c 2003-06-13 20:23:42.000000000 +0900
@@ -16,6 +16,7 @@
* ファイルへの読み書きは行わない.
*/
#include <sys/types.h>
+#include <sys/time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
@@ -117,6 +118,7 @@
const char *id; /* パーソナリティのid */
char *base_fn; /* 基本ファイル 絶対パス */
char *journal_fn; /* 差分ファイル 絶対パス */
+ char *lock_fn; /* ロックファイル 絶対パス */
/**/
time_t base_timestamp; /* 基本ファイルのタイムスタンプ */
int lock_fd; /* 差分ファイルロック用のファイルディス
クリプタ */
@@ -1624,17 +1626,30 @@
static void
lock_record (struct record_stat* rs)
{
- rs->lock_fd = open(rs->journal_fn, O_CREAT|O_RDWR,
S_IREAD|S_IWRITE);
+ rs->lock_fd = open(rs->lock_fn, O_CREAT|O_RDWR,
S_IREAD|S_IWRITE);
if (rs->lock_fd == -1) {
return ;
}
again:
- if (!fcntl(rs->lock_fd, F_SETLKW, F_WRLCK)) {
- if (errno == EINTR) {
- goto again;
- }
- close(rs->lock_fd);
- rs->lock_fd = -1;
+ {
+ struct flock lck;
+ lck.l_type = F_WRLCK;
+ lck.l_whence = (short) 0;
+ lck.l_start = (off_t) 0;
+ lck.l_len = (off_t) 1;
+ errno = 0;
+ if (fcntl(rs->lock_fd, F_SETLK, &lck) == -1) {
+ if (errno == EACCES || errno == EAGAIN) {
+ struct timeval tv;
+ tv.tv_sec = 0;
+ tv.tv_usec = 50 * 1000;
+ select(0, NULL, NULL, NULL, &tv);
+ goto again;
+ }
+ close(rs->lock_fd);
+ rs->lock_fd = -1;
+ return;
+ }
}
}
@@ -1852,6 +1867,7 @@
if (rst->id) {
free(rst->base_fn);
free(rst->journal_fn);
+ free(rst->lock_fn);
}
trie_remove_all(&rst->xstrs, &dummy, &dummy);
}
@@ -1906,6 +1922,10 @@
strlen("/.anthy/last-record2_") +
strlen(id) + 1);
sprintf(rst->journal_fn, "%s/.anthy/last-record2_%s",
home, id);
+ rst->lock_fn = (char*) malloc(strlen(home) +
+ strlen("/.anthy/lock-record_") +
+ strlen(id) + 1);
+ sprintf(rst->lock_fn, "%s/.anthy/lock-record_%s", home, id);
rst->lock_fd = -1;
rst->last_update = 0;
2003-06-13 20:49
Updated by:
(del#1680)
評語
回覆
Logged In: YES
user_id=1680
あ、select()なんぞ使わずにF_SETLKWを使ったほうがスマートですね。
というわけで、こんな感じでいかがでしょうか?
※ なんどもpostしてごめんなさい。
--- record.c.org 2003-06-13 20:14:31.000000000 +0900
+++ record.c 2003-06-13 20:47:58.000000000 +0900
@@ -117,6 +117,7 @@
const char *id; /* パーソナリティのid */
char *base_fn; /* 基本ファイル 絶対パス */
char *journal_fn; /* 差分ファイル 絶対パス */
+ char *lock_fn; /* ロックファイル 絶対パス */
/**/
time_t base_timestamp; /* 基本ファイルのタイムスタンプ */
int lock_fd; /* 差分ファイルロック用のファイルディス
クリプタ */
@@ -1624,17 +1625,23 @@
static void
lock_record (struct record_stat* rs)
{
- rs->lock_fd = open(rs->journal_fn, O_CREAT|O_RDWR,
S_IREAD|S_IWRITE);
+ rs->lock_fd = open(rs->lock_fn, O_CREAT|O_RDWR,
S_IREAD|S_IWRITE);
if (rs->lock_fd == -1) {
return ;
}
- again:
- if (!fcntl(rs->lock_fd, F_SETLKW, F_WRLCK)) {
- if (errno == EINTR) {
- goto again;
- }
- close(rs->lock_fd);
- rs->lock_fd = -1;
+
+ {
+ struct flock lck;
+ lck.l_type = F_WRLCK;
+ lck.l_whence = (short) 0;
+ lck.l_start = (off_t) 0;
+ lck.l_len = (off_t) 1;
+ errno = 0;
+ if (fcntl(rs->lock_fd, F_SETLKW, &lck) == -1) {
+ close(rs->lock_fd);
+ rs->lock_fd = -1;
+ return;
+ }
}
}
@@ -1852,6 +1859,7 @@
if (rst->id) {
free(rst->base_fn);
free(rst->journal_fn);
+ free(rst->lock_fn);
}
trie_remove_all(&rst->xstrs, &dummy, &dummy);
}
@@ -1906,6 +1914,10 @@
strlen("/.anthy/last-record2_") +
strlen(id) + 1);
sprintf(rst->journal_fn, "%s/.anthy/last-record2_%s",
home, id);
+ rst->lock_fn = (char*) malloc(strlen(home) +
+ strlen("/.anthy/lock-record_") +
+ strlen(id) + 1);
+ sprintf(rst->lock_fn, "%s/.anthy/lock-record_%s", home, id);
rst->lock_fd = -1;
rst->last_update = 0;
2003-06-13 21:46
Updated by:
(del#1680)
評語
回覆
Logged In: YES
user_id=1680
う、errnoを0にしているコードは不要ですね。見なくしたから。
- errno = 0;
2003-06-14 09:11
Updated by:
yusuke
評語
回覆
Logged In: YES
user_id=110
パッチありがとうございます。
取り込んだanthy-4213をリリースしました。
問題がないか確認していただけないでしょうか?
2003-06-15 17:20
Updated by:
(del#1680)
評語
回覆
Logged In: YES
user_id=1680
4213をcygwin上でコンパイルし、cygwin上のEmacs21.2で問題なく
日本語変換できることを確認しました。
マージしてくださってありがとうございます。
Attachment File List (
0
)
Attachment File List
No attachments
編輯
新增評語
You are not logged in.
I you are not logged in, your comment will be treated as an anonymous post. »
登入
新增評語
預覽
提交
になると嬉しいです。
ps:
コンパイルはsrc-diclib/record.cでlockf()がないと言って
怒られるようなので、
fcntl(..., F_SETLK, ...)
あたりを使っていただけるように修正いただくと嬉しいで
す。