Descargar
Desarrollar
Cuenta
Descargar
Desarrollar
Entrar
Forgot Account/Password
Crear Cuenta
Idioma
Ayuda
Idioma
Ayuda
×
Entrar
Nombre de usuario
Contraseña
×
Forgot Account/Password
Translation Status of Español
Categoría:
Software
Gente
PersonalForge
Magazine
Wiki
Buscar
OSDN
>
Buscar Software
>
Text Editors
>
Text Processing
>
Anthy
>
Ticket List/Search
>
Incidencia #2183
Anthy
Descripción
Project Summary
Developer Dashboard
Página Web
Developers
Image Gallery
List of RSS Feeds
Activity
Statistics
Historial
Descargas
List of Releases
Stats
Incidencia
Ticket List
Milestone List
Type List
Component List
List of frequently used tickets/RSS
Submit New Ticket
Documents
Communication
Foros
List of Forums
Ayuda (2)
Open Discussion (14)
Mailing Lists
list of ML
anthy-dev
anthy-event
Noticias
Incidencia #2183
Ticket List
Submit New Ticket
RSS
cygwin上のemacsで使いたい
Abrir Fecha:
2003-05-27 10:52
Última actualización:
2003-06-15 17:20
monitor
ON
OFF
Informador:
(Anónimo)
Propietario:
(Ninguno)
Tipo:
Support Request
Estado:
Open
Componente:
(Ninguno)
Hito:
(Ninguno)
Prioridad:
5 - Medium
Gravedad:
5 - Medium
Resolución:
Ninguno
Fichero:
Ninguno
Details
Responder
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
Comentario
Responder
Logged In: YES
user_id=110
ということで、fcntlに変更したanthy-4130をリリースしました。
コンパイル結果だけでなく、動作についても結果を教えて
いただけるとうれしいです。
2003-06-13 18:00
Updated by:
(del#1680)
Comentario
Responder
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
Responder
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
Responder
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
Responder
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
Responder
Logged In: YES
user_id=1680
う、errnoを0にしているコードは不要ですね。見なくしたから。
- errno = 0;
2003-06-14 09:11
Updated by:
yusuke
Comentario
Responder
Logged In: YES
user_id=110
パッチありがとうございます。
取り込んだanthy-4213をリリースしました。
問題がないか確認していただけないでしょうか?
2003-06-15 17:20
Updated by:
(del#1680)
Comentario
Responder
Logged In: YES
user_id=1680
4213をcygwin上でコンパイルし、cygwin上のEmacs21.2で問題なく
日本語変換できることを確認しました。
マージしてくださってありがとうございます。
Attachment File List (
0
)
Attachment File List
No attachments
Editar
Add Comment
You are not logged in.
I you are not logged in, your comment will be treated as an anonymous post. »
Entrar
Add Comment
Vista previa
Submit
になると嬉しいです。
ps:
コンパイルはsrc-diclib/record.cでlockf()がないと言って
怒られるようなので、
fcntl(..., F_SETLK, ...)
あたりを使っていただけるように修正いただくと嬉しいで
す。