1746 local_sem_wait(); 1747 1748 // were we externally suspended while we were waiting? 1749 threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); 1750 if (threadIsSuspended) { 1751 // 1752 // The semaphore has been incremented, but while we were waiting 1753 // another thread suspended us. We don't want to continue running 1754 // while suspended because that would surprise the thread that 1755 // suspended us. 1756 // 1757 1758 local_sem_post(); 1759 1760 thread->java_suspend_self(); 1761 } 1762 } while (threadIsSuspended); 1763 } 1764 } 1765 1766 int os::signal_lookup() { 1767 return check_pending_signals(false); 1768 } 1769 1770 int os::signal_wait() { 1771 return check_pending_signals(true); 1772 } 1773 1774 //////////////////////////////////////////////////////////////////////////////// 1775 // Virtual Memory 1776 1777 // We need to keep small simple bookkeeping for os::reserve_memory and friends. 1778 1779 #define VMEM_MAPPED 1 1780 #define VMEM_SHMATED 2 1781 1782 struct vmembk_t { 1783 int type; // 1 - mmap, 2 - shmat 1784 char* addr; 1785 size_t size; // Real size, may be larger than usersize. 1786 size_t pagesize; // page size of area 1787 vmembk_t* next; 1788 1789 bool contains_addr(char* p) const { | 1746 local_sem_wait(); 1747 1748 // were we externally suspended while we were waiting? 1749 threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); 1750 if (threadIsSuspended) { 1751 // 1752 // The semaphore has been incremented, but while we were waiting 1753 // another thread suspended us. We don't want to continue running 1754 // while suspended because that would surprise the thread that 1755 // suspended us. 1756 // 1757 1758 local_sem_post(); 1759 1760 thread->java_suspend_self(); 1761 } 1762 } while (threadIsSuspended); 1763 } 1764 } 1765 1766 int os::signal_wait() { 1767 return check_pending_signals(true); 1768 } 1769 1770 //////////////////////////////////////////////////////////////////////////////// 1771 // Virtual Memory 1772 1773 // We need to keep small simple bookkeeping for os::reserve_memory and friends. 1774 1775 #define VMEM_MAPPED 1 1776 #define VMEM_SHMATED 2 1777 1778 struct vmembk_t { 1779 int type; // 1 - mmap, 2 - shmat 1780 char* addr; 1781 size_t size; // Real size, may be larger than usersize. 1782 size_t pagesize; // page size of area 1783 vmembk_t* next; 1784 1785 bool contains_addr(char* p) const { |