~ubuntu-branches/ubuntu/lucid/erlang/lucid-proposed

« back to all changes in this revision

Viewing changes to lib/megaco/src/flex/megaco_flex_scanner.erl

  • Committer: Bazaar Package Importer
  • Author(s): Sergei Golovan
  • Date: 2009-06-11 12:18:07 UTC
  • mfrom: (1.2.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090611121807-ks7eb4xrt7dsysgx
Tags: 1:13.b.1-dfsg-1
* New upstream release.
* Removed unnecessary dependency of erlang-os-mon on erlang-observer and
  erlang-tools and added missing dependency of erlang-nox on erlang-os-mon
  (closes: #529512).
* Removed a patch to eunit application because the bug was fixed upstream.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 
24
24
-module(megaco_flex_scanner).
25
25
 
26
 
-export([start/0, stop/1, scan/2]).
 
26
-export([is_enabled/0, is_reentrant_enabled/0, is_scanner_port/2]).
 
27
-export([start/0, start/1, stop/1, scan/2]).
 
28
 
 
29
-define(NUM_SCHED(),           erlang:system_info(schedulers)).
 
30
-define(SCHED_ID(),            erlang:system_info(scheduler_id)).
 
31
-define(SMP_SUPPORT_DEFAULT(), erlang:system_info(smp_support)).
 
32
 
 
33
is_enabled() ->
 
34
    case ?ENABLE_MEGACO_FLEX_SCANNER of
 
35
        true ->
 
36
            true;
 
37
        _ ->
 
38
            false
 
39
    end.
 
40
    
 
41
is_reentrant_enabled() ->
 
42
    case ?MEGACO_REENTRANT_FLEX_SCANNER of
 
43
        true ->
 
44
            true;
 
45
        _ ->
 
46
            false
 
47
    end.
 
48
 
 
49
is_scanner_port(Port, Port) when is_port(Port) ->
 
50
    true;
 
51
is_scanner_port(Port, Ports) when is_tuple(Ports) ->
 
52
    is_own_port(Port, Ports);
 
53
is_scanner_port(_, _) ->
 
54
    false.
 
55
 
 
56
is_own_port(Port, Ports) ->
 
57
    is_own_port(Port, size(Ports), Ports).
 
58
 
 
59
is_own_port(_Port, 0, _Ports) ->
 
60
    false;
 
61
is_own_port(Port, N, Ports) when (N > 0) ->
 
62
    case element(N, Ports) of
 
63
        Port ->
 
64
            true;
 
65
        _ ->
 
66
            is_own_port(Port, N-1, Ports)
 
67
    end.
 
68
 
 
69
            
 
70
%%----------------------------------------------------------------------
 
71
%% Start the flex scanner
 
72
%%----------------------------------------------------------------------
27
73
 
28
74
start() ->
29
 
    (catch do_start()).
30
 
 
31
 
 
32
 
do_start() ->
 
75
    start(?SMP_SUPPORT_DEFAULT()).
 
76
 
 
77
start(SMP) when ((SMP =:= true) orelse (SMP =:= false)) ->
 
78
    (catch do_start(is_reentrant_enabled() andalso SMP)).
 
79
 
 
80
do_start(SMP) ->
33
81
    Path = lib_dir(),
34
82
    erl_ddll:start(), 
35
83
    load_driver(Path),
36
 
    Port = open_drv_port(),
37
 
    {ok, Port}.
 
84
    PortOrPorts = open_drv_port(SMP),
 
85
    {ok, PortOrPorts}.
38
86
 
39
87
 
40
88
lib_dir() ->
41
89
    case code:priv_dir(megaco) of
42
90
        {error, Reason} ->
43
91
            throw({error, {priv_dir, Reason}});
44
 
        P when list(P) ->
 
92
        P when is_list(P) ->
45
93
            P ++ "/lib"
46
94
    end.
47
95
    
60
108
    end.
61
109
 
62
110
 
 
111
open_drv_port(true) ->
 
112
    open_drv_ports(?NUM_SCHED(), []);
 
113
open_drv_port(_) ->
 
114
    open_drv_port().
 
115
 
 
116
open_drv_ports(0, Acc) ->
 
117
    list_to_tuple(Acc);
 
118
open_drv_ports(N, Acc) when is_integer(N) andalso (N > 0) ->
 
119
    Port = open_drv_port(),
 
120
    open_drv_ports(N-1, [Port | Acc]).
 
121
 
63
122
open_drv_port() ->
64
123
    case (catch erlang:open_port({spawn, drv_name()}, [binary])) of
65
 
        Port when port(Port) ->
 
124
        Port when is_port(Port) ->
66
125
            Port;
67
126
        {'EXIT', Reason} ->
68
127
            erl_ddll:unload_driver(drv_name()),
77
136
            "megaco_flex_scanner_drv"
78
137
    end.
79
138
 
80
 
stop(Port) ->
 
139
 
 
140
%%----------------------------------------------------------------------
 
141
%% Stop the flex scanner
 
142
%%----------------------------------------------------------------------
 
143
 
 
144
stop(Port) when is_port(Port) ->
81
145
    erlang:port_close(Port), 
82
146
    erl_ddll:unload_driver(drv_name()),
 
147
    stopped;
 
148
stop(Ports) when is_tuple(Ports) ->
 
149
    stop(tuple_to_list(Ports));
 
150
stop(Ports) when is_list(Ports) ->
 
151
    lists:foreach(fun(Port) ->  erlang:port_close(Port) end, Ports),
 
152
    erl_ddll:unload_driver(drv_name()),
83
153
    stopped.
84
154
 
85
155
 
86
 
scan(Binary, Port) ->
 
156
%%----------------------------------------------------------------------
 
157
%% Scan a message
 
158
%%----------------------------------------------------------------------
 
159
 
 
160
scan(Binary, Port) when is_port(Port) ->
 
161
    do_scan(Binary, Port);
 
162
scan(Binary, Ports) when is_tuple(Ports) ->
 
163
%%     p("scan -> entry with"
 
164
%%       "~n   Ports: ~p", [Ports]),
 
165
    do_scan(Binary, select_port(Ports)).
 
166
 
 
167
do_scan(Binary, Port) ->
 
168
%%     p("do_scan -> entry with"
 
169
%%       "~n   Port: ~p", [Port]),
87
170
    case erlang:port_control(Port, $s, Binary) of
88
171
        [] ->
89
172
            receive
90
173
                {tokens, Tokens, LatestLine} ->
 
174
%%                  p("do_scan -> OK with:"
 
175
%%                    "~n   length(Tokens): ~p"
 
176
%%                    "~n   LatestLine:     ~p", [length(Tokens), LatestLine]),
91
177
                    Vsn = version(Tokens),
92
178
                    {ok, Tokens, Vsn, LatestLine} 
93
 
            after 0 ->
 
179
            after 5000 ->
 
180
%%                  p("do_scan -> ERROR", []),
94
181
                    {error, "Driver term send failure", 1}
95
182
            end;
96
183
        Reason ->
 
184
%%          p("do_scan -> port control failed: "
 
185
%%            "~n   Reason: ~p", [Reason]),
97
186
            {error, Reason, 1}
98
187
    end.
99
188
 
 
189
select_port(Ports) ->
 
190
    SchedId = ?SCHED_ID(),
 
191
    %% lists:nth(SchedId, Ports).
 
192
    element(SchedId, Ports).
100
193
 
101
194
version([]) ->
102
195
    99; % Let the parser deal with this
132
225
guess_version(_) ->
133
226
    99. % Let the parser deal with this
134
227
 
 
228
 
 
229
%% p(F, A) ->
 
230
%%     io:format("~w [~p,~p] " ++ F ++ "~n", [?MODULE, self(), ?SCHED_ID() | A]).