76 return fr.pc(); 77 } else { 78 return NULL; 79 } 80 } 81 82 int os::get_last_error() { 83 return errno; 84 } 85 86 bool os::is_debugger_attached() { 87 // not implemented 88 return false; 89 } 90 91 void os::wait_for_keypress_at_exit(void) { 92 // don't do anything on posix platforms 93 return; 94 } 95 96 void os::Posix::print_load_average(outputStream* st) { 97 st->print("load average:"); 98 double loadavg[3]; 99 os::loadavg(loadavg, 3); 100 st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); 101 st->cr(); 102 } 103 104 void os::Posix::print_rlimit_info(outputStream* st) { 105 st->print("rlimit:"); 106 struct rlimit rlim; 107 108 st->print(" STACK "); 109 getrlimit(RLIMIT_STACK, &rlim); 110 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 111 else st->print("%uk", rlim.rlim_cur >> 10); 112 113 st->print(", CORE "); 114 getrlimit(RLIMIT_CORE, &rlim); 115 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); | 76 return fr.pc(); 77 } else { 78 return NULL; 79 } 80 } 81 82 int os::get_last_error() { 83 return errno; 84 } 85 86 bool os::is_debugger_attached() { 87 // not implemented 88 return false; 89 } 90 91 void os::wait_for_keypress_at_exit(void) { 92 // don't do anything on posix platforms 93 return; 94 } 95 96 char* os::reserve_memory_aligned(size_t bytes, size_t alignment) { 97 size_t size = align_size_up(bytes, alignment); 98 size_t extra_size = size + alignment; 99 char* extra_base = os::reserve_memory(extra_size, NULL, alignment); 100 101 if (extra_base == NULL) { 102 return NULL; 103 } 104 105 // Do manual alignment 106 char* aligned_base = (char*) align_size_up((uintptr_t) extra_base, alignment); 107 108 // [ | | ] 109 // ^ extra_base 110 // ^ extra_base + begin_offset == aligned_base 111 // extra_base + begin_offset + size ^ 112 // extra_base + extra_size ^ 113 // |<>| == begin_offset 114 // end_offset == |<>| 115 size_t begin_offset = aligned_base - extra_base; 116 size_t end_offset = (extra_base + extra_size) - (aligned_base + size); 117 118 if (begin_offset > 0) { 119 os::release_memory(extra_base, begin_offset); 120 } 121 122 if (end_offset > 0) { 123 os::release_memory(extra_base + begin_offset + size, end_offset); 124 } 125 126 return aligned_base; 127 } 128 129 void os::Posix::print_load_average(outputStream* st) { 130 st->print("load average:"); 131 double loadavg[3]; 132 os::loadavg(loadavg, 3); 133 st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); 134 st->cr(); 135 } 136 137 void os::Posix::print_rlimit_info(outputStream* st) { 138 st->print("rlimit:"); 139 struct rlimit rlim; 140 141 st->print(" STACK "); 142 getrlimit(RLIMIT_STACK, &rlim); 143 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); 144 else st->print("%uk", rlim.rlim_cur >> 10); 145 146 st->print(", CORE "); 147 getrlimit(RLIMIT_CORE, &rlim); 148 if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); |