Mercurial > hg > truffle
comparison src/os/windows/vm/os_windows.cpp @ 7632:2ef7061f13b4
Merge
author | zgu |
---|---|
date | Tue, 22 Jan 2013 11:54:16 -0800 |
parents | edd23b35b1a5 22ba8c8ce6a6 |
children | 3ac7d10a6572 9fae07c31641 |
comparison
equal
deleted
inserted
replaced
7631:edd23b35b1a5 | 7632:2ef7061f13b4 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
2958 if (res == NULL) { | 2958 if (res == NULL) { |
2959 warning("NUMA page allocation failed"); | 2959 warning("NUMA page allocation failed"); |
2960 } | 2960 } |
2961 if( Verbose && PrintMiscellaneous ) { | 2961 if( Verbose && PrintMiscellaneous ) { |
2962 reserveTimer.stop(); | 2962 reserveTimer.stop(); |
2963 tty->print_cr("reserve_memory of %Ix bytes took %ld ms (%ld ticks)", bytes, | 2963 tty->print_cr("reserve_memory of %Ix bytes took " JLONG_FORMAT " ms (" JLONG_FORMAT " ticks)", bytes, |
2964 reserveTimer.milliseconds(), reserveTimer.ticks()); | 2964 reserveTimer.milliseconds(), reserveTimer.ticks()); |
2965 } | 2965 } |
2966 } | 2966 } |
2967 assert(res == NULL || addr == NULL || addr == res, | 2967 assert(res == NULL || addr == NULL || addr == res, |
2968 "Unexpected address from reserve."); | 2968 "Unexpected address from reserve."); |
4317 hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, | 4317 hFile = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, |
4318 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); | 4318 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); |
4319 if (hFile == NULL) { | 4319 if (hFile == NULL) { |
4320 if (PrintMiscellaneous && Verbose) { | 4320 if (PrintMiscellaneous && Verbose) { |
4321 DWORD err = GetLastError(); | 4321 DWORD err = GetLastError(); |
4322 tty->print_cr("CreateFile() failed: GetLastError->%ld."); | 4322 tty->print_cr("CreateFile() failed: GetLastError->%ld.", err); |
4323 } | 4323 } |
4324 return NULL; | 4324 return NULL; |
4325 } | 4325 } |
4326 | 4326 |
4327 if (allow_exec) { | 4327 if (allow_exec) { |
4367 HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0, | 4367 HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, 0, |
4368 NULL /*file_name*/); | 4368 NULL /*file_name*/); |
4369 if (hMap == NULL) { | 4369 if (hMap == NULL) { |
4370 if (PrintMiscellaneous && Verbose) { | 4370 if (PrintMiscellaneous && Verbose) { |
4371 DWORD err = GetLastError(); | 4371 DWORD err = GetLastError(); |
4372 tty->print_cr("CreateFileMapping() failed: GetLastError->%ld."); | 4372 tty->print_cr("CreateFileMapping() failed: GetLastError->%ld.", err); |
4373 } | 4373 } |
4374 CloseHandle(hFile); | 4374 CloseHandle(hFile); |
4375 return NULL; | 4375 return NULL; |
4376 } | 4376 } |
4377 | 4377 |
4577 Millis -= prd ; | 4577 Millis -= prd ; |
4578 } | 4578 } |
4579 } | 4579 } |
4580 v = _Event ; | 4580 v = _Event ; |
4581 _Event = 0 ; | 4581 _Event = 0 ; |
4582 // see comment at end of os::PlatformEvent::park() below: | |
4582 OrderAccess::fence() ; | 4583 OrderAccess::fence() ; |
4583 // If we encounter a nearly simultanous timeout expiry and unpark() | 4584 // If we encounter a nearly simultanous timeout expiry and unpark() |
4584 // we return OS_OK indicating we awoke via unpark(). | 4585 // we return OS_OK indicating we awoke via unpark(). |
4585 // Implementor's license -- returning OS_TIMEOUT would be equally valid, however. | 4586 // Implementor's license -- returning OS_TIMEOUT would be equally valid, however. |
4586 return (v >= 0) ? OS_OK : OS_TIMEOUT ; | 4587 return (v >= 0) ? OS_OK : OS_TIMEOUT ; |
4614 guarantee (_Event >= 0, "invariant") ; | 4615 guarantee (_Event >= 0, "invariant") ; |
4615 } | 4616 } |
4616 | 4617 |
4617 void os::PlatformEvent::unpark() { | 4618 void os::PlatformEvent::unpark() { |
4618 guarantee (_ParkHandle != NULL, "Invariant") ; | 4619 guarantee (_ParkHandle != NULL, "Invariant") ; |
4619 int v ; | 4620 |
4620 for (;;) { | 4621 // Transitions for _Event: |
4621 v = _Event ; // Increment _Event if it's < 1. | 4622 // 0 :=> 1 |
4622 if (v > 0) { | 4623 // 1 :=> 1 |
4623 // If it's already signaled just return. | 4624 // -1 :=> either 0 or 1; must signal target thread |
4624 // The LD of _Event could have reordered or be satisfied | 4625 // That is, we can safely transition _Event from -1 to either |
4625 // by a read-aside from this processor's write buffer. | 4626 // 0 or 1. Forcing 1 is slightly more efficient for back-to-back |
4626 // To avoid problems execute a barrier and then | 4627 // unpark() calls. |
4627 // ratify the value. A degenerate CAS() would also work. | 4628 // See also: "Semaphores in Plan 9" by Mullender & Cox |
4628 // Viz., CAS (v+0, &_Event, v) == v). | 4629 // |
4629 OrderAccess::fence() ; | 4630 // Note: Forcing a transition from "-1" to "1" on an unpark() means |
4630 if (_Event == v) return ; | 4631 // that it will take two back-to-back park() calls for the owning |
4631 continue ; | 4632 // thread to block. This has the benefit of forcing a spurious return |
4632 } | 4633 // from the first park() call after an unpark() call which will help |
4633 if (Atomic::cmpxchg (v+1, &_Event, v) == v) break ; | 4634 // shake out uses of park() and unpark() without condition variables. |
4634 } | 4635 |
4635 if (v < 0) { | 4636 if (Atomic::xchg(1, &_Event) >= 0) return; |
4636 ::SetEvent (_ParkHandle) ; | 4637 |
4637 } | 4638 ::SetEvent(_ParkHandle); |
4638 } | 4639 } |
4639 | 4640 |
4640 | 4641 |
4641 // JSR166 | 4642 // JSR166 |
4642 // ------------------------------------------------------- | 4643 // ------------------------------------------------------- |