다운로드
소프트웨어 개발
계정
다운로드
소프트웨어 개발
Login
Forgot Account/Password
계정 만들기
언어
도움
언어
도움
×
Login
Login Name
Password
×
Forgot Account/Password
Translation Status of 한국말
Category:
Software
People
PersonalForge
Magazine
Wiki
검색
OSDN
>
브라 우즈 소프트웨어
>
Text Editors
>
Text Processing
>
Anthy
>
Ticket List/Search
>
Ticket #2183
Anthy
Description
Project Summary
Developer Dashboard
웹 페이지
Developers
Image Gallery
List of RSS Feeds
Activity
Statistics
History
다운로드
List of Releases
Stats
티켓
Ticket List
Milestone List
Type List
Component List
List of frequently used tickets/RSS
Submit New Ticket
Documents
Communication
포럼
List of Forums
도움 (2)
Open Discussion (14)
Mailing Lists
list of ML
anthy-dev
anthy-event
News
Ticket #2183
Ticket List
Submit New Ticket
RSS
cygwin上のemacsで使いたい
오픈 날짜:
2003-05-27 10:52
마지막 업데이트:
2003-06-15 17:20
monitor
ON
OFF
Reporter:
(Anonymous)
소유자:
(None)
Type:
Support Request
Status:
Open
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
None
Details
Reply
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
댓글 올리기
Reply
Logged In: YES
user_id=110
ということで、fcntlに変更したanthy-4130をリリースしました。
コンパイル結果だけでなく、動作についても結果を教えて
いただけるとうれしいです。
2003-06-13 18:00
Updated by:
(del#1680)
댓글 올리기
Reply
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)
댓글 올리기
Reply
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)
댓글 올리기
Reply
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)
댓글 올리기
Reply
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)
댓글 올리기
Reply
Logged In: YES
user_id=1680
う、errnoを0にしているコードは不要ですね。見なくしたから。
- errno = 0;
2003-06-14 09:11
Updated by:
yusuke
댓글 올리기
Reply
Logged In: YES
user_id=110
パッチありがとうございます。
取り込んだanthy-4213をリリースしました。
問題がないか確認していただけないでしょうか?
2003-06-15 17:20
Updated by:
(del#1680)
댓글 올리기
Reply
Logged In: YES
user_id=1680
4213をcygwin上でコンパイルし、cygwin上のEmacs21.2で問題なく
日本語変換できることを確認しました。
マージしてくださってありがとうございます。
Attachment File List (
0
)
Attachment File List
No attachments
Edit
Add Comment
You are not logged in.
I you are not logged in, your comment will be treated as an anonymous post. »
Login
Add Comment
Preview
Submit
になると嬉しいです。
ps:
コンパイルはsrc-diclib/record.cでlockf()がないと言って
怒られるようなので、
fcntl(..., F_SETLK, ...)
あたりを使っていただけるように修正いただくと嬉しいで
す。