< prev index next >

src/share/vm/utilities/ostream.cpp

Print this page
rev 10169 : 8149557: Resource mark breaks printing to string stream


 321   buffer_pos    = 0;
 322   buffer_fixed  = true;
 323 }
 324 
 325 void stringStream::write(const char* s, size_t len) {
 326   size_t write_len = len;               // number of non-null bytes to write
 327   size_t end = buffer_pos + len + 1;    // position after write and final '\0'
 328   if (end > buffer_length) {
 329     if (buffer_fixed) {
 330       // if buffer cannot resize, silently truncate
 331       end = buffer_length;
 332       write_len = end - buffer_pos - 1; // leave room for the final '\0'
 333     } else {
 334       // For small overruns, double the buffer.  For larger ones,
 335       // increase to the requested size.
 336       if (end < buffer_length * 2) {
 337         end = buffer_length * 2;
 338       }
 339       char* oldbuf = buffer;
 340       assert(rm == NULL || Thread::current()->current_resource_mark() == rm,
 341              "stringStream is re-allocated with a different ResourceMark");


 342       buffer = NEW_RESOURCE_ARRAY(char, end);
 343       if (buffer_pos > 0) {
 344         memcpy(buffer, oldbuf, buffer_pos);
 345       }
 346       buffer_length = end;
 347     }
 348   }
 349   // invariant: buffer is always null-terminated
 350   guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob");
 351   if (write_len > 0) {
 352     buffer[buffer_pos + write_len] = 0;
 353     memcpy(buffer + buffer_pos, s, write_len);
 354     buffer_pos += write_len;
 355   }
 356 
 357   // Note that the following does not depend on write_len.
 358   // This means that position and count get updated
 359   // even when overflow occurs.
 360   update_position(s, len);
 361 }




 321   buffer_pos    = 0;
 322   buffer_fixed  = true;
 323 }
 324 
 325 void stringStream::write(const char* s, size_t len) {
 326   size_t write_len = len;               // number of non-null bytes to write
 327   size_t end = buffer_pos + len + 1;    // position after write and final '\0'
 328   if (end > buffer_length) {
 329     if (buffer_fixed) {
 330       // if buffer cannot resize, silently truncate
 331       end = buffer_length;
 332       write_len = end - buffer_pos - 1; // leave room for the final '\0'
 333     } else {
 334       // For small overruns, double the buffer.  For larger ones,
 335       // increase to the requested size.
 336       if (end < buffer_length * 2) {
 337         end = buffer_length * 2;
 338       }
 339       char* oldbuf = buffer;
 340       assert(rm == NULL || Thread::current()->current_resource_mark() == rm,
 341              "StringStream is re-allocated with a different ResourceMark. Current: "
 342              PTR_FORMAT " original: " PTR_FORMAT,
 343              p2i(Thread::current()->current_resource_mark()), p2i(rm));
 344       buffer = NEW_RESOURCE_ARRAY(char, end);
 345       if (buffer_pos > 0) {
 346         memcpy(buffer, oldbuf, buffer_pos);
 347       }
 348       buffer_length = end;
 349     }
 350   }
 351   // invariant: buffer is always null-terminated
 352   guarantee(buffer_pos + write_len + 1 <= buffer_length, "stringStream oob");
 353   if (write_len > 0) {
 354     buffer[buffer_pos + write_len] = 0;
 355     memcpy(buffer + buffer_pos, s, write_len);
 356     buffer_pos += write_len;
 357   }
 358 
 359   // Note that the following does not depend on write_len.
 360   // This means that position and count get updated
 361   // even when overflow occurs.
 362   update_position(s, len);
 363 }


< prev index next >