public inbox for lvm2-cvs@sourceware.org help / color / mirror / Atom feed
From: zkabelac@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2/lib/log log.c Date: Wed, 30 Mar 2011 12:53:00 -0000 [thread overview] Message-ID: <20110330125305.31253.qmail@sourceware.org> (raw) CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2011-03-30 12:53:04 Modified files: lib/log : log.c Log message: Optimise error message write to _lvm_errmsg Isn't usually perfomance critical - but log_error is used i.e.for debuging, this code noticable slows down the processing. Added 512KB limit to avoid memory exhastions in case of some endless loop. TODO: use _lvm_errmsg buffer only when lvm2api needs it. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/log/log.c.diff?cvsroot=lvm2&r1=1.61&r2=1.62 --- LVM2/lib/log/log.c 2011/02/18 14:16:12 1.61 +++ LVM2/lib/log/log.c 2011/03/30 12:53:04 1.62 @@ -43,6 +43,9 @@ static int _lvm_errno = 0; static int _store_errmsg = 0; static char *_lvm_errmsg = NULL; +static size_t _lvm_errmsg_size = 0; +static size_t _lvm_errmsg_len = 0; +#define MAX_ERRMSG_LEN (512 * 1024) /* Max size of error buffer 512KB */ void init_log_fn(lvm2_log_fn_t log_fn) { @@ -154,6 +157,7 @@ if (_lvm_errmsg) { dm_free(_lvm_errmsg); _lvm_errmsg = NULL; + _lvm_errmsg_size = _lvm_errmsg_len = 0; } _store_errmsg = store_errmsg; @@ -189,6 +193,7 @@ int use_stderr = level & _LOG_STDERR; int log_once = level & _LOG_ONCE; int fatal_internal_error = 0; + size_t msglen; level &= ~(_LOG_STDERR|_LOG_ONCE); @@ -229,14 +234,24 @@ message = &buf2[0]; } - if (_store_errmsg && (level <= _LOG_ERR)) { - if (!_lvm_errmsg) - _lvm_errmsg = dm_strdup(message); - else if ((newbuf = dm_realloc(_lvm_errmsg, - strlen(_lvm_errmsg) + - strlen(message) + 2))) { - _lvm_errmsg = strcat(newbuf, "\n"); - _lvm_errmsg = strcat(newbuf, message); + if (_store_errmsg && (level <= _LOG_ERR) && + _lvm_errmsg_len < MAX_ERRMSG_LEN) { + msglen = strlen(message); + if ((_lvm_errmsg_len + msglen + 1) >= _lvm_errmsg_size) { + _lvm_errmsg_size = 2 * (_lvm_errmsg_len + msglen + 1); + if ((newbuf = dm_realloc(_lvm_errmsg, + _lvm_errmsg_size))) + _lvm_errmsg = newbuf; + else + _lvm_errmsg_size = _lvm_errmsg_len; + } + if (_lvm_errmsg && + (_lvm_errmsg_len + msglen + 2) < _lvm_errmsg_size) { + /* prepend '\n' and copy with '\0' but do not count in */ + if (_lvm_errmsg_len) + _lvm_errmsg[_lvm_errmsg_len++] = '\n'; + memcpy(_lvm_errmsg + _lvm_errmsg_len, message, msglen + 1); + _lvm_errmsg_len += msglen; } }
next reply other threads:[~2011-03-30 12:53 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-03-30 12:53 zkabelac [this message] -- strict thread matches above, loose matches on Subject: below -- 2012-02-27 11:31 zkabelac 2011-08-11 19:21 zkabelac 2010-10-26 8:53 zkabelac 2010-03-23 18:18 mornfall 2010-01-11 20:41 agk 2010-01-11 20:30 agk 2009-12-01 13:54 mornfall
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20110330125305.31253.qmail@sourceware.org \ --to=zkabelac@sourceware.org \ --cc=lvm-devel@redhat.com \ --cc=lvm2-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).