Author: rjung
Date: Sun Jun 24 04:51:21 2007
New Revision: 550213
URL: http://svn.apache.org/viewvc?view=rev&rev=550213
Log:
Make writing log lines and line endings more atomic.
This should prevent corrupt log lines
and should also be a little more efficient,
since we spare a couple of I/Os.
Modified:
tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c
tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c
tomcat/connectors/trunk/jk/native/common/jk_logger.h
tomcat/connectors/trunk/jk/native/common/jk_util.c
tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml
Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c
URL:
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c?view=diff&rev=550213&r1=550212&r2=550213
==============================================================================
--- tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c (original)
+++ tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c Sun Jun 24 04:51:21
2007
@@ -2381,29 +2381,23 @@
return overrides;
}
-static int JK_METHOD jk_log_to_file(jk_logger_t *l,
- int level, const char *what)
+static int JK_METHOD jk_log_to_file(jk_logger_t *l, int level,
+ int used, char *what)
{
if (l &&
(l->level <= level || level == JK_LOG_REQUEST_LEVEL) &&
- l->logger_private && what) {
+ l->logger_private && what && used > 0) {
jk_file_logger_t *flp = l->logger_private;
int log_fd = flp->log_fd;
- size_t sz = strlen(what);
- if (log_fd >= 0 && sz) {
- if (write(log_fd, what, sz) < 0 ) {
+ if (log_fd >= 0) {
+#if defined(WIN32)
+ what[used++] = '\r';
+#endif
+ what[used++] = '\n';
+ if (write(log_fd, what, used) < 0 ) {
ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, NULL,
"mod_jk: jk_log_to_file %s failed",
what);
- }
- else {
- char c;
-#if defined(WIN32)
- c = '\r';
- write(log_fd, &c, 1);
-#endif
- c = '\n';
- write(log_fd, &c, 1);
}
}
Modified: tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c
URL:
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c?view=diff&rev=550213&r1=550212&r2=550213
==============================================================================
--- tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c (original)
+++ tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c Sun Jun 24 04:51:21
2007
@@ -2512,43 +2512,40 @@
return overrides;
}
-static int JK_METHOD jk_log_to_file(jk_logger_t *l,
- int level, const char *what)
+static int JK_METHOD jk_log_to_file(jk_logger_t *l, int level,
+ int used, char *what)
{
if (l &&
(l->level <= level || level == JK_LOG_REQUEST_LEVEL) &&
- l->logger_private && what) {
- unsigned sz = strlen(what);
- apr_size_t wrote = sz;
- char error[256];
- if (sz) {
- apr_status_t status;
- jk_file_logger_t *p = l->logger_private;
- if (p->jklogfp) {
- apr_status_t rv;
- rv = apr_global_mutex_lock(jk_log_lock);
- if (rv != APR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
- "apr_global_mutex_lock(jk_log_lock) failed");
- /* XXX: Maybe this should be fatal? */
- }
- status = apr_file_write(p->jklogfp, what, &wrote);
- if (status != APR_SUCCESS) {
- apr_strerror(status, error, 254);
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
- "mod_jk: jk_log_to_file %s failed: %s",
- what, error);
- }
+ l->logger_private && what && used > 0) {
+ jk_file_logger_t *p = l->logger_private;
+ if (p->jklogfp) {
+ apr_status_t rv;
+ apr_size_t wrote;
+ rv = apr_global_mutex_lock(jk_log_lock);
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
+ "apr_global_mutex_lock(jk_log_lock) failed");
+ /* XXX: Maybe this should be fatal? */
+ }
#if defined(WIN32)
- apr_file_putc('\r', p->jklogfp);
+ what[used++] = '\r';
#endif
- apr_file_putc('\n', p->jklogfp);
- rv = apr_global_mutex_unlock(jk_log_lock);
- if (rv != APR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
- "apr_global_mutex_unlock(jk_log_lock)
failed");
- /* XXX: Maybe this should be fatal? */
- }
+ what[used++] = '\n';
+ wrote = used;
+ rv = apr_file_write(p->jklogfp, what, &wrote);
+ if (rv != APR_SUCCESS) {
+ char error[256];
+ apr_strerror(rv, error, 254);
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
+ "mod_jk: jk_log_to_file %s failed: %s",
+ what, error);
+ }
+ rv = apr_global_mutex_unlock(jk_log_lock);
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
+ "apr_global_mutex_unlock(jk_log_lock) failed");
+ /* XXX: Maybe this should be fatal? */
}
}
Modified: tomcat/connectors/trunk/jk/native/common/jk_logger.h
URL:
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_logger.h?view=diff&rev=550213&r1=550212&r2=550213
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_logger.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_logger.h Sun Jun 24 04:51:21
2007
@@ -38,7 +38,7 @@
int level;
const char *log_fmt;
- int (JK_METHOD * log) (jk_logger_t *l, int level, const char *what);
+ int (JK_METHOD * log) (jk_logger_t *l, int level, int used, char *what);
};
Modified: tomcat/connectors/trunk/jk/native/common/jk_util.c
URL:
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_util.c?view=diff&rev=550213&r1=550212&r2=550213
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_util.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_util.c Sun Jun 24 04:51:21 2007
@@ -352,15 +352,16 @@
return (int)strftime(str, len, JK_TIME_FORMAT, tms);
}
-static int JK_METHOD log_to_file(jk_logger_t *l, int level, const char *what)
+static int JK_METHOD log_to_file(jk_logger_t *l, int level, int used, char
*what)
{
if (l &&
(l->level <= level || level == JK_LOG_REQUEST_LEVEL) &&
l->logger_private && what) {
jk_file_logger_t *p = l->logger_private;
if (p->logfile) {
+ what[used++] = '\n';
+ what[used] = '\0';
fputs(what, p->logfile);
- fputc('\n', p->logfile);
/* [V] Flush the dam' thing! */
fflush(p->logfile);
}
@@ -453,8 +454,12 @@
const char *fmt, ...)
{
int rc = 0;
- /* Need to reserve space for terminating zero byte. */
- static int usable_size = HUGE_BUFFER_SIZE - 1;
+ /*
+ * Need to reserve space for terminating zero byte
+ * and platform specific line endings added during the call
+ * to the output routing.
+ */
+ static int usable_size = HUGE_BUFFER_SIZE - 3;
if (!l || !file || !fmt) {
return -1;
}
@@ -524,8 +529,7 @@
} else {
used = usable_size;
}
- buf[used] = 0;
- l->log(l, level, buf);
+ l->log(l, level, used, buf);
#ifdef NETWARE
free(buf);
Modified: tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml?view=diff&rev=550213&r1=550212&r2=550213
==============================================================================
--- tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml (original)
+++ tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Sun Jun 24
04:51:21 2007
@@ -27,6 +27,9 @@
<br />
<subsection name="Native">
<changelog>
+ <fix>
+ Make writing log lines and line endings more atomic. (rjung)
+ </fix>
<update>
Common: Refactored and unified jk_map_read_prop* and jk_map_load_prop*
for all use cases. (rjung)
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]