Skip to content

Commit 82d23d4

Browse files
committed
Add initial changes and notes for wrapping
1 parent cc06a87 commit 82d23d4

File tree

1 file changed

+73
-33
lines changed

1 file changed

+73
-33
lines changed

sapi/fpm/fpm/zlog.c

Lines changed: 73 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -290,59 +290,89 @@ inline static zlog_bool zlog_stream_buf_alloc(struct zlog_stream *stream) /* {{
290290
}
291291
/* }}} */
292292

293-
static ssize_t zlog_stream_buf_append(struct zlog_stream *stream, const char *str, size_t len) /* {{{ */
293+
/* TODO: consider better handling of errors and do not use zend_quiet_write */
294+
static inline ssize_t zlog_stream_direct_write_ex(
295+
struct zlog_stream *stream, const char *buf, size_t len,
296+
int finished, const char *append, size_t append_len) /* {{{ */
294297
{
295-
int finished = 0;
296-
297-
if (stream->len + len > zlog_limit) {
298-
stream->finished = finished = 1;
299-
len = zlog_limit - stream->len;
300-
}
301-
302-
if (stream->buf_size - stream->len <= len && !zlog_stream_buf_alloc_ex(stream, len)) {
303-
return -1;
298+
if (stream->use_fd) {
299+
zend_quiet_write(stream->fd, buf, len);
300+
if (finished) {
301+
zend_quiet_write(stream->fd, append, append_len);
302+
}
304303
}
305304

306-
memcpy(stream->buf + stream->len, str, len);
307-
stream->len += len;
308-
309-
if (finished) {
310-
stream->len = zlog_truncate_buf(stream->buf, stream->len);
305+
if (stream->use_stderr) {
306+
zend_quiet_write(STDERR_FILENO, buf, len);
307+
if (finished) {
308+
zend_quiet_write(STDERR_FILENO, append, append_len);
309+
}
311310
}
312311

313312
return len;
314313
}
314+
/* }}} */
315315

316-
static inline ssize_t zlog_stream_write(struct zlog_stream *stream, const char *buf, size_t len) /* {{{ */
316+
static ssize_t zlog_stream_direct_write(struct zlog_stream *stream, const char *buf, size_t len) /* {{{ */
317+
{
318+
return zlog_stream_direct_write_ex(stream, buf, len, 0, NULL, 0);
319+
}
320+
/* }}} */
321+
322+
static inline ssize_t zlog_stream_unbuffered_write(struct zlog_stream *stream, const char *buf, size_t len) /* {{{ */
317323
{
318324
int finished = 0;
319325
const char *append;
320326
size_t append_len;
321327

322328
if (stream->len + len >= zlog_limit) {
329+
/* TODO: handle wrapping */
323330
stream->finished = finished = 1;
324331
append = (stream->len + len == zlog_limit) ? "\n" : "...\n";
325332
append_len = sizeof(append) - 1;
326333
len = zlog_limit - stream->len - append_len;
327334
}
328335

329-
if (stream->use_fd) {
330-
zend_quiet_write(stream->fd, buf, len);
331-
if (finished) {
332-
zend_quiet_write(stream->fd, append, append_len);
333-
}
336+
return zlog_stream_direct_write_ex(stream, buf, len, finished, append, append_len);
337+
}
338+
/* }}} */
339+
340+
/* TODO: handle errors from this function in all calls (check for -1) */
341+
static ssize_t zlog_stream_buf_append(struct zlog_stream *stream, const char *str, size_t str_len) /* {{{ */
342+
{
343+
int finished = 0;
344+
size_t available_len;
345+
346+
if (stream->len + str_len > zlog_limit) {
347+
stream->finished = finished = 1;
348+
available_len = zlog_limit - stream->len;
349+
} else {
350+
available_len = str_len;
334351
}
335352

336-
if (stream->use_stderr) {
337-
zend_quiet_write(STDERR_FILENO, buf, len);
338-
if (finished) {
339-
zend_quiet_write(STDERR_FILENO, append, append_len);
340-
}
353+
if (stream->buf_size - stream->len <= available_len && !zlog_stream_buf_alloc_ex(stream, available_len)) {
354+
return -1;
341355
}
342356

343-
return len;
357+
memcpy(stream->buf + stream->len, str, available_len);
358+
stream->len += available_len;
359+
360+
if (!finished) {
361+
return available_len;
362+
}
363+
364+
if (stream->wrap) {
365+
/* TODO: append wrap_suffix before the write */
366+
zlog_stream_direct_write(stream, stream->buf, stream->len);
367+
stream->len = 0;
368+
/* TODO: use function and line from the initial call (remember them and call zlog_stream_prefix_ex) */
369+
zlog_stream_prefix(stream);
370+
return available_len + zlog_stream_buf_append(stream, str + available_len, str_len - available_len);
371+
}
372+
373+
stream->len = zlog_truncate_buf(stream->buf, stream->len);
374+
return available_len;
344375
}
345-
/* }}} */
346376

347377
static inline void zlog_stream_init_ex(struct zlog_stream *stream, int flags, size_t capacity, int fd) /* {{{ */
348378
{
@@ -355,6 +385,7 @@ static inline void zlog_stream_init_ex(struct zlog_stream *stream, int flags, si
355385
stream->use_syslog = fd == ZLOG_SYSLOG;
356386
stream->use_fd = !stream->use_syslog;
357387
stream->use_buffer = external_logger != NULL || stream->use_syslog;
388+
/* TODO: require a minimal capacity when using buffer to make sure the prefix is not trimmed */
358389
stream->buf_size = capacity;
359390
stream->use_stderr = fd != STDERR_FILENO && fd != STDOUT_FILENO && fd != -1 &&
360391
!launched && (flags & ZLOG_LEVEL_MASK) >= ZLOG_NOTICE;
@@ -458,11 +489,19 @@ ssize_t zlog_stream_prefix_ex(struct zlog_stream *stream, const char *function,
458489
}
459490
len = zlog_buf_prefix(function, line, stream->flags, stream->buf, stream->buf_size, stream->use_syslog);
460491
stream->len = stream->prefix_len = len;
461-
return len;
492+
if (stream->wrap_prefix != NULL) {
493+
zlog_stream_buf_append(stream, stream->wrap_prefix, stream->wrap_prefix_len);
494+
}
495+
return stream->len;
462496
} else {
463497
char sbuf[1024];
498+
ssize_t written;
464499
len = zlog_buf_prefix(function, line, stream->flags, sbuf, 1024, stream->use_syslog);
465-
return zlog_stream_write(stream, sbuf, len);
500+
written = zlog_stream_direct_write(stream, sbuf, len);
501+
if (stream->wrap_prefix != NULL) {
502+
written += zlog_stream_direct_write(stream, stream->wrap_prefix, stream->wrap_prefix_len);
503+
}
504+
return written;
466505
}
467506
}
468507
/* }}} */
@@ -501,13 +540,14 @@ ssize_t zlog_stream_str(struct zlog_stream *stream, const char *str, size_t str_
501540
return zlog_stream_buf_append(stream, str, str_len);
502541
}
503542

504-
return zlog_stream_write(stream, str, str_len);
543+
return zlog_stream_unbuffered_write(stream, str, str_len);
505544
}
506545
/* }}} */
507546

508547
zlog_bool zlog_stream_finish(struct zlog_stream *stream) /* {{{ */
509548
{
510549
if (stream->use_buffer) {
550+
/* TODO: append stream->wrap_final_suffix */
511551
if (external_logger != NULL) {
512552
external_logger(stream->flags & ZLOG_LEVEL_MASK,
513553
stream->buf + stream->prefix_len, stream->len - stream->prefix_len);
@@ -520,9 +560,9 @@ zlog_bool zlog_stream_finish(struct zlog_stream *stream) /* {{{ */
520560
}
521561
#endif
522562
stream->buf[stream->len++] = '\n';
523-
zlog_stream_write(stream, stream->buf, stream->len);
563+
zlog_stream_direct_write(stream, stream->buf, stream->len);
524564
} else if (!stream->finished) {
525-
zlog_stream_write(stream, "\n", 1);
565+
zlog_stream_direct_write(stream, "\n", 1);
526566
}
527567

528568
stream->finished = 1;

0 commit comments

Comments
 (0)