Skip to content

Commit 41eba2d

Browse files
sirainencmouse
authored andcommitted
lib-storage: Send mail_user_session_finished via mail_user_unref()
The purpose of mail_user_deinit() is to guarantee that the user gets freed at that point - there's no requirement to call it instead of mail_user_unref(). Move the mail_user_session_finished event sending to mail_user_unref() where the rest of the deinitialization code is as well. This also fixes mail_user_session_finished event being wrongly sent in some shared mailbox failure code paths. Potentially it fixes also missing mail_user_session_finished events in some code paths.
1 parent a76aaff commit 41eba2d

File tree

1 file changed

+26
-25
lines changed

1 file changed

+26
-25
lines changed

src/lib-storage/mail-user.c

+26-25
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,30 @@ void mail_user_ref(struct mail_user *user)
228228
user->refcount++;
229229
}
230230

231+
static void mail_user_session_finished(struct mail_user *user)
232+
{
233+
struct event *ev = user->event;
234+
struct process_stat *stat = &user->proc_stat;
235+
236+
process_stat_read_finish(stat, ev);
237+
238+
struct event_passthrough *e = event_create_passthrough(ev)->
239+
set_name("mail_user_session_finished")->
240+
add_int_nonzero("utime", stat->utime)->
241+
add_int_nonzero("stime", stat->stime)->
242+
add_int_nonzero("minor_faults", stat->minor_faults)->
243+
add_int_nonzero("major_faults", stat->major_faults)->
244+
add_int_nonzero("vol_cs", stat->vol_cs)->
245+
add_int_nonzero("invol_cs", stat->invol_cs)->
246+
add_int_nonzero("rss", stat->rss)->
247+
add_int_nonzero("vsz", stat->vsz)->
248+
add_int_nonzero("rchar", stat->rchar)->
249+
add_int_nonzero("wchar", stat->wchar)->
250+
add_int_nonzero("syscr", stat->syscr)->
251+
add_int_nonzero("syscw", stat->syscw);
252+
e_debug(e->event(), "User session is finished");
253+
}
254+
231255
void mail_user_unref(struct mail_user **_user)
232256
{
233257
struct mail_user *user = *_user;
@@ -241,6 +265,8 @@ void mail_user_unref(struct mail_user **_user)
241265
}
242266

243267
user->deinitializing = TRUE;
268+
if (user->creator == NULL)
269+
mail_user_session_finished(user);
244270

245271
/* call deinit() and deinit_pre() with refcount=1, otherwise we may
246272
assert-crash in mail_user_ref() that is called by some handlers. */
@@ -255,33 +281,8 @@ void mail_user_unref(struct mail_user **_user)
255281
pool_unref(&user->pool);
256282
}
257283

258-
static void mail_user_session_finished(struct mail_user *user)
259-
{
260-
struct event *ev = user->event;
261-
struct process_stat *stat = &user->proc_stat;
262-
263-
process_stat_read_finish(stat, ev);
264-
265-
struct event_passthrough *e = event_create_passthrough(ev)->
266-
set_name("mail_user_session_finished")->
267-
add_int_nonzero("utime", stat->utime)->
268-
add_int_nonzero("stime", stat->stime)->
269-
add_int_nonzero("minor_faults", stat->minor_faults)->
270-
add_int_nonzero("major_faults", stat->major_faults)->
271-
add_int_nonzero("vol_cs", stat->vol_cs)->
272-
add_int_nonzero("invol_cs", stat->invol_cs)->
273-
add_int_nonzero("rss", stat->rss)->
274-
add_int_nonzero("vsz", stat->vsz)->
275-
add_int_nonzero("rchar", stat->rchar)->
276-
add_int_nonzero("wchar", stat->wchar)->
277-
add_int_nonzero("syscr", stat->syscr)->
278-
add_int_nonzero("syscw", stat->syscw);
279-
e_debug(e->event(), "User session is finished");
280-
}
281-
282284
void mail_user_deinit(struct mail_user **user)
283285
{
284-
mail_user_session_finished(*user);
285286
i_assert((*user)->refcount == 1);
286287
mail_user_unref(user);
287288
}

0 commit comments

Comments
 (0)