< prev index next >

src/share/vm/utilities/numberSeq.cpp

Print this page
rev 10576 : [backport] Trace and report total allocation latency and sizes


 342   int target = MAX2(1, (int) (level * num() / 100));
 343   int cnt = 0;
 344   for (int mag = 0; mag < MagBuckets; mag++) {
 345     if (_hdr[mag] != NULL) {
 346       for (int val = 0; val < ValBuckets; val++) {
 347         cnt += _hdr[mag][val];
 348         if (cnt >= target) {
 349           return pow(10.0, MagMinimum + mag) * val / ValBuckets;
 350         }
 351       }
 352     }
 353   }
 354   return maximum();
 355 }
 356 
 357 BinaryMagnitudeSeq::BinaryMagnitudeSeq() {
 358   _mags = NEW_C_HEAP_ARRAY(jlong, BitsPerJavaLong, mtInternal);
 359   for (int c = 0; c < BitsPerJavaLong; c++) {
 360     _mags[c] = 0;
 361   }

 362 }
 363 
 364 BinaryMagnitudeSeq::~BinaryMagnitudeSeq() {
 365   FREE_C_HEAP_ARRAY(size_t, _mags, mtInternal);
 366 }
 367 
 368 void BinaryMagnitudeSeq::add(size_t val) {


 369   int mag = log2_intptr(val) + 1;
 370 
 371   // Defensively saturate for product bits:
 372   if (mag < 0) {
 373     assert (false, err_msg("bucket index (%d) underflow for value (" SIZE_FORMAT ")", mag, val));
 374     mag = 0;
 375   }
 376 
 377   if (mag >= BitsPerJavaLong) {
 378     assert (false, err_msg("bucket index (%d) overflow for value (" SIZE_FORMAT ")", mag, val));
 379     mag = BitsPerJavaLong - 1;
 380   }
 381 
 382   Atomic::add(1, &_mags[mag]);
 383 }
 384 
 385 size_t BinaryMagnitudeSeq::level(int level) const {
 386   if (0 <= level && level < BitsPerJavaLong) {
 387     return _mags[level];
 388   } else {
 389     return 0;
 390   }
 391 }
 392 
 393 size_t BinaryMagnitudeSeq::num() const {
 394   int r = 0;
 395   for (int c = 0; c < BitsPerJavaLong; c++) {
 396     r += _mags[c];
 397   }
 398   return r;




 399 }
 400 
 401 int BinaryMagnitudeSeq::min_level() const {
 402   for (int c = 0; c < BitsPerJavaLong; c++) {
 403     if (_mags[c] != 0) {
 404       return c;
 405     }
 406   }
 407   return BitsPerJavaLong - 1;
 408 }
 409 
 410 int BinaryMagnitudeSeq::max_level() const {
 411   for (int c = BitsPerJavaLong - 1; c > 0; c--) {
 412     if (_mags[c] != 0) {
 413       return c;
 414     }
 415   }
 416   return 0;
 417 }
 418 


 342   int target = MAX2(1, (int) (level * num() / 100));
 343   int cnt = 0;
 344   for (int mag = 0; mag < MagBuckets; mag++) {
 345     if (_hdr[mag] != NULL) {
 346       for (int val = 0; val < ValBuckets; val++) {
 347         cnt += _hdr[mag][val];
 348         if (cnt >= target) {
 349           return pow(10.0, MagMinimum + mag) * val / ValBuckets;
 350         }
 351       }
 352     }
 353   }
 354   return maximum();
 355 }
 356 
 357 BinaryMagnitudeSeq::BinaryMagnitudeSeq() {
 358   _mags = NEW_C_HEAP_ARRAY(jlong, BitsPerJavaLong, mtInternal);
 359   for (int c = 0; c < BitsPerJavaLong; c++) {
 360     _mags[c] = 0;
 361   }
 362   _sum = 0;
 363 }
 364 
 365 BinaryMagnitudeSeq::~BinaryMagnitudeSeq() {
 366   FREE_C_HEAP_ARRAY(size_t, _mags, mtInternal);
 367 }
 368 
 369 void BinaryMagnitudeSeq::add(size_t val) {
 370   Atomic::add(val, &_sum);
 371 
 372   int mag = log2_intptr(val) + 1;
 373 
 374   // Defensively saturate for product bits:
 375   if (mag < 0) {
 376     assert (false, err_msg("bucket index (%d) underflow for value (" SIZE_FORMAT ")", mag, val));
 377     mag = 0;
 378   }
 379 
 380   if (mag >= BitsPerJavaLong) {
 381     assert (false, err_msg("bucket index (%d) overflow for value (" SIZE_FORMAT ")", mag, val));
 382     mag = BitsPerJavaLong - 1;
 383   }
 384 
 385   Atomic::add(1, &_mags[mag]);
 386 }
 387 
 388 size_t BinaryMagnitudeSeq::level(int level) const {
 389   if (0 <= level && level < BitsPerJavaLong) {
 390     return _mags[level];
 391   } else {
 392     return 0;
 393   }
 394 }
 395 
 396 size_t BinaryMagnitudeSeq::num() const {
 397   int r = 0;
 398   for (int c = 0; c < BitsPerJavaLong; c++) {
 399     r += _mags[c];
 400   }
 401   return r;
 402 }
 403 
 404 size_t BinaryMagnitudeSeq::sum() const {
 405   return _sum;
 406 }
 407 
 408 int BinaryMagnitudeSeq::min_level() const {
 409   for (int c = 0; c < BitsPerJavaLong; c++) {
 410     if (_mags[c] != 0) {
 411       return c;
 412     }
 413   }
 414   return BitsPerJavaLong - 1;
 415 }
 416 
 417 int BinaryMagnitudeSeq::max_level() const {
 418   for (int c = BitsPerJavaLong - 1; c > 0; c--) {
 419     if (_mags[c] != 0) {
 420       return c;
 421     }
 422   }
 423   return 0;
 424 }
 425 
< prev index next >