summaryrefslogtreecommitdiff
path: root/doc/FAQ.ja
blob: 1d65f9fb62753668353969fd76734381ad8cd543 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
FAQ    2007/07/23

1. 最長マッチ

   onig_new()の中で、ONIG_OPTION_FIND_LONGESTオプション
   を使用すれば最長マッチになる。


2. スレッドセーフ

   スレッドセーフにするには、以下の(A)と(B)のどちらかを行なえば
   よい。

   (A) Oniguruma Layer

       oniguruma/regint.hの中の以下のマクロを定義する。

       USE_MULTI_THREAD_SYSTEM
       THREAD_ATOMIC_START
       THREAD_ATOMIC_END
       THREAD_PASS

       何らかの初期化/終了処理が必要であれば、以下のマクロに定義する。
       THREAD_SYSTEM_INIT
       THREAD_SYSTEM_END


   (B) Application Layer

       同時に複数のスレッドが、正規表現オブジェクトを作成する、
       または解放する、ことを行なってはならない。
       それらのオブジェクトが全く別のものであっても。

   もう少し詳しい説明は、このドキュメントの中の
   "スレッドセーフに関する補足"に書いておいた。


3. CR + LF

   DOSの改行(CR(0x0c) + LF(0x0a)の連続)

   regenc.hの中の、以下の部分を有効にする。

     /* #define USE_CRNL_AS_LINE_TERMINATOR */


4. メーリングリスト

   鬼車に関するメーリングリストは存在しない。

//END



スレッドセーフに関する補足

スレッドセーフにするには、個別のアプリケーションの中で行うか、
Onigurumaライブラリの中で行うか、どちらかを選ぶことができます。
(Onigurumaを使用する側で対処するか、Onigurumaに対処させるか
どちらか片方で行う必要があるということです。)

これらの方法について、以下(A)と(B)で説明します。

マルチスレッドAPIは、それぞれのプラットフォームによっても
異なりますので、以下の説明の中で具体的に何を呼ぶのかを
書くことは無理です。実際に使用されるマルチスレッドAPIで、
対応する機能のものを指定してください。

(A) Onigurumaの中で対応する場合

oniguruma/regint.hの中で以下のマクロを定義して再コンパイルしてください。

USE_MULTI_THREAD_SYSTEM

  単に有効にすればよいです。

THREAD_ATOMIC_START
THREAD_ATOMIC_END

  THREAD_ATOMIC_STARTからTHREAD_ATOMIC_ENDで囲まれた
  プログラムのコード部分をあるスレッドが実行中に、他の
  スレッドに実行権が移動しないことを保障するものに定義
  してください。
  (名前の通り、囲まれたコード部分をスレッドアトミックに
   するという意味)

THREAD_PASS

  これを実行したスレッドから、他のスレッドに実行権を委譲
  するものに定義をしてください。(再スケジュールを呼び出す
  という意味)
  対応する機能が全くなければ、空定義にしてください。

(参考例)
Rubyの場合を例にすると、
Rubyは自分自身で独自のスレッド機能を実装しています。
その機能を使用すると、以下のように定義すればよいことに
なります。

#define USE_MULTI_THREAD_SYSTEM
#define THREAD_SYSTEM_INIT
#define THREAD_SYSTEM_END
#define THREAD_ATOMIC_START       DEFER_INTS
#define THREAD_ATOMIC_END         ENABLE_INTS
#define THREAD_PASS               rb_thread_schedule()

Rubyの場合、タイマ割り込みを使用して、スレッドの切り替えを
行っています。DEFER_INTSは割り込みハンドラの実行を一時的に
止めるためのマクロです。ENABLE_INTSマクロで割り込みハンドラ
の実行を許可します。
これによって、THREAD_ATOMIC_STARTからTHREAD_ATOMIC_END
で囲まれた部分の実行中に、他のスレッドに実行権が移動しません。


(B) アプリケーションの中で対応する場合

以下を保障するように、スレッドの実行を制御してください。

同時に複数のスレッドが、正規表現オブジェクトを作成する、または解放する、ことを
行なってはならない。それらのオブジェクトが全く別のものであっても。

onig_new(), onig_new_deluxe(), onig_free()のどれかの呼び出しを、
複数のスレッドが同時に実行することを避けてください。同時でなければ別にかまいません。

これは何故必要なのかというと、正規表現オブジェクトを作成する
過程で、内部で共通に参照するテーブルがあります。
このテーブルに対してのデータ登録処理が複数のスレッドで衝突して
異常な状態にならないために必要です。

// END