[asterisk-commits] file: trunk r43827 - /trunk/apps/app_voicemail.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Wed Sep 27 14:39:13 MST 2006
Author: file
Date: Wed Sep 27 16:39:12 2006
New Revision: 43827
URL: http://svn.digium.com/view/asterisk?rev=43827&view=rev
Log:
Do the directory walk dance instead of repeated stat calls as it seems to be faster (issue #7507 reported by Corydon76)
Modified:
trunk/apps/app_voicemail.c
Modified: trunk/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_voicemail.c?rev=43827&r1=43826&r2=43827&view=diff
==============================================================================
--- trunk/apps/app_voicemail.c (original)
+++ trunk/apps/app_voicemail.c Wed Sep 27 16:39:12 2006
@@ -1625,14 +1625,27 @@
static int last_message_index(struct ast_vm_user *vmu, char *dir)
{
int x;
- char fn[256];
+ unsigned char map[MAXMSGLIMIT] = "";
+ DIR *msgdir;
+ struct dirent *msgdirent;
+ int msgdirint;
if (vm_lock_path(dir))
return ERROR_LOCK_PATH;
+ /* Reading the entire directory into a file map scales better than
+ * doing a stat repeatedly on a predicted sequence. I suspect this
+ * is partially due to stat(2) internally doing a readdir(2) itself to
+ * find each file. */
+ msgdir = opendir(dir);
+ while ((msgdirent = readdir(msgdir))) {
+ if (sscanf(msgdirent->d_name, "msg%d", &msgdirint) == 1 && msgdirint < MAXMSGLIMIT)
+ map[msgdirint] = 1;
+ }
+ closedir(msgdir);
+
for (x = 0; x < vmu->maxmsg; x++) {
- make_file(fn, sizeof(fn), dir, x);
- if (ast_fileexists(fn, NULL, NULL) < 1)
+ if (map[x] == 0)
break;
}
ast_unlock_path(dir);
@@ -2525,13 +2538,7 @@
if (vm_lock_path(todir))
return ERROR_LOCK_PATH;
- recipmsgnum = 0;
- do {
- make_file(topath, sizeof(topath), todir, recipmsgnum);
- if (!EXISTS(todir, recipmsgnum, topath, chan->language))
- break;
- recipmsgnum++;
- } while (recipmsgnum < recip->maxmsg);
+ recipmsgnum = last_message_index(recip, todir) + 1;
if (recipmsgnum < recip->maxmsg) {
COPY(fromdir, msgnum, todir, recipmsgnum, recip->mailbox, recip->context, frompath, topath);
} else {
@@ -2995,12 +3002,8 @@
unlink(tmptxtfile);
ast_unlock_path(dir);
} else {
- for (;;) {
- make_file(fn, sizeof(fn), dir, msgnum);
- if (!EXISTS(dir, msgnum, fn, NULL))
- break;
- msgnum++;
- }
+ msgnum = last_message_index(vmu, dir) + 1;
+ make_file(fn, sizeof(fn), dir, msgnum);
/* assign a variable with the name of the voicemail file */
pbx_builtin_setvar_helper(chan, "VM_MESSAGEFILE", fn);
@@ -3123,11 +3126,9 @@
if (vm_lock_path(ddir))
return ERROR_LOCK_PATH;
- for (x = 0; x < vmu->maxmsg; x++) {
- make_file(dfn, sizeof(dfn), ddir, x);
- if (!EXISTS(ddir, x, dfn, NULL))
- break;
- }
+ x = last_message_index(vmu, ddir) + 1;
+ make_file(dfn, sizeof(dfn), ddir, x);
+
if (x >= vmu->maxmsg) {
ast_unlock_path(ddir);
return -1;
More information about the asterisk-commits
mailing list