Mercurial > hg > truffle
comparison src/os/linux/vm/os_linux.cpp @ 9088:89e4d67fdd2a
Merge
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Fri, 12 Apr 2013 14:05:42 +0200 |
parents | b9a918201d47 8be1318fbe77 |
children | 836a62f43af9 |
comparison
equal
deleted
inserted
replaced
9037:b008f40b67d0 | 9088:89e4d67fdd2a |
---|---|
174 #endif // JAVASE_EMBEDDED | 174 #endif // JAVASE_EMBEDDED |
175 | 175 |
176 // utility functions | 176 // utility functions |
177 | 177 |
178 static int SR_initialize(); | 178 static int SR_initialize(); |
179 static int SR_finalize(); | |
180 | 179 |
181 julong os::available_memory() { | 180 julong os::available_memory() { |
182 return Linux::available_memory(); | 181 return Linux::available_memory(); |
183 } | 182 } |
184 | 183 |
1631 snprintf(buffer, buflen, "lib%s.so", fname); | 1630 snprintf(buffer, buflen, "lib%s.so", fname); |
1632 retval = true; | 1631 retval = true; |
1633 } else if (strchr(pname, *os::path_separator()) != NULL) { | 1632 } else if (strchr(pname, *os::path_separator()) != NULL) { |
1634 int n; | 1633 int n; |
1635 char** pelements = split_path(pname, &n); | 1634 char** pelements = split_path(pname, &n); |
1635 if (pelements == NULL) { | |
1636 return false; | |
1637 } | |
1636 for (int i = 0 ; i < n ; i++) { | 1638 for (int i = 0 ; i < n ; i++) { |
1637 // Really shouldn't be NULL, but check can't hurt | 1639 // Really shouldn't be NULL, but check can't hurt |
1638 if (pelements[i] == NULL || strlen(pelements[i]) == 0) { | 1640 if (pelements[i] == NULL || strlen(pelements[i]) == 0) { |
1639 continue; // skip the empty path values | 1641 continue; // skip the empty path values |
1640 } | 1642 } |
3653 // Save signal flag | 3655 // Save signal flag |
3654 os::Linux::set_our_sigflags(SR_signum, act.sa_flags); | 3656 os::Linux::set_our_sigflags(SR_signum, act.sa_flags); |
3655 return 0; | 3657 return 0; |
3656 } | 3658 } |
3657 | 3659 |
3658 static int SR_finalize() { | |
3659 return 0; | |
3660 } | |
3661 | |
3662 | 3660 |
3663 // returns true on success and false on error - really an error is fatal | 3661 // returns true on success and false on error - really an error is fatal |
3664 // but this seems the normal response to library errors | 3662 // but this seems the normal response to library errors |
3665 static bool do_suspend(OSThread* osthread) { | 3663 static bool do_suspend(OSThread* osthread) { |
3666 // mark as suspended and send signal | 3664 // mark as suspended and send signal |
4498 } | 4496 } |
4499 | 4497 |
4500 //////////////////////////////////////////////////////////////////////////////// | 4498 //////////////////////////////////////////////////////////////////////////////// |
4501 // debug support | 4499 // debug support |
4502 | 4500 |
4503 static address same_page(address x, address y) { | |
4504 int page_bits = -os::vm_page_size(); | |
4505 if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits)) | |
4506 return x; | |
4507 else if (x > y) | |
4508 return (address)(intptr_t(y) | ~page_bits) + 1; | |
4509 else | |
4510 return (address)(intptr_t(y) & page_bits); | |
4511 } | |
4512 | |
4513 bool os::find(address addr, outputStream* st) { | 4501 bool os::find(address addr, outputStream* st) { |
4514 Dl_info dlinfo; | 4502 Dl_info dlinfo; |
4515 memset(&dlinfo, 0, sizeof(dlinfo)); | 4503 memset(&dlinfo, 0, sizeof(dlinfo)); |
4516 if (dladdr(addr, &dlinfo)) { | 4504 if (dladdr(addr, &dlinfo)) { |
4517 st->print(PTR_FORMAT ": ", addr); | 4505 st->print(PTR_FORMAT ": ", addr); |
4531 } | 4519 } |
4532 st->cr(); | 4520 st->cr(); |
4533 | 4521 |
4534 if (Verbose) { | 4522 if (Verbose) { |
4535 // decode some bytes around the PC | 4523 // decode some bytes around the PC |
4536 address begin = same_page(addr-40, addr); | 4524 address begin = clamp_address_in_page(addr-40, addr, os::vm_page_size()); |
4537 address end = same_page(addr+40, addr); | 4525 address end = clamp_address_in_page(addr+40, addr, os::vm_page_size()); |
4538 address lowest = (address) dlinfo.dli_sname; | 4526 address lowest = (address) dlinfo.dli_sname; |
4539 if (!lowest) lowest = (address) dlinfo.dli_fbase; | 4527 if (!lowest) lowest = (address) dlinfo.dli_fbase; |
4540 if (begin < lowest) begin = lowest; | 4528 if (begin < lowest) begin = lowest; |
4541 Dl_info dlinfo2; | 4529 Dl_info dlinfo2; |
4542 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr | 4530 if (dladdr(end, &dlinfo2) && dlinfo2.dli_saddr != dlinfo.dli_saddr |