Incidencia #2183

cygwin上のemacsで使いたい
Abrir Fecha: 2003-05-27 10:52 Última actualización: 2003-06-15 17:20

Informador:
(Anónimo)
Propietario:
(Ninguno)
Estado:
Open
Componente:
(Ninguno)
Hito:
(Ninguno)
Prioridad:
5 - Medium
Gravedad:
5 - Medium
Resolución:
Ninguno
Fichero:
Ninguno

Details

cygwin上でコンパイルできて、cygwin上のemacsで使えるよう
になると嬉しいです。

ps:
コンパイルはsrc-diclib/record.cでlockf()がないと言って
怒られるようなので、
fcntl(..., F_SETLK, ...)
あたりを使っていただけるように修正いただくと嬉しいで
す。

Ticket History (3/8 Histories)

2003-05-31 11:07 Updated by: yusuke
Comentario
Logged In: YES
user_id=110

ということで、fcntlに変更したanthy-4130をリリースしました。
コンパイル結果だけでなく、動作についても結果を教えて
いただけるとうれしいです。
2003-06-13 18:00 Updated by: (del#1680)
Comentario
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)
Comentario
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)
Comentario
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)
Comentario
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)
Comentario
Logged In: YES
user_id=1680

う、errnoを0にしているコードは不要ですね。見なくしたから。

- errno = 0;
2003-06-14 09:11 Updated by: yusuke
Comentario
Logged In: YES
user_id=110

パッチありがとうございます。
取り込んだanthy-4213をリリースしました。

問題がないか確認していただけないでしょうか?
2003-06-15 17:20 Updated by: (del#1680)
Comentario
Logged In: YES
user_id=1680

4213をcygwin上でコンパイルし、cygwin上のEmacs21.2で問題なく
日本語変換できることを確認しました。

マージしてくださってありがとうございます。

Attachment File List

No attachments

Editar

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Entrar