~ubuntu-branches/ubuntu/utopic/ejabberd/utopic

« back to all changes in this revision

Viewing changes to src/pg2_backport.erl

  • Committer: Package Import Robot
  • Author(s): Gerfried Fuchs, Konstantin Khomoutov, Gerfried Fuchs
  • Date: 2011-09-11 16:16:55 UTC
  • mfrom: (1.1.18 upstream)
  • Revision ID: package-import@ubuntu.com-20110911161655-rz3jall453jo3zek
Tags: 2.1.8-1
[ Konstantin Khomoutov ]
* New upstream release.
* Remove patch fixing DSA-2248-1 (CVE-2011-1753)
  as the fix is now integrated upstream.
* Drop patches from OLPC project implementing @recent@ and @online@
  shared roster groups; support for @online@ is now intergated upstream.
* Add patch fixing version string where applicable (EJAB-1484).
* Bump standards version to 3.9.2

[ Gerfried Fuchs ]
* Add recommended targets build-arch and build-indep to debian/rules.
* Fix spelling error in manpage noticed by lintian.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
%%
2
2
%% %CopyrightBegin%
3
3
%%
4
 
%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
 
4
%% Copyright Ericsson AB 1997-2011. All Rights Reserved.
5
5
%%
6
6
%% The contents of this file are subject to the Erlang Public License,
7
7
%% Version 1.1, (the "License"); you may not use this file except in
30
30
%%% Exported functions
31
31
%%%
32
32
 
33
 
%-spec start_link() -> {'ok', pid()} | {'error', term()}.
34
 
 
35
33
start_link() ->
36
34
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
37
35
 
38
 
%-spec start() -> {'ok', pid()} | {'error', term()}.
39
 
 
40
36
start() ->
41
37
    ensure_started().
42
38
 
43
 
%-spec create(term()) -> 'ok'.
44
 
 
45
39
create(Name) ->
46
40
    ensure_started(),
47
41
    case ets:member(pg2_table, {group, Name}) of
55
49
            ok
56
50
    end.
57
51
 
58
 
%-type name() :: term().
59
 
 
60
 
%-spec delete(name()) -> 'ok'.
61
 
 
62
52
delete(Name) ->
63
53
    ensure_started(),
64
54
    global:trans({{?MODULE, Name}, self()},
67
57
                 end),
68
58
    ok.
69
59
 
70
 
%-spec join(name(), pid()) -> 'ok' | {'error', {'no_such_group', term()}}.
71
 
 
72
60
join(Name, Pid) when is_pid(Pid) ->
73
61
    ensure_started(),
74
62
    case ets:member(pg2_table, {group, Name}) of
83
71
            ok
84
72
    end.
85
73
 
86
 
%-spec leave(name(), pid()) -> 'ok' | {'error', {'no_such_group', name()}}.
87
 
 
88
74
leave(Name, Pid) when is_pid(Pid) ->
89
75
    ensure_started(),
90
76
    case ets:member(pg2_table, {group, Name}) of
99
85
            ok
100
86
    end.
101
87
 
102
 
%-type get_members_ret() :: [pid()] | {'error', {'no_such_group', name()}}.
103
 
 
104
 
%-spec get_members(name()) -> get_members_ret().
105
 
   
106
88
get_members(Name) ->
107
89
    ensure_started(),
108
90
    case ets:member(pg2_table, {group, Name}) of
112
94
            {error, {no_such_group, Name}}
113
95
    end.
114
96
 
115
 
%-spec get_local_members(name()) -> get_members_ret().
116
 
 
117
97
get_local_members(Name) ->
118
98
    ensure_started(),
119
99
    case ets:member(pg2_table, {group, Name}) of
123
103
            {error, {no_such_group, Name}}
124
104
    end.
125
105
 
126
 
%-spec which_groups() -> [name()].
127
 
 
128
106
which_groups() ->
129
107
    ensure_started(),
130
108
    all_groups().
131
109
 
132
 
%-type gcp_error_reason() :: {'no_process', term()} | {'no_such_group', term()}.
133
 
 
134
 
%-spec get_closest_pid(term()) -> pid() | {'error', gcp_error_reason()}.
135
 
 
136
110
get_closest_pid(Name) ->
137
111
    case get_local_members(Name) of
138
112
        [Pid] ->
157
131
 
158
132
-record(state, {}).
159
133
 
160
 
%-spec init([]) -> {'ok', #state{}}.
161
 
 
162
134
init([]) ->
163
135
    Ns = nodes(),
164
136
    net_kernel:monitor_nodes(true),
169
141
    pg2_table = ets:new(pg2_table, [ordered_set, protected, named_table]),
170
142
    {ok, #state{}}.
171
143
 
172
 
%-type call() :: {'create', name()}
173
 
%              | {'delete', name()}
174
 
%              | {'join', name(), pid()}
175
 
%              | {'leave', name(), pid()}.
176
 
 
177
 
%-spec handle_call(call(), _, #state{}) -> 
178
 
%        {'reply', 'ok', #state{}}.
179
 
 
180
144
handle_call({create, Name}, _From, S) ->
181
145
    assure_group(Name),
182
146
    {reply, ok, S};
195
159
                             [Request, From]),
196
160
    {noreply, S}.
197
161
 
198
 
%-type all_members() :: [[name(),...]].
199
 
%-type cast() :: {'exchange', node(), all_members()}
200
 
%              | {'del_member', name(), pid()}.
201
 
 
202
 
%-spec handle_cast(cast(), #state{}) -> {'noreply', #state{}}.
203
 
 
204
162
handle_cast({exchange, _Node, List}, S) ->
205
163
    store(List),
206
164
    {noreply, S};
208
166
    %% Ignore {del_member, Name, Pid}.
209
167
    {noreply, S}.
210
168
 
211
 
%-spec handle_info(tuple(), #state{}) -> {'noreply', #state{}}.
212
 
 
213
169
handle_info({'DOWN', MonitorRef, process, _Pid, _Info}, S) ->
214
170
    member_died(MonitorRef),
215
171
    {noreply, S};
222
178
handle_info(_, S) ->
223
179
    {noreply, S}.
224
180
 
225
 
%-spec terminate(term(), #state{}) -> 'ok'.
226
 
 
227
181
terminate(_Reason, _S) ->
228
182
    true = ets:delete(pg2_table),
229
183
    ok.
253
207
store(List) ->
254
208
    _ = [(assure_group(Name)
255
209
          andalso
256
 
          [join_group(Name, P) || P <- Members -- group_members(Name)]) ||
 
210
          store2(Name, Members)) ||
257
211
            [Name, Members] <- List],
258
212
    ok.
 
213
store2(Name, Members) ->
 
214
    [join_group(Name, P) || P <- Members -- group_members(Name)],
 
215
    true.
259
216
 
260
217
assure_group(Name) ->
261
218
    Key = {group, Name},
289
246
    try _ = ets:update_counter(pg2_table, Member_Name_Pid, {2, +1})
290
247
    catch _:_ ->
291
248
            true = ets:insert(pg2_table, {Member_Name_Pid, 1}),
292
 
            _ = [ets:insert(pg2_table, {{local_member, Name, Pid}}) ||
 
249
            _ = [ets:insert(pg2_table, {{local_member, Name, PidX}}) ||
293
250
                    PidX <- [Pid],
294
251
                    node(PidX) =:= node()],
295
252
            true = ets:insert(pg2_table, {{pid, Pid, Name}})
302
259
            if 
303
260
                N =:= 0 ->
304
261
                    true = ets:delete(pg2_table, {pid, Pid, Name}),
305
 
                    _ = [ets:delete(pg2_table, {local_member, Name, Pid}) ||
 
262
                    _ = [ets:delete(pg2_table, {local_member, Name, PidX}) ||
306
263
                            PidX <- [Pid],
307
264
                            node(PidX) =:= node()],
308
265
                    true = ets:delete(pg2_table, Member_Name_Pid);