[Python-checkins] python/dist/src/Modules _hotshot.c,1.16,1.17

nascheme@users.sourceforge.net nascheme@users.sourceforge.net
Wed, 29 May 2002 11:19:21 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv28796/Modules

Modified Files:
	_hotshot.c 
Log Message:
The logreader object did not always refill the input buffer correctly
and got confused by certain log files.  Remove logreader_refill and the
associated logic and replace with fgetc.


Index: _hotshot.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/_hotshot.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** _hotshot.c	20 Mar 2002 21:32:07 -0000	1.16
--- _hotshot.c	29 May 2002 18:19:14 -0000	1.17
***************
*** 84,92 ****
      PyObject *info;
      FILE *logfp;
-     int filled;
-     int index;
      int linetimings;
      int frametimings;
-     unsigned char buffer[BUFFERSIZE];
  } LogReaderObject;
  
--- 84,89 ----
***************
*** 273,295 ****
  unpack_packed_int(LogReaderObject *self, int *pvalue, int discard)
  {
      int accum = 0;
      int bits = 0;
-     int index = self->index;
      int cont;
  
      do {
-         if (index >= self->filled)
-             return ERR_EOF;
          /* read byte */
!         accum |= ((self->buffer[index] & 0x7F) >> discard) << bits;
          bits += (7 - discard);
!         cont = self->buffer[index] & 0x80;
!         /* move to next */
          discard = 0;
-         index++;
      } while (cont);
  
-     /* save state */
-     self->index = index;
      *pvalue = accum;
  
--- 270,288 ----
  unpack_packed_int(LogReaderObject *self, int *pvalue, int discard)
  {
+     int c;
      int accum = 0;
      int bits = 0;
      int cont;
  
      do {
          /* read byte */
! 	if ((c = fgetc(self->logfp)) == EOF)
!             return ERR_EOF;
!         accum |= ((c & 0x7F) >> discard) << bits;
          bits += (7 - discard);
!         cont = c & 0x80;
          discard = 0;
      } while (cont);
  
      *pvalue = accum;
  
***************
*** 303,333 ****
  unpack_string(LogReaderObject *self, PyObject **pvalue)
  {
      int len;
!     int oldindex = self->index;
!     int err = unpack_packed_int(self, &len, 0);
  
!     if (!err) {
!         /* need at least len bytes in buffer */
!         if (len > (self->filled - self->index)) {
!             self->index = oldindex;
!             err = ERR_EOF;
!         }
!         else {
!             *pvalue = PyString_FromStringAndSize((char *)self->buffer + self->index,
!                                                  len);
!             if (*pvalue == NULL) {
!                 self->index = oldindex;
!                 err = ERR_EXCEPTION;
!             }
!             else
!                 self->index += len;
          }
      }
!     return err;
  }
  
  
  static int
! unpack_add_info(LogReaderObject *self, int skip_opcode)
  {
      PyObject *key;
--- 296,325 ----
  unpack_string(LogReaderObject *self, PyObject **pvalue)
  {
+     int i;
      int len;
!     int err;
!     char *buf;
!     
!     if ((err = unpack_packed_int(self, &len, 0)))
!         return err;
  
!     buf = malloc(len);
!     for (i=0; i < len; i++) {
!         if ((buf[i] = fgetc(self->logfp)) == EOF) {
!             free(buf);
!             return ERR_EOF;
          }
      }
!     *pvalue = PyString_FromStringAndSize(buf, len);
!     free(buf);
!     if (*pvalue == NULL) {
!         return ERR_EXCEPTION;
!     }
!     return 0;
  }
  
  
  static int
! unpack_add_info(LogReaderObject *self)
  {
      PyObject *key;
***************
*** 335,343 ****
      int err;
  
-     if (skip_opcode) {
-         if (self->buffer[self->index] != WHAT_ADD_INFO)
-             return ERR_BAD_RECTYPE;
-         self->index++;
-     }
      err = unpack_string(self, &key);
      if (!err) {
--- 327,330 ----
***************
*** 370,392 ****
  
  static void
- logreader_refill(LogReaderObject *self)
- {
-     int needed;
-     size_t res;
- 
-     if (self->index) {
-         memmove(self->buffer, &self->buffer[self->index],
-                 self->filled - self->index);
-         self->filled = self->filled - self->index;
-         self->index = 0;
-     }
-     needed = BUFFERSIZE - self->filled;
-     if (needed > 0) {
-         res = fread(&self->buffer[self->filled], 1, needed, self->logfp);
-         self->filled += res;
-     }
- }
- 
- static void
  eof_error(void)
  {
--- 357,360 ----
***************
*** 398,402 ****
  logreader_tp_iternext(LogReaderObject *self)
  {
!     int what, oldindex;
      int err = ERR_NONE;
      int lineno = -1;
--- 366,371 ----
  logreader_tp_iternext(LogReaderObject *self)
  {
!     int c;
!     int what;
      int err = ERR_NONE;
      int lineno = -1;
***************
*** 414,433 ****
          return NULL;
      }
-  restart:
-     if ((self->filled - self->index) < MAXEVENTSIZE)
-         logreader_refill(self);
  
!     /* end of input */
!     if (self->filled == 0)
          return NULL;
  
!     oldindex = self->index;
  
-     /* decode the record type */
-     what = self->buffer[self->index] & WHAT_OTHER;
-     if (what == WHAT_OTHER) {
-         what = self->buffer[self->index];
-         self->index++;
-     }
      switch (what) {
      case WHAT_ENTER:
--- 383,398 ----
          return NULL;
      }
  
! restart:
!     /* decode the record type */
!     if ((c = fgetc(self->logfp)) == EOF)
          return NULL;
  
!     what = c & WHAT_OTHER;
!     if (what == WHAT_OTHER)
!         what = c; /* need all the bits for type */
!     else
!         ungetc(c, self->logfp); /* type byte includes packed int */
  
      switch (what) {
      case WHAT_ENTER:
***************
*** 448,452 ****
          break;
      case WHAT_ADD_INFO:
!         err = unpack_add_info(self, 0);
          break;
      case WHAT_DEFINE_FILE:
--- 413,417 ----
          break;
      case WHAT_ADD_INFO:
!         err = unpack_add_info(self);
          break;
      case WHAT_DEFINE_FILE:
***************
*** 469,500 ****
          break;
      case WHAT_LINE_TIMES:
!         if (self->index >= self->filled)
              err = ERR_EOF;
          else {
!             self->linetimings = self->buffer[self->index] ? 1 : 0;
!             self->index++;
!             goto restart;
!         }
          break;
      case WHAT_FRAME_TIMES:
!         if (self->index >= self->filled)
              err = ERR_EOF;
          else {
!             self->frametimings = self->buffer[self->index] ? 1 : 0;
!             self->index++;
!             goto restart;
!         }
          break;
      default:
          err = ERR_BAD_RECTYPE;
      }
-     if (err == ERR_EOF && oldindex != 0) {
-         /* It looks like we ran out of data before we had it all; this
-          * could easily happen with large packed integers or string
-          * data.  Try forcing the buffer to be re-filled before failing.
-          */
-         err = ERR_NONE;
-         logreader_refill(self);
-     }
      if (err == ERR_BAD_RECTYPE) {
          PyErr_SetString(PyExc_ValueError,
--- 434,455 ----
          break;
      case WHAT_LINE_TIMES:
!         if ((c = fgetc(self->logfp)) == EOF)
              err = ERR_EOF;
          else {
!             self->linetimings = c ? 1 : 0;
! 	    goto restart;
! 	}
          break;
      case WHAT_FRAME_TIMES:
!         if ((c = fgetc(self->logfp)) == EOF)
              err = ERR_EOF;
          else {
!             self->frametimings = c ? 1 : 0;
! 	    goto restart;
! 	}
          break;
      default:
          err = ERR_BAD_RECTYPE;
      }
      if (err == ERR_BAD_RECTYPE) {
          PyErr_SetString(PyExc_ValueError,
***************
*** 502,506 ****
      }
      else if (err == ERR_EOF) {
-         /* Could not avoid end-of-buffer error. */
          eof_error();
      }
--- 457,460 ----
***************
*** 1390,1399 ****
      LogReaderObject *self = NULL;
      char *filename;
  
      if (PyArg_ParseTuple(args, "s:logreader", &filename)) {
          self = PyObject_New(LogReaderObject, &LogReaderType);
          if (self != NULL) {
-             self->filled = 0;
-             self->index = 0;
              self->frametimings = 1;
              self->linetimings = 0;
--- 1344,1353 ----
      LogReaderObject *self = NULL;
      char *filename;
+     int c;
+     int err = 0;
  
      if (PyArg_ParseTuple(args, "s:logreader", &filename)) {
          self = PyObject_New(LogReaderObject, &LogReaderType);
          if (self != NULL) {
              self->frametimings = 1;
              self->linetimings = 0;
***************
*** 1411,1422 ****
                  goto finally;
              }
!             /* Aggressively attempt to load all preliminary ADD_INFO
!              * records from the log so the info records are available
!              * from a fresh logreader object.
!              */
!             logreader_refill(self);
!             while (self->filled > self->index
!                    && self->buffer[self->index] == WHAT_ADD_INFO) {
!                 int err = unpack_add_info(self, 1);
                  if (err) {
                      if (err == ERR_EOF)
--- 1365,1379 ----
                  goto finally;
              }
!             /* read initial info */
!             for (;;) {
!                 if ((c = fgetc(self->logfp)) == EOF) {
!                     eof_error();
!                     break;
!                 }
!                 if (c != WHAT_ADD_INFO) {
!                     ungetc(c, self->logfp);
!                     break;
!                 }
!                 err = unpack_add_info(self);
                  if (err) {
                      if (err == ERR_EOF)
***************
*** 1427,1436 ****
                      break;
                  }
-                 /* Refill agressively so we can avoid EOF during
-                  * initialization unless there's a real EOF condition
-                  * (the tp_iternext handler loops attempts to refill
-                  * and try again).
-                  */
-                 logreader_refill(self);
              }
          }
--- 1384,1387 ----