From fd8f4d48b8d649bfc7ef646996d07c7b2e3a7511 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sun, 9 Jun 2013 15:26:32 +0000 Subject: [PATCH] Improved granularity of SCSI log time measurement and added absolute timestamp --- cdrskin/cdrskin_timestamp.h | 2 +- libburn/init.c | 8 +++++++- libburn/init.h | 7 +++++++ libburn/sg-freebsd.c | 22 +++++++++------------- libburn/sg-libcdio.c | 7 +++++-- libburn/sg-linux.c | 28 +++++++++++++++++++--------- libburn/sg-solaris.c | 10 +++++++--- libburn/spc.c | 33 +++++++++++++++++---------------- libburn/spc.h | 11 ++++++----- libburn/transport.h | 6 +++++- libburn/util.c | 27 ++++++++++++++++++++++++++- libburn/util.h | 3 +++ 12 files changed, 112 insertions(+), 52 deletions(-) diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 0d0d6a4..c048167 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2013.05.30.133008" +#define Cdrskin_timestamP "2013.06.09.152602" diff --git a/libburn/init.c b/libburn/init.c index 8982fa8..1c038f0 100644 --- a/libburn/init.c +++ b/libburn/init.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2012 Thomas Schmitt + Copyright (c) 2006 - 2013 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -31,6 +31,7 @@ #include "libburn.h" #include "drive.h" #include "transport.h" +#include "util.h" /* ts A60825 : The storage location for back_hacks.h variables. */ #define BURN_BACK_HACKS_INIT 1 @@ -43,6 +44,9 @@ struct libdax_msgs *libdax_messenger= NULL; int burn_running = 0; +double lib_start_time; + + /* ts A60813 : GNU/Linux: whether to use O_EXCL on open() of device files ts B00212 : FreeBSD: whether to use flock(LOCK_EX) after open() */ @@ -136,6 +140,8 @@ int burn_initialize(void) if (burn_running) return 1; + + lib_start_time = burn_get_time(0); burn_support_untested_profiles = 0; ret = burn_msgs_initialize(); if (ret <= 0) diff --git a/libburn/init.h b/libburn/init.h index 4fe4224..b0919a6 100644 --- a/libburn/init.h +++ b/libburn/init.h @@ -1,10 +1,17 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ +/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens + Copyright (c) 2006 - 2013 Thomas Schmitt + Provided under GPL version 2 or later. +*/ + #ifndef BURN__INIT_H #define BURN__INIT_H extern int burn_running; +extern double lib_start_time; + /** Indicator for burn_drive_get_status() wether a signal hit parts of the thread team. 0= all works well , diff --git a/libburn/sg-freebsd.c b/libburn/sg-freebsd.c index 7748ba2..7ddf273 100644 --- a/libburn/sg-freebsd.c +++ b/libburn/sg-freebsd.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* - Copyright (c) 2006 - 2011 Thomas Schmitt + Copyright (c) 2006 - 2013 Thomas Schmitt Provided under GPL version 2 or later and under FreeBSD license revised, i.e. without advertising clause. */ @@ -861,8 +861,11 @@ int sg_issue_command(struct burn_drive *d, struct command *c) memset(&ccb->csio.sense_data, 0, sizeof(ccb->csio.sense_data)); memset(c->sense, 0, sizeof(c->sense)); + c->start_time = burn_get_time(0); + err = cam_send_ccb(d->cam, ccb); + c->end_time = burn_get_time(0); ignore_error = sense_len = 0; /* ts B00325 : CAM_AUTOSNS_VALID advised by Alexander Motin */ if (ccb->ccb_h.status & CAM_AUTOSNS_VALID) { @@ -959,19 +962,12 @@ int sg_issue_command(struct burn_drive *d, struct command *c) c->sense[13] = 0x00; done = 1; } - - /* >>> Need own duration time measurement. - Then remove bit1 from flag. - */ - done = scsi_eval_cmd_outcome(d, c, fp, c->sense, - sense_len, 0, start_time, - timeout_ms, i, - 2 | !!ignore_error); - if (d->cancel) - done = 1; - } else { - done = 1; } + done = scsi_eval_cmd_outcome(d, c, fp, c->sense, + sense_len, start_time, + timeout_ms, i, !!ignore_error); + if (d->cancel) + done = 1; } while (!done); ret = 1; ex:; diff --git a/libburn/sg-libcdio.c b/libburn/sg-libcdio.c index f2cea51..9d8754b 100644 --- a/libburn/sg-libcdio.c +++ b/libburn/sg-libcdio.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* - Copyright (c) 2009 - 2011 Thomas Schmitt + Copyright (c) 2009 - 2013 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -669,9 +669,12 @@ int sg_issue_command(struct burn_drive *d, struct command *c) for(i = 0; !done; i++) { memset(c->sense, 0, sizeof(c->sense)); + c->start_time = burn_get_time(0); + i_status = mmc_run_cmd(p_cdio, timeout_ms, &cdb, e_direction, dxfer_len, c->page->data); + c->end_time = burn_get_time(0); sense_valid = mmc_last_cmd_sense(p_cdio, &sense_pt); if (sense_valid >= 18) { memcpy(c->sense, (unsigned char *) sense_pt, @@ -717,7 +720,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c) else sense_len = 0; done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len, - 0, start_time, timeout_ms, i, 2); + start_time, timeout_ms, i, 0); if (d->cancel) done = 1; diff --git a/libburn/sg-linux.c b/libburn/sg-linux.c index 13510f5..3edd377 100644 --- a/libburn/sg-linux.c +++ b/libburn/sg-linux.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2011 Thomas Schmitt + Copyright (c) 2006 - 2013 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -404,13 +404,13 @@ static int sgio_log_cmd(unsigned char *cmd, int cmd_len, FILE *fp_in, int flag) /* ts B11110 */ static int sgio_log_reply(unsigned char *opcode, int data_dir, unsigned char *data, int dxfer_len, - void *fp_in, unsigned char sense[18], - int sense_len, int duration, int flag) + void *fp_in, unsigned char sense[18], int sense_len, + double duration, int flag) { int ret; ret = scsi_log_reply(opcode, data_dir, data, dxfer_len, fp_in, - sense, sense_len, duration, flag); + sense, sense_len, duration, flag); return ret; } @@ -420,6 +420,7 @@ static int sgio_test(int fd) unsigned char test_ops[] = { 0, 0, 0, 0, 0, 0 }; sg_io_hdr_t s; int ret; + double c_start_time, c_end_time; memset(&s, 0, sizeof(sg_io_hdr_t)); s.interface_id = 'S'; @@ -430,10 +431,12 @@ static int sgio_test(int fd) sgio_log_cmd(s.cmdp, s.cmd_len, NULL, 0); + c_start_time = burn_get_time(0); ret= ioctl(fd, SG_IO, &s); + c_end_time = burn_get_time(0); - sgio_log_reply(s.cmdp, NO_TRANSFER, NULL, 0, - NULL, s.sbp, s.sb_len_wr, s.duration, 0); + sgio_log_reply(s.cmdp, NO_TRANSFER, NULL, 0, NULL, + s.sbp, s.sb_len_wr, c_end_time - c_start_time, 0); return ret; } @@ -446,6 +449,7 @@ static int sgio_inquiry_cd_drive(int fd, char *fname) unsigned char *sense = NULL; char *msg = NULL, *msg_pt; int ret = 0, i; + double c_start_time, c_end_time; BURN_ALLOC_MEM(buf, struct buffer, 1); BURN_ALLOC_MEM(sense, unsigned char, 128); @@ -465,7 +469,9 @@ static int sgio_inquiry_cd_drive(int fd, char *fname) sgio_log_cmd(s.cmdp, s.cmd_len, NULL, 0); + c_start_time = burn_get_time(0); ret = ioctl(fd, SG_IO, &s); + c_end_time = burn_get_time(0); if (ret == -1) { sprintf(msg, "INQUIRY on '%s' : ioctl(SG_IO) failed , errno= %d", @@ -476,8 +482,8 @@ static int sgio_inquiry_cd_drive(int fd, char *fname) goto ex; } - sgio_log_reply(s.cmdp, FROM_DRIVE, buf->data, s.dxfer_len, - NULL, s.sbp, s.sb_len_wr, s.duration, 0); + sgio_log_reply(s.cmdp, FROM_DRIVE, buf->data, s.dxfer_len, NULL, + s.sbp, s.sb_len_wr, c_end_time - c_start_time, 0); if (s.sb_len_wr > 0 || s.host_status != Libburn_sg_host_oK || s.driver_status != Libburn_sg_driver_oK) { @@ -1992,8 +1998,12 @@ int sg_issue_command(struct burn_drive *d, struct command *c) for(i = 0; !done; i++) { memset(c->sense, 0, sizeof(c->sense)); + c->start_time = burn_get_time(0); + err = ioctl(d->fd, SG_IO, &s); + c->end_time = burn_get_time(0); + /* ts A61010 */ /* a ssert(err != -1); */ if (err == -1) { @@ -2009,7 +2019,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c) {ret = -1; goto ex;} } done = scsi_eval_cmd_outcome(d, c, fp, s.sbp, s.sb_len_wr, - s.duration, start_time, s.timeout, i, 0); + start_time, s.timeout, i, 0); if (d->cancel) done = 1; } diff --git a/libburn/sg-solaris.c b/libburn/sg-solaris.c index 6286549..085507a 100644 --- a/libburn/sg-solaris.c +++ b/libburn/sg-solaris.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* - Copyright (c) 2010 - 2011 Thomas Schmitt + Copyright (c) 2010 - 2013 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -637,8 +637,12 @@ int sg_issue_command(struct burn_drive *d, struct command *c) for(i = 0; !done; i++) { memset(c->sense, 0, sizeof(c->sense)); + c->start_time = burn_get_time(0); + ret = ioctl(d->fd, USCSICMD, &cgc); + c->end_time = burn_get_time(0); + /* For cgc.uscsi_status see SAM-3 5.3.1, Table 22 0 = GOOD , 2 = CHECK CONDITION : Sense Data are delivered 8 = BUSY @@ -669,8 +673,8 @@ int sg_issue_command(struct burn_drive *d, struct command *c) sense_len = 18; else sense_len = 0; - done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len, 0, - start_time, timeout_ms, i, 2); + done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len, + start_time, timeout_ms, i, 0); if (d->cancel) done = 1; diff --git a/libburn/spc.c b/libburn/spc.c index af7c044..d7e57ca 100644 --- a/libburn/spc.c +++ b/libburn/spc.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2012 Thomas Schmitt + Copyright (c) 2006 - 2013 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -33,6 +33,7 @@ #include "debug.h" #include "options.h" #include "init.h" +#include "util.h" #include "libdax_msgs.h" extern struct libdax_msgs *libdax_messenger; @@ -1649,9 +1650,8 @@ int scsi_log_cmd(struct command *c, void *fp_in, int flag) */ int scsi_log_reply(unsigned char *opcode, int data_dir, unsigned char *data, int dxfer_len, void *fp_in, unsigned char sense[18], - int sense_len, int duration, int flag) + int sense_len, double duration, int flag) { - char durtxt[20]; FILE *fp = fp_in; int key, asc, ascq, i, l; @@ -1667,20 +1667,18 @@ int scsi_log_reply(unsigned char *opcode, int data_dir, unsigned char *data, for (i = 0 ; i < l; i++) fprintf(fp, " %2.2X", sense[i]); fprintf(fp, "\n"); - durtxt[0] = 0; - if (!(flag & 2)) - sprintf(durtxt, " (%6d ms)", duration); spc_decode_sense(sense, 0, &key, &asc, &ascq); - fprintf(fp, "+++ key=%X asc=%2.2Xh ascq=%2.2Xh%s\n", + fprintf(fp, "+++ key=%X asc=%2.2Xh ascq=%2.2Xh\n", (unsigned int) key, (unsigned int) asc, - (unsigned int) ascq, durtxt); + (unsigned int) ascq); } else { scsi_show_command_reply(opcode, data_dir, data, dxfer_len, fp, 0); - - if (!(flag & 2)) - fprintf(fp,"%6d ms\n", duration); } + if (!(flag & 2)) + fprintf(fp, " %6.f us [ %.f ]\n", + duration * 1.0e6, + (burn_get_time(0) - lib_start_time) * 1.0e6); if (burn_sg_log_scsi & 4) fflush(fp); } @@ -1698,16 +1696,19 @@ int scsi_log_reply(unsigned char *opcode, int data_dir, unsigned char *data, @param flag bit0 causes an error message bit1 do not print duration */ -int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18], - int sense_len, int duration, int flag) +int scsi_log_err(struct burn_drive *d, struct command *c, + void *fp_in, unsigned char sense[18], + int sense_len, int flag) { int ret; unsigned char *data = NULL; if (c->page != NULL) data = c->page->data; + ret= scsi_log_reply(c->opcode, c->dir, data, c->dxfer_len , - fp_in, sense, sense_len, duration, flag); + fp_in, sense, sense_len, + c->end_time - c->start_time, flag); return ret; } @@ -1720,7 +1721,7 @@ int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18], */ int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp, unsigned char *sense, int sense_len, - int duration, time_t start_time, int timeout_ms, + time_t start_time, int timeout_ms, int loop_count, int flag) { enum response outcome; @@ -1728,7 +1729,7 @@ int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp, char *msg = NULL; if (burn_sg_log_scsi & 3) - scsi_log_err(c, fp, sense, sense_len, duration, + scsi_log_err(d, c, fp, sense, sense_len, (sense_len > 0) | (flag & 2)); if (sense_len <= 0) {done = 1; goto ex;} diff --git a/libburn/spc.h b/libburn/spc.h index f8b546c..e1f21ec 100644 --- a/libburn/spc.h +++ b/libburn/spc.h @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2012 Thomas Schmitt + Copyright (c) 2006 - 2013 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -87,15 +87,16 @@ int scsi_log_cmd(struct command *c, void *fp, int flag); */ int scsi_log_reply(unsigned char *opcode, int data_dir, unsigned char *data, int dxfer_len, void *fp_in, unsigned char sense[18], - int sense_len, int duration, int flag); + int sense_len, double duration, int flag); /* ts A91221 (former sg_log_err ts A91108) */ /** Legacy frontend to scsi_log_reply(). @param flag bit0 causes an error message bit1 do not print duration */ -int scsi_log_err(struct command *c, void *fp, unsigned char sense[18], - int sense_len, int duration, int flag); +int scsi_log_err(struct burn_drive *d, struct command *c, + void *fp, unsigned char sense[18], + int sense_len, int flag); /* ts B00728 */ int spc_decode_sense(unsigned char *sense, int senselen, @@ -109,7 +110,7 @@ int spc_decode_sense(unsigned char *sense, int senselen, */ int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp_in, unsigned char *sense, int sense_len, - int duration, time_t start_time, int timeout_ms, + time_t start_time, int timeout_ms, int loop_count, int flag); diff --git a/libburn/transport.h b/libburn/transport.h index 3295e42..ff635f5 100644 --- a/libburn/transport.h +++ b/libburn/transport.h @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2012 Thomas Schmitt + Copyright (c) 2006 - 2013 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -65,6 +65,10 @@ struct command int retry; struct buffer *page; int timeout; /* milliseconds */ + + double start_time; + double end_time; + }; struct burn_scsi_inquiry_data diff --git a/libburn/util.c b/libburn/util.c index 8584de9..d4403f0 100644 --- a/libburn/util.c +++ b/libburn/util.c @@ -1,6 +1,6 @@ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2010 Thomas Schmitt + Copyright (c) 2006 - 2013 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -15,6 +15,9 @@ #include #include +#include +#include + /* ts A80914 : This is unneeded. Version info comes from libburn.h. #include "v ersion.h" @@ -342,3 +345,25 @@ void burn_int_to_lsb(int val, char *target) } +/* ts B30609 */ +double burn_get_time(int flag) +{ + int ret; + struct timeval tv; + +#ifdef Xorriso_use_clock_gettime_monotoniC + + struct timespec tp; + ret = clock_gettime(CLOCK_MONOTONIC, &tp) + if (ret == 0) + return ((double) tp.tv_sec) + ((double) tp.tv_nsec) * 1.0e-9; + +#endif /* Xorriso_use_clock_gettime_monotoniC */ + + ret = gettimeofday(&tv, NULL); + if (ret == 0) + return ((double) tv.tv_sec) + ((double) tv.tv_usec) * 1.0e-6; + return (double) time(NULL); +} + + diff --git a/libburn/util.h b/libburn/util.h index c498d35..4a37a40 100644 --- a/libburn/util.h +++ b/libburn/util.h @@ -11,4 +11,7 @@ char *burn_printify(char *msg); /* ts B30521 */ void burn_int_to_lsb(int val, char *target); +/* ts B30609 */ +double burn_get_time(int flag); + #endif