ダウンロード
Magazine
開発
アカウント
ダウンロード
Magazine
開発
ログイン
アカウント/パスワードを忘れた
アカウント作成
言語
ヘルプ
言語
ヘルプ
×
ログイン
ログイン名
パスワード
×
アカウント/パスワードを忘れた
日本語の翻訳状況
カテゴリ:
ソフトウェア
人物
PersonalForge
Magazine
Wiki
検索
OSDN
>
ソフトウェアを探す
>
テキストエディタ
>
テキスト処理
>
Anthy
>
チケット一覧/検索
>
チケット #2183
Anthy
概要
プロジェクト概要
開発ダッシュボード
Webページ
開発メンバー
画像ギャラリー
公開フィード一覧
活動
統計情報
活動履歴
ダウンロード
リリース一覧
統計
チケット
チケット一覧
マイルストーン一覧
チケットの種類一覧
コンポーネント一覧
よく使われるチケット一覧のリスト/RSS
新規チケット登録
文書
コミュニケーション
フォーラム
フォーラム一覧
ヘルプ (2)
公開討議 (14)
メーリングリスト
MLの一覧
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, ...)
あたりを使っていただけるように修正いただくと嬉しいで
す。
チケットの履歴 (8 件中 3 件表示)
古い履歴を表示
2003-05-31 11:07
更新者:
yusuke
コメント
返信
Logged In: YES
user_id=110
ということで、fcntlに変更したanthy-4130をリリースしました。
コンパイル結果だけでなく、動作についても結果を教えて
いただけるとうれしいです。
2003-06-13 18:00
更新者:
(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
更新者:
(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
更新者:
(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
更新者:
(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
更新者:
(del#1680)
コメント
返信
Logged In: YES
user_id=1680
う、errnoを0にしているコードは不要ですね。見なくしたから。
- errno = 0;
2003-06-14 09:11
更新者:
yusuke
コメント
返信
Logged In: YES
user_id=110
パッチありがとうございます。
取り込んだanthy-4213をリリースしました。
問題がないか確認していただけないでしょうか?
2003-06-15 17:20
更新者:
(del#1680)
コメント
返信
Logged In: YES
user_id=1680
4213をcygwin上でコンパイルし、cygwin上のEmacs21.2で問題なく
日本語変換できることを確認しました。
マージしてくださってありがとうございます。
添付ファイルリスト (
0
)
添付ファイルリスト
添付ファイルはありません
編集
コメントの追加
ログインしていません。
ログインしていない状態では、コメントに記載者の記録が残りません。 »
ログインする
コメントの追加
プレビュー
適用
になると嬉しいです。
ps:
コンパイルはsrc-diclib/record.cでlockf()がないと言って
怒られるようなので、
fcntl(..., F_SETLK, ...)
あたりを使っていただけるように修正いただくと嬉しいで
す。