mirror of
https://github.com/openjdk/jdk23u.git
synced 2025-12-10 00:07:53 -06:00
Merge
This commit is contained in:
commit
6f26d55846
@ -358,6 +358,11 @@ AC_DEFUN([TOOLCHAIN_EXTRACT_COMPILER_VERSION],
|
||||
# Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
# This is free software; see the source for copying conditions. There is NO
|
||||
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# or look like
|
||||
# gcc (GCC) 10.2.1 20200825 (Alibaba 10.2.1-3.8 2.32)
|
||||
# Copyright (C) 2020 Free Software Foundation, Inc.
|
||||
# This is free software; see the source for copying conditions. There is NO
|
||||
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
COMPILER_VERSION_OUTPUT=`$COMPILER --version 2>&1`
|
||||
# Check that this is likely to be GCC.
|
||||
$ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Free Software Foundation" > /dev/null
|
||||
@ -371,7 +376,8 @@ AC_DEFUN([TOOLCHAIN_EXTRACT_COMPILER_VERSION],
|
||||
COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \
|
||||
$SED -e 's/ *Copyright .*//'`
|
||||
COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \
|
||||
$SED -e 's/^.* \(@<:@1-9@:>@<:@0-9@:>@*\.@<:@0-9.@:>@*\)@<:@^0-9.@:>@.*$/\1/'`
|
||||
$AWK -F ')' '{print [$]2}' | \
|
||||
$AWK '{print [$]1}'`
|
||||
elif test "x$TOOLCHAIN_TYPE" = xclang; then
|
||||
# clang --version output typically looks like
|
||||
# Apple clang version 15.0.0 (clang-1500.3.9.4)
|
||||
|
||||
@ -786,7 +786,10 @@ public class CLDRConverter {
|
||||
String tzKey = Optional.ofNullable((String)handlerSupplMeta.get(tzid))
|
||||
.orElse(tzid);
|
||||
// Follow link, if needed
|
||||
var tzLink = tzdbLinks.get(tzKey);
|
||||
String tzLink = null;
|
||||
for (var k = tzKey; tzdbLinks.containsKey(k);) {
|
||||
k = tzLink = tzdbLinks.get(k);
|
||||
}
|
||||
if (tzLink == null && tzdbLinks.containsValue(tzKey)) {
|
||||
// reverse link search
|
||||
// this is needed as in tzdb, "America/Buenos_Aires" links to
|
||||
@ -1214,7 +1217,7 @@ public class CLDRConverter {
|
||||
private static Set<String> getAvailableZoneIds() {
|
||||
assert handlerMetaZones != null;
|
||||
if (AVAILABLE_TZIDS == null) {
|
||||
AVAILABLE_TZIDS = new HashSet<>(ZoneId.getAvailableZoneIds());
|
||||
AVAILABLE_TZIDS = new HashSet<>(Arrays.asList(TimeZone.getAvailableIDs()));
|
||||
AVAILABLE_TZIDS.addAll(handlerMetaZones.keySet());
|
||||
AVAILABLE_TZIDS.remove(MetaZonesParseHandler.NO_METAZONE_KEY);
|
||||
}
|
||||
@ -1372,6 +1375,7 @@ public class CLDRConverter {
|
||||
private static void generateTZDBShortNamesMap() throws IOException {
|
||||
Files.walk(Path.of(tzDataDir), 1, FileVisitOption.FOLLOW_LINKS)
|
||||
.filter(p -> p.toFile().isFile())
|
||||
.filter(p -> p.getFileName().toString().matches("africa|antarctica|asia|australasia|backward|etcetera|europe|northamerica|southamerica"))
|
||||
.forEach(p -> {
|
||||
try {
|
||||
String zone = null;
|
||||
@ -1394,43 +1398,41 @@ public class CLDRConverter {
|
||||
}
|
||||
// remove comments in-line
|
||||
line = line.replaceAll("[ \t]*#.*", "");
|
||||
|
||||
var tokens = line.split("[ \t]+", -1);
|
||||
var token0len = tokens.length > 0 ? tokens[0].length() : 0;
|
||||
// Zone line
|
||||
if (line.startsWith("Zone")) {
|
||||
if (token0len > 0 && tokens[0].regionMatches(true, 0, "Zone", 0, token0len)) {
|
||||
if (zone != null) {
|
||||
tzdbShortNamesMap.put(zone, format + NBSP + rule);
|
||||
}
|
||||
var zl = line.split("[ \t]+", -1);
|
||||
zone = zl[1];
|
||||
rule = zl[3];
|
||||
format = flipIfNeeded(inVanguard, zl[4]);
|
||||
zone = tokens[1];
|
||||
rule = tokens[3];
|
||||
format = flipIfNeeded(inVanguard, tokens[4]);
|
||||
} else {
|
||||
if (zone != null) {
|
||||
if (line.startsWith("Rule") ||
|
||||
line.startsWith("Link")) {
|
||||
if (token0len > 0 &&
|
||||
(tokens[0].regionMatches(true, 0, "Rule", 0, token0len) ||
|
||||
tokens[0].regionMatches(true, 0, "Link", 0, token0len))) {
|
||||
tzdbShortNamesMap.put(zone, format + NBSP + rule);
|
||||
zone = null;
|
||||
rule = null;
|
||||
format = null;
|
||||
} else {
|
||||
var s = line.split("[ \t]+", -1);
|
||||
rule = s[2];
|
||||
format = flipIfNeeded(inVanguard, s[3]);
|
||||
rule = tokens[2];
|
||||
format = flipIfNeeded(inVanguard, tokens[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Rule line
|
||||
if (line.startsWith("Rule")) {
|
||||
var rl = line.split("[ \t]+", -1);
|
||||
tzdbSubstLetters.put(rl[1] + NBSP + (rl[8].equals("0") ? STD : DST),
|
||||
rl[9].replace(NO_SUBST, ""));
|
||||
if (token0len > 0 && tokens[0].regionMatches(true, 0, "Rule", 0, token0len)) {
|
||||
tzdbSubstLetters.put(tokens[1] + NBSP + (tokens[8].equals("0") ? STD : DST),
|
||||
tokens[9].replace(NO_SUBST, ""));
|
||||
}
|
||||
|
||||
// Link line
|
||||
if (line.startsWith("Link")) {
|
||||
var ll = line.split("[ \t]+", -1);
|
||||
tzdbLinks.put(ll[2], ll[1]);
|
||||
if (token0len > 0 && tokens[0].regionMatches(true, 0, "Link", 0, token0len)) {
|
||||
tzdbLinks.put(tokens[2], tokens[1]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1491,13 +1493,14 @@ public class CLDRConverter {
|
||||
/*
|
||||
* Convert TZDB offsets to JDK's offsets, eg, "-08" to "GMT-08:00".
|
||||
* If it cannot recognize the pattern, return the argument as is.
|
||||
* Returning null results in generating the GMT format at runtime.
|
||||
*/
|
||||
private static String convertGMTName(String f) {
|
||||
try {
|
||||
// Should pre-fill GMT format once COMPAT is gone.
|
||||
// Till then, fall back to GMT format at runtime, after COMPAT short
|
||||
// names are populated
|
||||
ZoneOffset.of(f);
|
||||
if (!f.equals("%z")) {
|
||||
// Validate if the format is an offset
|
||||
ZoneOffset.of(f);
|
||||
}
|
||||
return null;
|
||||
} catch (DateTimeException dte) {
|
||||
// textual representation. return as is
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -164,7 +164,8 @@ class TzdbZoneRulesProvider {
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (line.startsWith("Zone")) { // parse Zone line
|
||||
int token0len = tokens.length > 0 ? tokens[0].length() : line.length();
|
||||
if (line.regionMatches(true, 0, "Zone", 0, token0len)) { // parse Zone line
|
||||
String name = tokens[1];
|
||||
if (excludedZones.contains(name)){
|
||||
continue;
|
||||
@ -182,13 +183,13 @@ class TzdbZoneRulesProvider {
|
||||
if (zLine.parse(tokens, 2)) {
|
||||
openZone = null;
|
||||
}
|
||||
} else if (line.startsWith("Rule")) { // parse Rule line
|
||||
} else if (line.regionMatches(true, 0, "Rule", 0, token0len)) { // parse Rule line
|
||||
String name = tokens[1];
|
||||
if (!rules.containsKey(name)) {
|
||||
rules.put(name, new ArrayList<RuleLine>(10));
|
||||
}
|
||||
rules.get(name).add(new RuleLine().parse(tokens));
|
||||
} else if (line.startsWith("Link")) { // parse link line
|
||||
} else if (line.regionMatches(true, 0, "Link", 0, token0len)) { // parse link line
|
||||
if (tokens.length >= 3) {
|
||||
String realId = tokens[1];
|
||||
String aliasId = tokens[2];
|
||||
@ -304,7 +305,7 @@ class TzdbZoneRulesProvider {
|
||||
month = parseMonth(tokens[off++]);
|
||||
if (off < tokens.length) {
|
||||
String dayRule = tokens[off++];
|
||||
if (dayRule.startsWith("last")) {
|
||||
if (dayRule.regionMatches(true, 0, "last", 0, 4)) {
|
||||
dayOfMonth = -1;
|
||||
dayOfWeek = parseDayOfWeek(dayRule.substring(4));
|
||||
adjustForwards = false;
|
||||
@ -355,42 +356,45 @@ class TzdbZoneRulesProvider {
|
||||
}
|
||||
|
||||
int parseYear(String year, int defaultYear) {
|
||||
switch (year.toLowerCase()) {
|
||||
case "min": return 1900;
|
||||
case "max": return Year.MAX_VALUE;
|
||||
case "only": return defaultYear;
|
||||
}
|
||||
int len = year.length();
|
||||
|
||||
if (year.regionMatches(true, 0, "minimum", 0, len)) return 1900;
|
||||
if (year.regionMatches(true, 0, "maximum", 0, len)) return Year.MAX_VALUE;
|
||||
if (year.regionMatches(true, 0, "only", 0, len)) return defaultYear;
|
||||
|
||||
return Integer.parseInt(year);
|
||||
}
|
||||
|
||||
Month parseMonth(String mon) {
|
||||
switch (mon) {
|
||||
case "Jan": return Month.JANUARY;
|
||||
case "Feb": return Month.FEBRUARY;
|
||||
case "Mar": return Month.MARCH;
|
||||
case "Apr": return Month.APRIL;
|
||||
case "May": return Month.MAY;
|
||||
case "Jun": return Month.JUNE;
|
||||
case "Jul": return Month.JULY;
|
||||
case "Aug": return Month.AUGUST;
|
||||
case "Sep": return Month.SEPTEMBER;
|
||||
case "Oct": return Month.OCTOBER;
|
||||
case "Nov": return Month.NOVEMBER;
|
||||
case "Dec": return Month.DECEMBER;
|
||||
}
|
||||
int len = mon.length();
|
||||
|
||||
if (mon.regionMatches(true, 0, "January", 0, len)) return Month.JANUARY;
|
||||
if (mon.regionMatches(true, 0, "February", 0, len)) return Month.FEBRUARY;
|
||||
if (mon.regionMatches(true, 0, "March", 0, len)) return Month.MARCH;
|
||||
if (mon.regionMatches(true, 0, "April", 0, len)) return Month.APRIL;
|
||||
if (mon.regionMatches(true, 0, "May", 0, len)) return Month.MAY;
|
||||
if (mon.regionMatches(true, 0, "June", 0, len)) return Month.JUNE;
|
||||
if (mon.regionMatches(true, 0, "July", 0, len)) return Month.JULY;
|
||||
if (mon.regionMatches(true, 0, "August", 0, len)) return Month.AUGUST;
|
||||
if (mon.regionMatches(true, 0, "September", 0, len)) return Month.SEPTEMBER;
|
||||
if (mon.regionMatches(true, 0, "October", 0, len)) return Month.OCTOBER;
|
||||
if (mon.regionMatches(true, 0, "November", 0, len)) return Month.NOVEMBER;
|
||||
if (mon.regionMatches(true, 0, "December", 0, len)) return Month.DECEMBER;
|
||||
|
||||
throw new IllegalArgumentException("Unknown month: " + mon);
|
||||
}
|
||||
|
||||
DayOfWeek parseDayOfWeek(String dow) {
|
||||
switch (dow) {
|
||||
case "Mon": return DayOfWeek.MONDAY;
|
||||
case "Tue": return DayOfWeek.TUESDAY;
|
||||
case "Wed": return DayOfWeek.WEDNESDAY;
|
||||
case "Thu": return DayOfWeek.THURSDAY;
|
||||
case "Fri": return DayOfWeek.FRIDAY;
|
||||
case "Sat": return DayOfWeek.SATURDAY;
|
||||
case "Sun": return DayOfWeek.SUNDAY;
|
||||
}
|
||||
int len = dow.length();
|
||||
|
||||
if (dow.regionMatches(true, 0, "Monday", 0, len)) return DayOfWeek.MONDAY;
|
||||
if (dow.regionMatches(true, 0, "Tuesday", 0, len)) return DayOfWeek.TUESDAY;
|
||||
if (dow.regionMatches(true, 0, "Wednesday", 0, len)) return DayOfWeek.WEDNESDAY;
|
||||
if (dow.regionMatches(true, 0, "Thursday", 0, len)) return DayOfWeek.THURSDAY;
|
||||
if (dow.regionMatches(true, 0, "Friday", 0, len)) return DayOfWeek.FRIDAY;
|
||||
if (dow.regionMatches(true, 0, "Saturday", 0, len)) return DayOfWeek.SATURDAY;
|
||||
if (dow.regionMatches(true, 0, "Sunday", 0, len)) return DayOfWeek.SUNDAY;
|
||||
|
||||
throw new IllegalArgumentException("Unknown day-of-week: " + dow);
|
||||
}
|
||||
|
||||
|
||||
@ -114,6 +114,8 @@ ifeq ($(call isTargetOs, linux), true)
|
||||
# stripping during the test libraries' build.
|
||||
BUILD_JDK_JTREG_LIBRARIES_CFLAGS_libFib := -g
|
||||
BUILD_JDK_JTREG_LIBRARIES_STRIP_SYMBOLS_libFib := false
|
||||
# nio tests' libCreationTimeHelper native needs -ldl linker flag
|
||||
BUILD_JDK_JTREG_LIBRARIES_LDFLAGS_libCreationTimeHelper := -ldl
|
||||
endif
|
||||
|
||||
ifeq ($(ASAN_ENABLED), true)
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -27,6 +27,7 @@
|
||||
#include "asm/macroAssembler.hpp"
|
||||
#include "classfile/javaClasses.inline.hpp"
|
||||
#include "classfile/vmClasses.hpp"
|
||||
#include "compiler/disassembler.hpp"
|
||||
#include "interpreter/interpreter.hpp"
|
||||
#include "interpreter/interpreterRuntime.hpp"
|
||||
#include "memory/allocation.inline.hpp"
|
||||
@ -36,7 +37,7 @@
|
||||
#include "runtime/frame.inline.hpp"
|
||||
#include "runtime/stubRoutines.hpp"
|
||||
|
||||
#define __ _masm->
|
||||
#define __ Disassembler::hook<MacroAssembler>(__FILE__, __LINE__, _masm)->
|
||||
|
||||
#ifdef PRODUCT
|
||||
#define BLOCK_COMMENT(str) /* nothing */
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/macroAssembler.inline.hpp"
|
||||
#include "classfile/javaClasses.hpp"
|
||||
#include "compiler/disassembler.hpp"
|
||||
#include "compiler/compiler_globals.hpp"
|
||||
#include "gc/shared/barrierSetAssembler.hpp"
|
||||
#include "interpreter/bytecodeHistogram.hpp"
|
||||
@ -67,7 +68,7 @@
|
||||
// Max size with JVMTI
|
||||
int TemplateInterpreter::InterpreterCodeSize = 200 * 1024;
|
||||
|
||||
#define __ _masm->
|
||||
#define __ Disassembler::hook<InterpreterMacroAssembler>(__FILE__, __LINE__, _masm)->
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@ -2011,13 +2012,21 @@ void TemplateInterpreterGenerator::set_vtos_entry_points(Template* t,
|
||||
address& vep) {
|
||||
assert(t->is_valid() && t->tos_in() == vtos, "illegal template");
|
||||
Label L;
|
||||
aep = __ pc(); __ push_ptr(); __ b(L);
|
||||
fep = __ pc(); __ push_f(); __ b(L);
|
||||
dep = __ pc(); __ push_d(); __ b(L);
|
||||
lep = __ pc(); __ push_l(); __ b(L);
|
||||
bep = cep = sep =
|
||||
iep = __ pc(); __ push_i();
|
||||
vep = __ pc();
|
||||
aep = __ pc(); // atos entry point
|
||||
__ push_ptr();
|
||||
__ b(L);
|
||||
fep = __ pc(); // ftos entry point
|
||||
__ push_f();
|
||||
__ b(L);
|
||||
dep = __ pc(); // dtos entry point
|
||||
__ push_d();
|
||||
__ b(L);
|
||||
lep = __ pc(); // ltos entry point
|
||||
__ push_l();
|
||||
__ b(L);
|
||||
bep = cep = sep = iep = __ pc(); // [bcsi]tos entry point
|
||||
__ push_i();
|
||||
vep = __ pc(); // vtos entry point
|
||||
__ bind(L);
|
||||
generate_and_dispatch(t);
|
||||
}
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/macroAssembler.inline.hpp"
|
||||
#include "compiler/disassembler.hpp"
|
||||
#include "compiler/compilerDefinitions.inline.hpp"
|
||||
#include "gc/shared/barrierSetAssembler.hpp"
|
||||
#include "gc/shared/collectedHeap.hpp"
|
||||
@ -49,7 +50,7 @@
|
||||
#include "runtime/synchronizer.hpp"
|
||||
#include "utilities/powerOfTwo.hpp"
|
||||
|
||||
#define __ _masm->
|
||||
#define __ Disassembler::hook<InterpreterMacroAssembler>(__FILE__, __LINE__, _masm)->
|
||||
|
||||
// Address computation: local variables
|
||||
|
||||
|
||||
@ -117,9 +117,9 @@ bool frame::safe_for_sender(JavaThread *thread) {
|
||||
return false;
|
||||
}
|
||||
|
||||
common_abi* sender_abi = (common_abi*) fp;
|
||||
volatile common_abi* sender_abi = (common_abi*) fp; // May get updated concurrently by deoptimization!
|
||||
intptr_t* sender_sp = (intptr_t*) fp;
|
||||
address sender_pc = (address) sender_abi->lr;;
|
||||
address sender_pc = (address) sender_abi->lr;
|
||||
|
||||
if (Continuation::is_return_barrier_entry(sender_pc)) {
|
||||
// If our sender_pc is the return barrier, then our "real" sender is the continuation entry
|
||||
@ -134,9 +134,18 @@ bool frame::safe_for_sender(JavaThread *thread) {
|
||||
return false;
|
||||
}
|
||||
|
||||
intptr_t* unextended_sender_sp = is_interpreted_frame() ? interpreter_frame_sender_sp() : sender_sp;
|
||||
|
||||
// If the sender is a deoptimized nmethod we need to check if the original pc is valid.
|
||||
nmethod* sender_nm = sender_blob->as_nmethod_or_null();
|
||||
if (sender_nm != nullptr && sender_nm->is_deopt_pc(sender_pc)) {
|
||||
address orig_pc = *(address*)((address)unextended_sender_sp + sender_nm->orig_pc_offset());
|
||||
if (!sender_nm->insts_contains_inclusive(orig_pc)) return false;
|
||||
}
|
||||
|
||||
// It should be safe to construct the sender though it might not be valid.
|
||||
|
||||
frame sender(sender_sp, sender_pc, nullptr /* unextended_sp */, nullptr /* fp */, sender_blob);
|
||||
frame sender(sender_sp, sender_pc, unextended_sender_sp, nullptr /* fp */, sender_blob);
|
||||
|
||||
// Do we have a valid fp?
|
||||
address sender_fp = (address) sender.fp();
|
||||
|
||||
@ -52,11 +52,11 @@ static void x_load_barrier_slow_path(MacroAssembler* masm, const MachNode* node,
|
||||
%}
|
||||
|
||||
// Load Pointer
|
||||
instruct xLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
|
||||
instruct xLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp, rFlagsReg cr)
|
||||
%{
|
||||
match(Set dst (LoadP mem));
|
||||
predicate(UseZGC && !ZGenerational && (n->as_Load()->barrier_data() != 0));
|
||||
effect(TEMP dst, TEMP tmp);
|
||||
effect(TEMP dst, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(4 * DEFAULT_COST);
|
||||
|
||||
@ -71,11 +71,11 @@ instruct xLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
|
||||
ins_pipe(iload_reg_mem);
|
||||
%}
|
||||
|
||||
instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
|
||||
instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
|
||||
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && !ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() == XLoadBarrierStrong);
|
||||
effect(TEMP_DEF res, TEMP tmp);
|
||||
effect(TEMP_DEF res, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -105,11 +105,11 @@ instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newva
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
|
||||
instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
|
||||
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && !ZGenerational && needs_acquiring_load_reserved(n) && (n->as_LoadStore()->barrier_data() == XLoadBarrierStrong));
|
||||
effect(TEMP_DEF res, TEMP tmp);
|
||||
effect(TEMP_DEF res, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -139,10 +139,10 @@ instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP ne
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
|
||||
instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
|
||||
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && !ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() == XLoadBarrierStrong);
|
||||
effect(TEMP_DEF res, TEMP tmp);
|
||||
effect(TEMP_DEF res, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -167,10 +167,10 @@ instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP n
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
|
||||
instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
|
||||
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && !ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() == XLoadBarrierStrong);
|
||||
effect(TEMP_DEF res, TEMP tmp);
|
||||
effect(TEMP_DEF res, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -195,10 +195,10 @@ instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iReg
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct xGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
instruct xGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp, rFlagsReg cr) %{
|
||||
match(Set prev (GetAndSetP mem newv));
|
||||
predicate(UseZGC && !ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP_DEF prev, TEMP tmp);
|
||||
effect(TEMP_DEF prev, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -212,10 +212,10 @@ instruct xGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
ins_pipe(pipe_serial);
|
||||
%}
|
||||
|
||||
instruct xGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
instruct xGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp, rFlagsReg cr) %{
|
||||
match(Set prev (GetAndSetP mem newv));
|
||||
predicate(UseZGC && !ZGenerational && needs_acquiring_load_reserved(n) && (n->as_LoadStore()->barrier_data() != 0));
|
||||
effect(TEMP_DEF prev, TEMP tmp);
|
||||
effect(TEMP_DEF prev, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(VOLATILE_REF_COST);
|
||||
|
||||
|
||||
@ -90,11 +90,11 @@ static void z_store_barrier(MacroAssembler* masm, const MachNode* node, Address
|
||||
%}
|
||||
|
||||
// Load Pointer
|
||||
instruct zLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
|
||||
instruct zLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp, rFlagsReg cr)
|
||||
%{
|
||||
match(Set dst (LoadP mem));
|
||||
predicate(UseZGC && ZGenerational && n->as_Load()->barrier_data() != 0);
|
||||
effect(TEMP dst, TEMP tmp);
|
||||
effect(TEMP dst, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(4 * DEFAULT_COST);
|
||||
|
||||
@ -110,11 +110,11 @@ instruct zLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
|
||||
%}
|
||||
|
||||
// Store Pointer
|
||||
instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp1, iRegPNoSp tmp2)
|
||||
instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp1, iRegPNoSp tmp2, rFlagsReg cr)
|
||||
%{
|
||||
predicate(UseZGC && ZGenerational && n->as_Store()->barrier_data() != 0);
|
||||
match(Set mem (StoreP mem src));
|
||||
effect(TEMP tmp1, TEMP tmp2);
|
||||
effect(TEMP tmp1, TEMP tmp2, KILL cr);
|
||||
|
||||
ins_cost(125); // XXX
|
||||
format %{ "sd $mem, $src\t# ptr" %}
|
||||
@ -127,11 +127,11 @@ instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp1, iRegPNoSp tmp2)
|
||||
%}
|
||||
|
||||
instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval,
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1, rFlagsReg cr) %{
|
||||
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -150,11 +150,11 @@ instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newva
|
||||
%}
|
||||
|
||||
instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval,
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1, rFlagsReg cr) %{
|
||||
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -173,10 +173,10 @@ instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP ne
|
||||
%}
|
||||
|
||||
instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval,
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1, rFlagsReg cr) %{
|
||||
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -195,10 +195,10 @@ instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP n
|
||||
%}
|
||||
|
||||
instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval,
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
|
||||
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1, rFlagsReg cr) %{
|
||||
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||
predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
|
||||
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -216,10 +216,10 @@ instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iReg
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp, rFlagsReg cr) %{
|
||||
match(Set prev (GetAndSetP mem newv));
|
||||
predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP_DEF prev, TEMP tmp);
|
||||
effect(TEMP_DEF prev, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
@ -234,10 +234,10 @@ instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
ins_pipe(pipe_serial);
|
||||
%}
|
||||
|
||||
instruct zGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
|
||||
instruct zGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp, rFlagsReg cr) %{
|
||||
match(Set prev (GetAndSetP mem newv));
|
||||
predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
|
||||
effect(TEMP_DEF prev, TEMP tmp);
|
||||
effect(TEMP_DEF prev, TEMP tmp, KILL cr);
|
||||
|
||||
ins_cost(2 * VOLATILE_REF_COST);
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
@ -28,6 +28,7 @@
|
||||
#include "asm/macroAssembler.hpp"
|
||||
#include "classfile/javaClasses.inline.hpp"
|
||||
#include "classfile/vmClasses.hpp"
|
||||
#include "compiler/disassembler.hpp"
|
||||
#include "interpreter/interpreter.hpp"
|
||||
#include "interpreter/interpreterRuntime.hpp"
|
||||
#include "memory/allocation.inline.hpp"
|
||||
@ -37,7 +38,7 @@
|
||||
#include "runtime/frame.inline.hpp"
|
||||
#include "runtime/stubRoutines.hpp"
|
||||
|
||||
#define __ _masm->
|
||||
#define __ Disassembler::hook<MacroAssembler>(__FILE__, __LINE__, _masm)->
|
||||
|
||||
#ifdef PRODUCT
|
||||
#define BLOCK_COMMENT(str) /* nothing */
|
||||
|
||||
@ -4801,11 +4801,10 @@ instruct gather_loadS(vReg dst, indirect mem, vReg idx) %{
|
||||
effect(TEMP_DEF dst);
|
||||
format %{ "gather_loadS $dst, $mem, $idx" %}
|
||||
ins_encode %{
|
||||
__ vmv1r_v(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg));
|
||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
|
||||
__ vsetvli_helper(bt, Matcher::vector_length(this));
|
||||
__ vsll_vi(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), (int)sew);
|
||||
__ vsll_vi(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg), (int)sew);
|
||||
__ vluxei32_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
|
||||
as_VectorRegister($dst$$reg));
|
||||
%}
|
||||
@ -4835,11 +4834,10 @@ instruct gather_loadS_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, v
|
||||
effect(TEMP_DEF dst, TEMP tmp);
|
||||
format %{ "gather_loadS_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
|
||||
ins_encode %{
|
||||
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
|
||||
BasicType bt = Matcher::vector_element_basic_type(this);
|
||||
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
|
||||
__ vsetvli_helper(bt, Matcher::vector_length(this));
|
||||
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
|
||||
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg), (int)sew);
|
||||
__ vxor_vv(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg),
|
||||
as_VectorRegister($dst$$reg));
|
||||
__ vluxei32_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
|
||||
@ -4875,11 +4873,10 @@ instruct scatter_storeS(indirect mem, vReg src, vReg idx, vReg tmp) %{
|
||||
effect(TEMP tmp);
|
||||
format %{ "scatter_storeS $mem, $idx, $src\t# KILL $tmp" %}
|
||||
ins_encode %{
|
||||
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
|
||||
BasicType bt = Matcher::vector_element_basic_type(this, $src);
|
||||
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
|
||||
__ vsetvli_helper(bt, Matcher::vector_length(this, $src));
|
||||
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
|
||||
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg), (int)sew);
|
||||
__ vsuxei32_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
|
||||
as_VectorRegister($tmp$$reg));
|
||||
%}
|
||||
@ -4909,11 +4906,10 @@ instruct scatter_storeS_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0,
|
||||
effect(TEMP tmp);
|
||||
format %{ "scatter_storeS_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
|
||||
ins_encode %{
|
||||
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
|
||||
BasicType bt = Matcher::vector_element_basic_type(this, $src);
|
||||
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
|
||||
__ vsetvli_helper(bt, Matcher::vector_length(this, $src));
|
||||
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
|
||||
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg), (int)sew);
|
||||
__ vsuxei32_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
|
||||
as_VectorRegister($tmp$$reg), Assembler::v0_t);
|
||||
%}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
|
||||
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
@ -27,6 +27,7 @@
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/macroAssembler.inline.hpp"
|
||||
#include "classfile/javaClasses.hpp"
|
||||
#include "compiler/disassembler.hpp"
|
||||
#include "gc/shared/barrierSetAssembler.hpp"
|
||||
#include "interpreter/bytecodeHistogram.hpp"
|
||||
#include "interpreter/bytecodeTracer.hpp"
|
||||
@ -70,7 +71,7 @@
|
||||
// Max size with JVMTI
|
||||
int TemplateInterpreter::InterpreterCodeSize = 256 * 1024;
|
||||
|
||||
#define __ _masm->
|
||||
#define __ Disassembler::hook<InterpreterMacroAssembler>(__FILE__, __LINE__, _masm)->
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@ -1748,13 +1749,21 @@ void TemplateInterpreterGenerator::set_vtos_entry_points(Template* t,
|
||||
address& vep) {
|
||||
assert(t != nullptr && t->is_valid() && t->tos_in() == vtos, "illegal template");
|
||||
Label L;
|
||||
aep = __ pc(); __ push_ptr(); __ j(L);
|
||||
fep = __ pc(); __ push_f(); __ j(L);
|
||||
dep = __ pc(); __ push_d(); __ j(L);
|
||||
lep = __ pc(); __ push_l(); __ j(L);
|
||||
bep = cep = sep =
|
||||
iep = __ pc(); __ push_i();
|
||||
vep = __ pc();
|
||||
aep = __ pc(); // atos entry point
|
||||
__ push_ptr();
|
||||
__ j(L);
|
||||
fep = __ pc(); // ftos entry point
|
||||
__ push_f();
|
||||
__ j(L);
|
||||
dep = __ pc(); // dtos entry point
|
||||
__ push_d();
|
||||
__ j(L);
|
||||
lep = __ pc(); // ltos entry point
|
||||
__ push_l();
|
||||
__ j(L);
|
||||
bep = cep = sep = iep = __ pc(); // [bcsi]tos entry point
|
||||
__ push_i();
|
||||
vep = __ pc(); // vtos entry point
|
||||
__ bind(L);
|
||||
generate_and_dispatch(t);
|
||||
}
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/macroAssembler.inline.hpp"
|
||||
#include "compiler/disassembler.hpp"
|
||||
#include "gc/shared/barrierSetAssembler.hpp"
|
||||
#include "gc/shared/collectedHeap.hpp"
|
||||
#include "gc/shared/tlab_globals.hpp"
|
||||
@ -49,7 +50,7 @@
|
||||
#include "runtime/synchronizer.hpp"
|
||||
#include "utilities/powerOfTwo.hpp"
|
||||
|
||||
#define __ _masm->
|
||||
#define __ Disassembler::hook<InterpreterMacroAssembler>(__FILE__, __LINE__, _masm)->
|
||||
|
||||
// Address computation: local variables
|
||||
|
||||
@ -178,7 +179,6 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
|
||||
__ la(temp_reg, Address(temp_reg, in_bytes(ResolvedFieldEntry::put_code_offset())));
|
||||
}
|
||||
// Load-acquire the bytecode to match store-release in ResolvedFieldEntry::fill_in()
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ lbu(temp_reg, Address(temp_reg, 0));
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
__ mv(bc_reg, bc);
|
||||
@ -320,7 +320,6 @@ void TemplateTable::ldc(LdcType type) {
|
||||
// get type
|
||||
__ addi(x13, x11, tags_offset);
|
||||
__ add(x13, x10, x13);
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ lbu(x13, Address(x13, 0));
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
|
||||
@ -2189,7 +2188,6 @@ void TemplateTable::resolve_cache_and_index_for_method(int byte_no,
|
||||
break;
|
||||
}
|
||||
// Load-acquire the bytecode to match store-release in InterpreterRuntime
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ lbu(temp, Address(temp, 0));
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
|
||||
@ -2241,7 +2239,6 @@ void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
|
||||
__ la(temp, Address(Rcache, in_bytes(ResolvedFieldEntry::put_code_offset())));
|
||||
}
|
||||
// Load-acquire the bytecode to match store-release in ResolvedFieldEntry::fill_in()
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ lbu(temp, Address(temp, 0));
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
__ mv(t0, (int) code); // have we resolved this bytecode?
|
||||
@ -2403,7 +2400,6 @@ void TemplateTable::load_invokedynamic_entry(Register method) {
|
||||
Label resolved;
|
||||
|
||||
__ load_resolved_indy_entry(cache, index);
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ ld(method, Address(cache, in_bytes(ResolvedIndyEntry::method_offset())));
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
|
||||
@ -2418,7 +2414,6 @@ void TemplateTable::load_invokedynamic_entry(Register method) {
|
||||
__ call_VM(noreg, entry, method);
|
||||
// Update registers with resolved info
|
||||
__ load_resolved_indy_entry(cache, index);
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ ld(method, Address(cache, in_bytes(ResolvedIndyEntry::method_offset())));
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
|
||||
@ -3533,7 +3528,6 @@ void TemplateTable::_new() {
|
||||
const int tags_offset = Array<u1>::base_offset_in_bytes();
|
||||
__ add(t0, x10, x13);
|
||||
__ la(t0, Address(t0, tags_offset));
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ lbu(t0, t0);
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
__ sub(t1, t0, (u1)JVM_CONSTANT_Class);
|
||||
@ -3652,7 +3646,6 @@ void TemplateTable::checkcast() {
|
||||
// See if bytecode has already been quicked
|
||||
__ add(t0, x13, Array<u1>::base_offset_in_bytes());
|
||||
__ add(x11, t0, x9);
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ lbu(x11, x11);
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
__ sub(t0, x11, (u1)JVM_CONSTANT_Class);
|
||||
@ -3708,7 +3701,6 @@ void TemplateTable::instanceof() {
|
||||
// See if bytecode has already been quicked
|
||||
__ add(t0, x13, Array<u1>::base_offset_in_bytes());
|
||||
__ add(x11, t0, x9);
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ lbu(x11, x11);
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
__ sub(t0, x11, (u1)JVM_CONSTANT_Class);
|
||||
|
||||
@ -1568,7 +1568,7 @@ void GraphBuilder::method_return(Value x, bool ignore_return) {
|
||||
// The conditions for a memory barrier are described in Parse::do_exits().
|
||||
bool need_mem_bar = false;
|
||||
if (method()->name() == ciSymbols::object_initializer_name() &&
|
||||
(scope()->wrote_final() ||
|
||||
(scope()->wrote_final() || scope()->wrote_stable() ||
|
||||
(AlwaysSafeConstructors && scope()->wrote_fields()) ||
|
||||
(support_IRIW_for_not_multiple_copy_atomic_cpu && scope()->wrote_volatile()))) {
|
||||
need_mem_bar = true;
|
||||
@ -1746,15 +1746,17 @@ void GraphBuilder::access_field(Bytecodes::Code code) {
|
||||
}
|
||||
}
|
||||
|
||||
if (field->is_final() && (code == Bytecodes::_putfield)) {
|
||||
scope()->set_wrote_final();
|
||||
}
|
||||
|
||||
if (code == Bytecodes::_putfield) {
|
||||
scope()->set_wrote_fields();
|
||||
if (field->is_volatile()) {
|
||||
scope()->set_wrote_volatile();
|
||||
}
|
||||
if (field->is_final()) {
|
||||
scope()->set_wrote_final();
|
||||
}
|
||||
if (field->is_stable()) {
|
||||
scope()->set_wrote_stable();
|
||||
}
|
||||
}
|
||||
|
||||
const int offset = !needs_patching ? field->offset_in_bytes() : -1;
|
||||
|
||||
@ -146,6 +146,7 @@ IRScope::IRScope(Compilation* compilation, IRScope* caller, int caller_bci, ciMe
|
||||
_wrote_final = false;
|
||||
_wrote_fields = false;
|
||||
_wrote_volatile = false;
|
||||
_wrote_stable = false;
|
||||
_start = nullptr;
|
||||
|
||||
if (osr_bci != -1) {
|
||||
|
||||
@ -149,6 +149,7 @@ class IRScope: public CompilationResourceObj {
|
||||
bool _wrote_final; // has written final field
|
||||
bool _wrote_fields; // has written fields
|
||||
bool _wrote_volatile; // has written volatile field
|
||||
bool _wrote_stable; // has written @Stable field
|
||||
BlockBegin* _start; // the start block, successsors are method entries
|
||||
|
||||
ResourceBitMap _requires_phi_function; // bit is set if phi functions at loop headers are necessary for a local variable
|
||||
@ -187,6 +188,8 @@ class IRScope: public CompilationResourceObj {
|
||||
bool wrote_fields () const { return _wrote_fields; }
|
||||
void set_wrote_volatile() { _wrote_volatile = true; }
|
||||
bool wrote_volatile () const { return _wrote_volatile; }
|
||||
void set_wrote_stable() { _wrote_stable = true; }
|
||||
bool wrote_stable() const { return _wrote_stable; }
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -1672,7 +1672,10 @@ void ciEnv::dump_replay_data_helper(outputStream* out) {
|
||||
for (int i = 0; i < objects->length(); i++) {
|
||||
objects->at(i)->dump_replay_data(out);
|
||||
}
|
||||
dump_compile_data(out);
|
||||
|
||||
if (this->task() != nullptr) {
|
||||
dump_compile_data(out);
|
||||
}
|
||||
out->flush();
|
||||
}
|
||||
|
||||
|
||||
@ -1434,19 +1434,12 @@ void java_lang_Class::compute_offsets() {
|
||||
|
||||
InstanceKlass* k = vmClasses::Class_klass();
|
||||
CLASS_FIELDS_DO(FIELD_COMPUTE_OFFSET);
|
||||
|
||||
// Init lock is a C union with component_mirror. Only instanceKlass mirrors have
|
||||
// init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops
|
||||
// GC treats them the same.
|
||||
_init_lock_offset = _component_mirror_offset;
|
||||
|
||||
CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
|
||||
}
|
||||
|
||||
#if INCLUDE_CDS
|
||||
void java_lang_Class::serialize_offsets(SerializeClosure* f) {
|
||||
f->do_bool(&_offsets_computed);
|
||||
f->do_u4((u4*)&_init_lock_offset);
|
||||
|
||||
CLASS_FIELDS_DO(FIELD_SERIALIZE_OFFSET);
|
||||
|
||||
|
||||
@ -210,6 +210,7 @@ class java_lang_String : AllStatic {
|
||||
macro(java_lang_Class, protection_domain, object_signature, false) \
|
||||
macro(java_lang_Class, signers, object_signature, false) \
|
||||
macro(java_lang_Class, source_file, object_signature, false) \
|
||||
macro(java_lang_Class, init_lock, object_signature, false)
|
||||
|
||||
class java_lang_Class : AllStatic {
|
||||
friend class VMStructs;
|
||||
|
||||
@ -897,7 +897,7 @@ void Dependencies::DepStream::print_dependency(outputStream* st, Klass* witness,
|
||||
void Dependencies::DepStream::initial_asserts(size_t byte_limit) {
|
||||
assert(must_be_in_vm(), "raw oops here");
|
||||
_byte_limit = byte_limit;
|
||||
_type = (DepType)(end_marker-1); // defeat "already at end" assert
|
||||
_type = undefined_dependency; // defeat "already at end" assert
|
||||
assert((_code!=nullptr) + (_deps!=nullptr) == 1, "one or t'other");
|
||||
}
|
||||
#endif //ASSERT
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -103,6 +103,9 @@ class Dependencies: public ResourceObj {
|
||||
// type now includes N, that is, all super types of N.
|
||||
//
|
||||
enum DepType {
|
||||
// _type is initially set to -1, to prevent "already at end" assert
|
||||
undefined_dependency = -1,
|
||||
|
||||
end_marker = 0,
|
||||
|
||||
// An 'evol' dependency simply notes that the contents of the
|
||||
|
||||
@ -153,10 +153,7 @@ bool ShenandoahConcurrentGC::collect(GCCause::Cause cause) {
|
||||
// the space. This would be the last action if there is nothing to evacuate.
|
||||
entry_cleanup_early();
|
||||
|
||||
{
|
||||
ShenandoahHeapLocker locker(heap->lock());
|
||||
heap->free_set()->log_status();
|
||||
}
|
||||
heap->free_set()->log_status_under_lock();
|
||||
|
||||
// Perform concurrent class unloading
|
||||
if (heap->unload_classes() &&
|
||||
@ -924,8 +921,11 @@ void ShenandoahConcurrentGC::op_init_updaterefs() {
|
||||
heap->set_evacuation_in_progress(false);
|
||||
heap->set_concurrent_weak_root_in_progress(false);
|
||||
heap->prepare_update_heap_references(true /*concurrent*/);
|
||||
heap->set_update_refs_in_progress(true);
|
||||
if (ShenandoahVerify) {
|
||||
heap->verifier()->verify_before_updaterefs();
|
||||
}
|
||||
|
||||
heap->set_update_refs_in_progress(true);
|
||||
if (ShenandoahPacing) {
|
||||
heap->pacer()->setup_for_updaterefs();
|
||||
}
|
||||
|
||||
@ -147,10 +147,7 @@ void ShenandoahControlThread::run_service() {
|
||||
heap->set_forced_counters_update(true);
|
||||
|
||||
// If GC was requested, we better dump freeset data for performance debugging
|
||||
{
|
||||
ShenandoahHeapLocker locker(heap->lock());
|
||||
heap->free_set()->log_status();
|
||||
}
|
||||
heap->free_set()->log_status_under_lock();
|
||||
|
||||
switch (mode) {
|
||||
case concurrent_normal:
|
||||
@ -178,19 +175,19 @@ void ShenandoahControlThread::run_service() {
|
||||
|
||||
// Report current free set state at the end of cycle, whether
|
||||
// it is a normal completion, or the abort.
|
||||
{
|
||||
ShenandoahHeapLocker locker(heap->lock());
|
||||
heap->free_set()->log_status();
|
||||
heap->free_set()->log_status_under_lock();
|
||||
|
||||
{
|
||||
// Notify Universe about new heap usage. This has implications for
|
||||
// global soft refs policy, and we better report it every time heap
|
||||
// usage goes down.
|
||||
ShenandoahHeapLocker locker(heap->lock());
|
||||
heap->update_capacity_and_used_at_gc();
|
||||
|
||||
// Signal that we have completed a visit to all live objects.
|
||||
heap->record_whole_heap_examined_timestamp();
|
||||
}
|
||||
|
||||
// Signal that we have completed a visit to all live objects.
|
||||
heap->record_whole_heap_examined_timestamp();
|
||||
|
||||
// Disable forced counters update, and update counters one more time
|
||||
// to capture the state at the end of GC session.
|
||||
heap->handle_force_counters_update();
|
||||
|
||||
@ -1130,6 +1130,16 @@ void ShenandoahFreeSet::reserve_regions(size_t to_reserve) {
|
||||
}
|
||||
}
|
||||
|
||||
void ShenandoahFreeSet::log_status_under_lock() {
|
||||
// Must not be heap locked, it acquires heap lock only when log is enabled
|
||||
shenandoah_assert_not_heaplocked();
|
||||
if (LogTarget(Info, gc, free)::is_enabled()
|
||||
DEBUG_ONLY(|| LogTarget(Debug, gc, free)::is_enabled())) {
|
||||
ShenandoahHeapLocker locker(_heap->lock());
|
||||
log_status();
|
||||
}
|
||||
}
|
||||
|
||||
void ShenandoahFreeSet::log_status() {
|
||||
shenandoah_assert_heaplocked();
|
||||
|
||||
@ -1329,7 +1339,6 @@ void ShenandoahFreeSet::print_on(outputStream* out) const {
|
||||
double ShenandoahFreeSet::internal_fragmentation() {
|
||||
double squared = 0;
|
||||
double linear = 0;
|
||||
int count = 0;
|
||||
|
||||
idx_t rightmost = _partitions.rightmost(ShenandoahFreeSetPartitionId::Mutator);
|
||||
for (idx_t index = _partitions.leftmost(ShenandoahFreeSetPartitionId::Mutator); index <= rightmost; ) {
|
||||
@ -1339,11 +1348,10 @@ double ShenandoahFreeSet::internal_fragmentation() {
|
||||
size_t used = r->used();
|
||||
squared += used * used;
|
||||
linear += used;
|
||||
count++;
|
||||
index = _partitions.find_index_of_next_available_region(ShenandoahFreeSetPartitionId::Mutator, index + 1);
|
||||
}
|
||||
|
||||
if (count > 0) {
|
||||
if (linear > 0) {
|
||||
double s = squared / (ShenandoahHeapRegion::region_size_bytes() * linear);
|
||||
return 1 - s;
|
||||
} else {
|
||||
|
||||
@ -318,6 +318,9 @@ private:
|
||||
|
||||
void finish_rebuild(size_t cset_regions);
|
||||
|
||||
// log status, assuming lock has already been acquired by the caller.
|
||||
void log_status();
|
||||
|
||||
public:
|
||||
ShenandoahFreeSet(ShenandoahHeap* heap, size_t max_regions);
|
||||
|
||||
@ -340,7 +343,8 @@ public:
|
||||
void move_regions_from_collector_to_mutator(size_t cset_regions);
|
||||
|
||||
void recycle_trash();
|
||||
void log_status();
|
||||
// Acquire heap lock and log status, assuming heap lock is not acquired by the caller.
|
||||
void log_status_under_lock();
|
||||
|
||||
inline size_t capacity() const { return _partitions.capacity_of(ShenandoahFreeSetPartitionId::Mutator); }
|
||||
inline size_t used() const { return _partitions.used_by(ShenandoahFreeSetPartitionId::Mutator); }
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "gc/shenandoah/shenandoahSimpleBitMap.hpp"
|
||||
#include "gc/shenandoah/shenandoahSimpleBitMap.inline.hpp"
|
||||
|
||||
ShenandoahSimpleBitMap::ShenandoahSimpleBitMap(size_t num_bits) :
|
||||
_num_bits(num_bits),
|
||||
@ -43,8 +43,8 @@ size_t ShenandoahSimpleBitMap::count_leading_ones(idx_t start_idx) const {
|
||||
assert((start_idx >= 0) && (start_idx < _num_bits), "precondition");
|
||||
size_t array_idx = start_idx >> LogBitsPerWord;
|
||||
uintx element_bits = _bitmap[array_idx];
|
||||
uintx bit_number = start_idx & right_n_bits(LogBitsPerWord);
|
||||
uintx mask = ~right_n_bits(bit_number);
|
||||
uintx bit_number = start_idx & (BitsPerWord - 1);
|
||||
uintx mask = ~tail_mask(bit_number);
|
||||
size_t counted_ones = 0;
|
||||
while ((element_bits & mask) == mask) {
|
||||
// All bits numbered >= bit_number are set
|
||||
@ -54,7 +54,7 @@ size_t ShenandoahSimpleBitMap::count_leading_ones(idx_t start_idx) const {
|
||||
// Strength reduction: array_idx = (start_idx >> LogBitsPerWord)
|
||||
array_idx++;
|
||||
element_bits = _bitmap[array_idx];
|
||||
// Constant folding: bit_number = start_idx & right_n_bits(LogBitsPerWord);
|
||||
// Constant folding: bit_number = start_idx & (BitsPerWord - 1);
|
||||
bit_number = 0;
|
||||
// Constant folding: mask = ~right_n_bits(bit_number);
|
||||
mask = ~0;
|
||||
@ -70,9 +70,9 @@ size_t ShenandoahSimpleBitMap::count_trailing_ones(idx_t last_idx) const {
|
||||
assert((last_idx >= 0) && (last_idx < _num_bits), "precondition");
|
||||
size_t array_idx = last_idx >> LogBitsPerWord;
|
||||
uintx element_bits = _bitmap[array_idx];
|
||||
uintx bit_number = last_idx & right_n_bits(LogBitsPerWord);
|
||||
uintx bit_number = last_idx & (BitsPerWord - 1);
|
||||
// All ones from bit 0 to the_bit
|
||||
uintx mask = right_n_bits(bit_number + 1);
|
||||
uintx mask = tail_mask(bit_number + 1);
|
||||
size_t counted_ones = 0;
|
||||
while ((element_bits & mask) == mask) {
|
||||
// All bits numbered <= bit_number are set
|
||||
@ -81,7 +81,7 @@ size_t ShenandoahSimpleBitMap::count_trailing_ones(idx_t last_idx) const {
|
||||
// Dead code: do not need to compute: last_idx -= found_ones;
|
||||
array_idx--;
|
||||
element_bits = _bitmap[array_idx];
|
||||
// Constant folding: bit_number = last_idx & right_n_bits(LogBitsPerWord);
|
||||
// Constant folding: bit_number = last_idx & (BitsPerWord - 1);
|
||||
bit_number = BitsPerWord - 1;
|
||||
// Constant folding: mask = right_n_bits(bit_number + 1);
|
||||
mask = ~0;
|
||||
@ -99,7 +99,7 @@ bool ShenandoahSimpleBitMap::is_forward_consecutive_ones(idx_t start_idx, idx_t
|
||||
start_idx, count);
|
||||
assert(start_idx + count <= (idx_t) _num_bits, "precondition");
|
||||
size_t array_idx = start_idx >> LogBitsPerWord;
|
||||
uintx bit_number = start_idx & right_n_bits(LogBitsPerWord);
|
||||
uintx bit_number = start_idx & (BitsPerWord - 1);
|
||||
uintx element_bits = _bitmap[array_idx];
|
||||
uintx bits_to_examine = BitsPerWord - bit_number;
|
||||
element_bits >>= bit_number;
|
||||
@ -128,7 +128,7 @@ bool ShenandoahSimpleBitMap::is_backward_consecutive_ones(idx_t last_idx, idx_t
|
||||
assert((last_idx >= 0) && (last_idx < _num_bits), "precondition");
|
||||
assert(last_idx - count >= -1, "precondition");
|
||||
size_t array_idx = last_idx >> LogBitsPerWord;
|
||||
uintx bit_number = last_idx & right_n_bits(LogBitsPerWord);
|
||||
uintx bit_number = last_idx & (BitsPerWord - 1);
|
||||
uintx element_bits = _bitmap[array_idx];
|
||||
uintx bits_to_examine = bit_number + 1;
|
||||
element_bits <<= (BitsPerWord - bits_to_examine);
|
||||
@ -161,10 +161,10 @@ idx_t ShenandoahSimpleBitMap::find_first_consecutive_set_bits(idx_t beg, idx_t e
|
||||
return end;
|
||||
}
|
||||
uintx array_idx = beg >> LogBitsPerWord;
|
||||
uintx bit_number = beg & right_n_bits(LogBitsPerWord);
|
||||
uintx bit_number = beg & (BitsPerWord - 1);
|
||||
uintx element_bits = _bitmap[array_idx];
|
||||
if (bit_number > 0) {
|
||||
uintx mask_out = right_n_bits(bit_number);
|
||||
uintx mask_out = tail_mask(bit_number);
|
||||
element_bits &= ~mask_out;
|
||||
}
|
||||
|
||||
@ -222,9 +222,9 @@ idx_t ShenandoahSimpleBitMap::find_first_consecutive_set_bits(idx_t beg, idx_t e
|
||||
}
|
||||
array_idx = beg >> LogBitsPerWord;
|
||||
element_bits = _bitmap[array_idx];
|
||||
bit_number = beg & right_n_bits(LogBitsPerWord);
|
||||
bit_number = beg & (BitsPerWord - 1);
|
||||
if (bit_number > 0) {
|
||||
size_t mask_out = right_n_bits(bit_number);
|
||||
size_t mask_out = tail_mask(bit_number);
|
||||
element_bits &= ~mask_out;
|
||||
}
|
||||
}
|
||||
@ -242,10 +242,10 @@ idx_t ShenandoahSimpleBitMap::find_last_consecutive_set_bits(const idx_t beg, id
|
||||
}
|
||||
|
||||
size_t array_idx = end >> LogBitsPerWord;
|
||||
uintx bit_number = end & right_n_bits(LogBitsPerWord);
|
||||
uintx bit_number = end & (BitsPerWord - 1);
|
||||
uintx element_bits = _bitmap[array_idx];
|
||||
if (bit_number < BitsPerWord - 1) {
|
||||
uintx mask_in = right_n_bits(bit_number + 1);
|
||||
uintx mask_in = tail_mask(bit_number + 1);
|
||||
element_bits &= mask_in;
|
||||
}
|
||||
|
||||
@ -280,10 +280,10 @@ idx_t ShenandoahSimpleBitMap::find_last_consecutive_set_bits(const idx_t beg, id
|
||||
return beg;
|
||||
}
|
||||
array_idx = end >> LogBitsPerWord;
|
||||
bit_number = end & right_n_bits(LogBitsPerWord);
|
||||
bit_number = end & (BitsPerWord - 1);
|
||||
element_bits = _bitmap[array_idx];
|
||||
if (bit_number < BitsPerWord - 1){
|
||||
size_t mask_in = right_n_bits(bit_number + 1);
|
||||
size_t mask_in = tail_mask(bit_number + 1);
|
||||
element_bits &= mask_in;
|
||||
}
|
||||
}
|
||||
|
||||
@ -50,7 +50,7 @@ typedef ssize_t idx_t;
|
||||
// ShenandoahSimpleBitMap resembles CHeapBitMap but adds missing support for find_first_consecutive_set_bits() and
|
||||
// find_last_consecutive_set_bits. An alternative refactoring of code would subclass CHeapBitMap, but this might
|
||||
// break abstraction rules, because efficient implementation requires assumptions about superclass internals that
|
||||
// might be violatee through future software maintenance.
|
||||
// might be violated through future software maintenance.
|
||||
class ShenandoahSimpleBitMap {
|
||||
const idx_t _num_bits;
|
||||
const size_t _num_words;
|
||||
@ -80,11 +80,13 @@ private:
|
||||
bool is_forward_consecutive_ones(idx_t start_idx, idx_t count) const;
|
||||
bool is_backward_consecutive_ones(idx_t last_idx, idx_t count) const;
|
||||
|
||||
static inline uintx tail_mask(uintx bit_number);
|
||||
|
||||
public:
|
||||
|
||||
inline idx_t aligned_index(idx_t idx) const {
|
||||
assert((idx >= 0) && (idx < _num_bits), "precondition");
|
||||
idx_t array_idx = idx & ~right_n_bits(LogBitsPerWord);
|
||||
idx_t array_idx = idx & ~(BitsPerWord - 1);
|
||||
return array_idx;
|
||||
}
|
||||
|
||||
@ -107,7 +109,7 @@ public:
|
||||
inline void set_bit(idx_t idx) {
|
||||
assert((idx >= 0) && (idx < _num_bits), "precondition");
|
||||
size_t array_idx = idx >> LogBitsPerWord;
|
||||
uintx bit_number = idx & right_n_bits(LogBitsPerWord);
|
||||
uintx bit_number = idx & (BitsPerWord - 1);
|
||||
uintx the_bit = nth_bit(bit_number);
|
||||
_bitmap[array_idx] |= the_bit;
|
||||
}
|
||||
@ -116,7 +118,7 @@ public:
|
||||
assert((idx >= 0) && (idx < _num_bits), "precondition");
|
||||
assert(idx >= 0, "precondition");
|
||||
size_t array_idx = idx >> LogBitsPerWord;
|
||||
uintx bit_number = idx & right_n_bits(LogBitsPerWord);
|
||||
uintx bit_number = idx & (BitsPerWord - 1);
|
||||
uintx the_bit = nth_bit(bit_number);
|
||||
_bitmap[array_idx] &= ~the_bit;
|
||||
}
|
||||
@ -125,9 +127,9 @@ public:
|
||||
assert((idx >= 0) && (idx < _num_bits), "precondition");
|
||||
assert(idx >= 0, "precondition");
|
||||
size_t array_idx = idx >> LogBitsPerWord;
|
||||
uintx bit_number = idx & right_n_bits(LogBitsPerWord);
|
||||
uintx bit_number = idx & (BitsPerWord - 1);
|
||||
uintx the_bit = nth_bit(bit_number);
|
||||
return (_bitmap[array_idx] & the_bit)? true: false;
|
||||
return (_bitmap[array_idx] & the_bit) != 0;
|
||||
}
|
||||
|
||||
// Return the index of the first set bit in the range [beg, size()), or size() if none found.
|
||||
|
||||
@ -27,15 +27,22 @@
|
||||
|
||||
#include "gc/shenandoah/shenandoahSimpleBitMap.hpp"
|
||||
|
||||
inline uintx ShenandoahSimpleBitMap::tail_mask(uintx bit_number) {
|
||||
if (bit_number >= BitsPerWord) {
|
||||
return -1;
|
||||
}
|
||||
return (uintx(1) << bit_number) - 1;
|
||||
}
|
||||
|
||||
inline idx_t ShenandoahSimpleBitMap::find_first_set_bit(idx_t beg, idx_t end) const {
|
||||
assert((beg >= 0) && (beg < _num_bits), "precondition");
|
||||
assert((end > beg) && (end <= _num_bits), "precondition");
|
||||
do {
|
||||
size_t array_idx = beg >> LogBitsPerWord;
|
||||
uintx bit_number = beg & right_n_bits(LogBitsPerWord);
|
||||
uintx bit_number = beg & (BitsPerWord - 1);
|
||||
uintx element_bits = _bitmap[array_idx];
|
||||
if (bit_number > 0) {
|
||||
uintx mask_out = right_n_bits(bit_number);
|
||||
uintx mask_out = tail_mask(bit_number);
|
||||
element_bits &= ~mask_out;
|
||||
}
|
||||
if (element_bits) {
|
||||
@ -62,10 +69,10 @@ inline idx_t ShenandoahSimpleBitMap::find_last_set_bit(idx_t beg, idx_t end) con
|
||||
assert((beg >= -1) && (beg < end), "precondition");
|
||||
do {
|
||||
idx_t array_idx = end >> LogBitsPerWord;
|
||||
uintx bit_number = end & right_n_bits(LogBitsPerWord);
|
||||
uint8_t bit_number = end & (BitsPerWord - 1);
|
||||
uintx element_bits = _bitmap[array_idx];
|
||||
if (bit_number < BitsPerWord - 1){
|
||||
uintx mask_in = right_n_bits(bit_number + 1);
|
||||
uintx mask_in = tail_mask(bit_number + 1);
|
||||
element_bits &= mask_in;
|
||||
}
|
||||
if (element_bits) {
|
||||
|
||||
@ -488,7 +488,8 @@ static bool rule_major_allocation_rate(const ZDirectorStats& stats) {
|
||||
|
||||
// Calculate the GC cost for each reclaimed byte
|
||||
const double current_young_gc_time_per_bytes_freed = double(young_gc_time) / double(reclaimed_per_young_gc);
|
||||
const double current_old_gc_time_per_bytes_freed = double(old_gc_time) / double(reclaimed_per_old_gc);
|
||||
const double current_old_gc_time_per_bytes_freed = reclaimed_per_old_gc == 0 ? std::numeric_limits<double>::infinity()
|
||||
: (double(old_gc_time) / double(reclaimed_per_old_gc));
|
||||
|
||||
// Calculate extra time per young collection inflicted by *not* doing an
|
||||
// old collection that frees up memory in the old generation.
|
||||
|
||||
@ -80,6 +80,15 @@ bool JVMCIGlobals::check_jvmci_flags_are_consistent() {
|
||||
CHECK_NOT_SET(LibJVMCICompilerThreadHidden, UseJVMCICompiler)
|
||||
|
||||
if (UseJVMCICompiler) {
|
||||
if (!FLAG_IS_DEFAULT(EnableJVMCI) && !EnableJVMCI) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"Improperly specified VM option UseJVMCICompiler: EnableJVMCI cannot be disabled\n");
|
||||
return false;
|
||||
}
|
||||
FLAG_SET_DEFAULT(EnableJVMCI, true);
|
||||
}
|
||||
|
||||
if (EnableJVMCI) {
|
||||
if (FLAG_IS_DEFAULT(UseJVMCINativeLibrary) && !UseJVMCINativeLibrary) {
|
||||
char path[JVM_MAXPATHLEN];
|
||||
if (os::dll_locate_lib(path, sizeof(path), Arguments::get_dll_dir(), JVMCI_SHARED_LIBRARY_NAME)) {
|
||||
@ -88,12 +97,9 @@ bool JVMCIGlobals::check_jvmci_flags_are_consistent() {
|
||||
FLAG_SET_DEFAULT(UseJVMCINativeLibrary, true);
|
||||
}
|
||||
}
|
||||
if (!FLAG_IS_DEFAULT(EnableJVMCI) && !EnableJVMCI) {
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"Improperly specified VM option UseJVMCICompiler: EnableJVMCI cannot be disabled\n");
|
||||
return false;
|
||||
}
|
||||
FLAG_SET_DEFAULT(EnableJVMCI, true);
|
||||
}
|
||||
|
||||
if (UseJVMCICompiler) {
|
||||
if (BootstrapJVMCI && UseJVMCINativeLibrary) {
|
||||
jio_fprintf(defaultStream::error_stream(), "-XX:+BootstrapJVMCI is not compatible with -XX:+UseJVMCINativeLibrary\n");
|
||||
return false;
|
||||
|
||||
@ -140,7 +140,7 @@ class fileStream;
|
||||
product(bool, UseJVMCINativeLibrary, false, EXPERIMENTAL, \
|
||||
"Execute JVMCI Java code from a shared library (\"libjvmci\") " \
|
||||
"instead of loading it from class files and executing it " \
|
||||
"on the HotSpot heap. Defaults to true if EnableJVMCIProduct is " \
|
||||
"on the HotSpot heap. Defaults to true if EnableJVMCI is " \
|
||||
"true and a JVMCI native library is available.") \
|
||||
\
|
||||
product(double, JVMCINativeLibraryThreadFraction, 0.33, EXPERIMENTAL, \
|
||||
|
||||
@ -33,11 +33,11 @@
|
||||
|
||||
const LogSelection LogSelection::Invalid;
|
||||
|
||||
LogSelection::LogSelection() : _ntags(0), _wildcard(false), _level(LogLevel::Invalid), _tag_sets_selected(0) {
|
||||
LogSelection::LogSelection() : _ntags(0), _tags(), _wildcard(false), _level(LogLevel::Invalid), _tag_sets_selected(0) {
|
||||
}
|
||||
|
||||
LogSelection::LogSelection(const LogTagType tags[LogTag::MaxTags], bool wildcard, LogLevelType level)
|
||||
: _ntags(0), _wildcard(wildcard), _level(level), _tag_sets_selected(0) {
|
||||
: _ntags(0), _tags(), _wildcard(wildcard), _level(level), _tag_sets_selected(0) {
|
||||
while (_ntags < LogTag::MaxTags && tags[_ntags] != LogTag::__NO_TAG) {
|
||||
_tags[_ntags] = tags[_ntags];
|
||||
_ntags++;
|
||||
|
||||
@ -1483,12 +1483,18 @@ const TypePtr *Compile::flatten_alias_type( const TypePtr *tj ) const {
|
||||
} else {
|
||||
ciInstanceKlass *canonical_holder = ik->get_canonical_holder(offset);
|
||||
assert(offset < canonical_holder->layout_helper_size_in_bytes(), "");
|
||||
if (!ik->equals(canonical_holder) || tj->offset() != offset) {
|
||||
if( is_known_inst ) {
|
||||
tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, true, nullptr, offset, to->instance_id());
|
||||
} else {
|
||||
tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, false, nullptr, offset);
|
||||
}
|
||||
assert(tj->offset() == offset, "no change to offset expected");
|
||||
bool xk = to->klass_is_exact();
|
||||
int instance_id = to->instance_id();
|
||||
|
||||
// If the input type's class is the holder: if exact, the type only includes interfaces implemented by the holder
|
||||
// but if not exact, it may include extra interfaces: build new type from the holder class to make sure only
|
||||
// its interfaces are included.
|
||||
if (xk && ik->equals(canonical_holder)) {
|
||||
assert(tj == TypeInstPtr::make(to->ptr(), canonical_holder, is_known_inst, nullptr, offset, instance_id), "exact type should be canonical type");
|
||||
} else {
|
||||
assert(xk || !is_known_inst, "Known instance should be exact type");
|
||||
tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, is_known_inst, nullptr, offset, instance_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -648,6 +648,20 @@ Block* PhaseCFG::insert_anti_dependences(Block* LCA, Node* load, bool verify) {
|
||||
// The anti-dependence constraints apply only to the fringe of this tree.
|
||||
|
||||
Node* initial_mem = load->in(MemNode::Memory);
|
||||
// We don't optimize the memory graph for pinned loads, so we may need to raise the
|
||||
// root of our search tree through the corresponding slices of MergeMem nodes to
|
||||
// get to the node that really creates the memory state for this slice.
|
||||
if (load_alias_idx >= Compile::AliasIdxRaw) {
|
||||
while (initial_mem->is_MergeMem()) {
|
||||
MergeMemNode* mm = initial_mem->as_MergeMem();
|
||||
Node* p = mm->memory_at(load_alias_idx);
|
||||
if (p != mm->base_memory()) {
|
||||
initial_mem = p;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
worklist_store.push(initial_mem);
|
||||
worklist_visited.push(initial_mem);
|
||||
worklist_mem.push(nullptr);
|
||||
|
||||
@ -1556,6 +1556,7 @@ Node* GraphKit::make_load(Node* ctl, Node* adr, const Type* t, BasicType bt,
|
||||
bool mismatched,
|
||||
bool unsafe,
|
||||
uint8_t barrier_data) {
|
||||
assert(adr_idx == C->get_alias_index(_gvn.type(adr)->isa_ptr()), "slice of address and input slice don't match");
|
||||
assert(adr_idx != Compile::AliasIdxTop, "use other make_load factory" );
|
||||
const TypePtr* adr_type = nullptr; // debug-mode-only argument
|
||||
debug_only(adr_type = C->get_adr_type(adr_idx));
|
||||
@ -1585,6 +1586,7 @@ Node* GraphKit::store_to_memory(Node* ctl, Node* adr, Node *val, BasicType bt,
|
||||
bool unsafe,
|
||||
int barrier_data) {
|
||||
assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" );
|
||||
assert(adr_idx == C->get_alias_index(_gvn.type(adr)->isa_ptr()), "slice of address and input slice don't match");
|
||||
const TypePtr* adr_type = nullptr;
|
||||
debug_only(adr_type = C->get_adr_type(adr_idx));
|
||||
Node *mem = memory(adr_idx);
|
||||
|
||||
@ -2921,11 +2921,10 @@ bool LibraryCallKit::inline_native_notify_jvmti_funcs(address funcAddr, const ch
|
||||
Node* thread = ideal.thread();
|
||||
Node* jt_addr = basic_plus_adr(thread, in_bytes(JavaThread::is_in_VTMS_transition_offset()));
|
||||
Node* vt_addr = basic_plus_adr(vt_oop, java_lang_Thread::is_in_VTMS_transition_offset());
|
||||
const TypePtr *addr_type = _gvn.type(addr)->isa_ptr();
|
||||
|
||||
sync_kit(ideal);
|
||||
access_store_at(nullptr, jt_addr, addr_type, hide, _gvn.type(hide), T_BOOLEAN, IN_NATIVE | MO_UNORDERED);
|
||||
access_store_at(nullptr, vt_addr, addr_type, hide, _gvn.type(hide), T_BOOLEAN, IN_NATIVE | MO_UNORDERED);
|
||||
access_store_at(nullptr, jt_addr, _gvn.type(jt_addr)->is_ptr(), hide, _gvn.type(hide), T_BOOLEAN, IN_NATIVE | MO_UNORDERED);
|
||||
access_store_at(nullptr, vt_addr, _gvn.type(vt_addr)->is_ptr(), hide, _gvn.type(hide), T_BOOLEAN, IN_NATIVE | MO_UNORDERED);
|
||||
|
||||
ideal.sync_kit(this);
|
||||
} ideal.end_if();
|
||||
@ -3283,7 +3282,9 @@ bool LibraryCallKit::inline_native_getEventWriter() {
|
||||
|
||||
// Load the raw epoch value from the threadObj.
|
||||
Node* threadObj_epoch_offset = basic_plus_adr(threadObj, java_lang_Thread::jfr_epoch_offset());
|
||||
Node* threadObj_epoch_raw = access_load_at(threadObj, threadObj_epoch_offset, TypeRawPtr::BOTTOM, TypeInt::CHAR, T_CHAR,
|
||||
Node* threadObj_epoch_raw = access_load_at(threadObj, threadObj_epoch_offset,
|
||||
_gvn.type(threadObj_epoch_offset)->isa_ptr(),
|
||||
TypeInt::CHAR, T_CHAR,
|
||||
IN_HEAP | MO_UNORDERED | C2_MISMATCHED | C2_CONTROL_DEPENDENT_LOAD);
|
||||
|
||||
// Mask off the excluded information from the epoch.
|
||||
@ -3298,7 +3299,8 @@ bool LibraryCallKit::inline_native_getEventWriter() {
|
||||
|
||||
// Load the raw epoch value from the vthread.
|
||||
Node* vthread_epoch_offset = basic_plus_adr(vthread, java_lang_Thread::jfr_epoch_offset());
|
||||
Node* vthread_epoch_raw = access_load_at(vthread, vthread_epoch_offset, TypeRawPtr::BOTTOM, TypeInt::CHAR, T_CHAR,
|
||||
Node* vthread_epoch_raw = access_load_at(vthread, vthread_epoch_offset, _gvn.type(vthread_epoch_offset)->is_ptr(),
|
||||
TypeInt::CHAR, T_CHAR,
|
||||
IN_HEAP | MO_UNORDERED | C2_MISMATCHED | C2_CONTROL_DEPENDENT_LOAD);
|
||||
|
||||
// Mask off the excluded information from the epoch.
|
||||
@ -3534,7 +3536,7 @@ void LibraryCallKit::extend_setCurrentThread(Node* jt, Node* thread) {
|
||||
|
||||
// Load the raw epoch value from the vthread.
|
||||
Node* epoch_offset = basic_plus_adr(thread, java_lang_Thread::jfr_epoch_offset());
|
||||
Node* epoch_raw = access_load_at(thread, epoch_offset, TypeRawPtr::BOTTOM, TypeInt::CHAR, T_CHAR,
|
||||
Node* epoch_raw = access_load_at(thread, epoch_offset, _gvn.type(epoch_offset)->is_ptr(), TypeInt::CHAR, T_CHAR,
|
||||
IN_HEAP | MO_UNORDERED | C2_MISMATCHED | C2_CONTROL_DEPENDENT_LOAD);
|
||||
|
||||
// Mask off the excluded information from the epoch.
|
||||
|
||||
@ -1918,12 +1918,28 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_
|
||||
// Since stride > 0 and limit_correction <= stride + 1, we can restate this with no over- or underflow into:
|
||||
// max_int - canonicalized_correction - limit_correction >= limit
|
||||
// Since canonicalized_correction and limit_correction are both constants, we can replace them with a new constant:
|
||||
// final_correction = canonicalized_correction + limit_correction
|
||||
// (v) final_correction = canonicalized_correction + limit_correction
|
||||
//
|
||||
// which gives us:
|
||||
//
|
||||
// Final predicate condition:
|
||||
// max_int - final_correction >= limit
|
||||
//
|
||||
// However, we need to be careful that (v) does not over- or underflow.
|
||||
// We know that:
|
||||
// canonicalized_correction = stride - 1
|
||||
// and
|
||||
// limit_correction <= stride + 1
|
||||
// and thus
|
||||
// canonicalized_correction + limit_correction <= 2 * stride
|
||||
// To prevent an over- or underflow of (v), we must ensure that
|
||||
// 2 * stride <= max_int
|
||||
// which can safely be checked without over- or underflow with
|
||||
// (vi) stride != min_int AND abs(stride) <= max_int / 2
|
||||
//
|
||||
// We could try to further optimize the cases where (vi) does not hold but given that such large strides are
|
||||
// very uncommon and the loop would only run for a very few iterations anyway, we simply bail out if (vi) fails.
|
||||
//
|
||||
// (2) Loop Limit Check Predicate for (ii):
|
||||
// Using (ii): init < limit
|
||||
//
|
||||
@ -1954,6 +1970,10 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_
|
||||
// there is no overflow of the iv phi after the first iteration. In this case, we don't need to check (ii)
|
||||
// again and can skip the predicate.
|
||||
|
||||
// Check (vi) and bail out if the stride is too big.
|
||||
if (stride_con == min_signed_integer(iv_bt) || (ABS(stride_con) > max_signed_integer(iv_bt) / 2)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Accounting for (LE3) and (LE4) where we use pre-incremented phis in the loop exit check.
|
||||
const jlong limit_correction_for_pre_iv_exit_check = (phi_incr != nullptr) ? stride_con : 0;
|
||||
@ -5473,7 +5493,8 @@ int PhaseIdealLoop::build_loop_tree_impl( Node *n, int pre_order ) {
|
||||
|
||||
} else { // Else not a nested loop
|
||||
if (!_loop_or_ctrl[m->_idx]) continue; // Dead code has no loop
|
||||
l = get_loop(m); // Get previously determined loop
|
||||
IdealLoopTree* m_loop = get_loop(m);
|
||||
l = m_loop; // Get previously determined loop
|
||||
// If successor is header of a loop (nest), move up-loop till it
|
||||
// is a member of some outer enclosing loop. Since there are no
|
||||
// shared headers (I've split them already) I only need to go up
|
||||
@ -5499,10 +5520,10 @@ int PhaseIdealLoop::build_loop_tree_impl( Node *n, int pre_order ) {
|
||||
// Insert the NeverBranch between 'm' and it's control user.
|
||||
NeverBranchNode *iff = new NeverBranchNode( m );
|
||||
_igvn.register_new_node_with_optimizer(iff);
|
||||
set_loop(iff, l);
|
||||
set_loop(iff, m_loop);
|
||||
Node *if_t = new CProjNode( iff, 0 );
|
||||
_igvn.register_new_node_with_optimizer(if_t);
|
||||
set_loop(if_t, l);
|
||||
set_loop(if_t, m_loop);
|
||||
|
||||
Node* cfg = nullptr; // Find the One True Control User of m
|
||||
for (DUIterator_Fast jmax, j = m->fast_outs(jmax); j < jmax; j++) {
|
||||
|
||||
@ -358,7 +358,7 @@ class Parse : public GraphKit {
|
||||
bool _wrote_volatile; // Did we write a volatile field?
|
||||
bool _wrote_stable; // Did we write a @Stable field?
|
||||
bool _wrote_fields; // Did we write any field?
|
||||
Node* _alloc_with_final; // An allocation node with final field
|
||||
Node* _alloc_with_final_or_stable; // An allocation node with final or @Stable field
|
||||
|
||||
// Variables which track Java semantics during bytecode parsing:
|
||||
|
||||
@ -403,10 +403,10 @@ class Parse : public GraphKit {
|
||||
void set_wrote_stable(bool z) { _wrote_stable = z; }
|
||||
bool wrote_fields() const { return _wrote_fields; }
|
||||
void set_wrote_fields(bool z) { _wrote_fields = z; }
|
||||
Node* alloc_with_final() const { return _alloc_with_final; }
|
||||
void set_alloc_with_final(Node* n) {
|
||||
assert((_alloc_with_final == nullptr) || (_alloc_with_final == n), "different init objects?");
|
||||
_alloc_with_final = n;
|
||||
Node* alloc_with_final_or_stable() const { return _alloc_with_final_or_stable; }
|
||||
void set_alloc_with_final_or_stable(Node* n) {
|
||||
assert((_alloc_with_final_or_stable == nullptr) || (_alloc_with_final_or_stable == n), "different init objects?");
|
||||
_alloc_with_final_or_stable = n;
|
||||
}
|
||||
|
||||
Block* block() const { return _block; }
|
||||
|
||||
@ -412,7 +412,7 @@ Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
|
||||
_wrote_volatile = false;
|
||||
_wrote_stable = false;
|
||||
_wrote_fields = false;
|
||||
_alloc_with_final = nullptr;
|
||||
_alloc_with_final_or_stable = nullptr;
|
||||
_block = nullptr;
|
||||
_first_return = true;
|
||||
_replaced_nodes_for_exceptions = false;
|
||||
@ -987,8 +987,8 @@ void Parse::do_exits() {
|
||||
// Figure out if we need to emit the trailing barrier. The barrier is only
|
||||
// needed in the constructors, and only in three cases:
|
||||
//
|
||||
// 1. The constructor wrote a final. The effects of all initializations
|
||||
// must be committed to memory before any code after the constructor
|
||||
// 1. The constructor wrote a final or a @Stable field. All these
|
||||
// initializations must be ordered before any code after the constructor
|
||||
// publishes the reference to the newly constructed object. Rather
|
||||
// than wait for the publication, we simply block the writes here.
|
||||
// Rather than put a barrier on only those writes which are required
|
||||
@ -1013,34 +1013,23 @@ void Parse::do_exits() {
|
||||
// exceptional returns, since they cannot publish normally.
|
||||
//
|
||||
if (method()->is_initializer() &&
|
||||
(wrote_final() ||
|
||||
(wrote_final() || wrote_stable() ||
|
||||
(AlwaysSafeConstructors && wrote_fields()) ||
|
||||
(support_IRIW_for_not_multiple_copy_atomic_cpu && wrote_volatile()))) {
|
||||
Node* recorded_alloc = alloc_with_final_or_stable();
|
||||
_exits.insert_mem_bar(UseStoreStoreForCtor ? Op_MemBarStoreStore : Op_MemBarRelease,
|
||||
alloc_with_final());
|
||||
recorded_alloc);
|
||||
|
||||
// If Memory barrier is created for final fields write
|
||||
// and allocation node does not escape the initialize method,
|
||||
// then barrier introduced by allocation node can be removed.
|
||||
if (DoEscapeAnalysis && alloc_with_final()) {
|
||||
AllocateNode* alloc = AllocateNode::Ideal_allocation(alloc_with_final());
|
||||
if (DoEscapeAnalysis && (recorded_alloc != nullptr)) {
|
||||
AllocateNode* alloc = AllocateNode::Ideal_allocation(recorded_alloc);
|
||||
alloc->compute_MemBar_redundancy(method());
|
||||
}
|
||||
if (PrintOpto && (Verbose || WizardMode)) {
|
||||
method()->print_name();
|
||||
tty->print_cr(" writes finals and needs a memory barrier");
|
||||
}
|
||||
}
|
||||
|
||||
// Any method can write a @Stable field; insert memory barriers
|
||||
// after those also. Can't bind predecessor allocation node (if any)
|
||||
// with barrier because allocation doesn't always dominate
|
||||
// MemBarRelease.
|
||||
if (wrote_stable()) {
|
||||
_exits.insert_mem_bar(Op_MemBarRelease);
|
||||
if (PrintOpto && (Verbose || WizardMode)) {
|
||||
method()->print_name();
|
||||
tty->print_cr(" writes @Stable and needs a memory barrier");
|
||||
tty->print_cr(" writes finals/@Stable and needs a memory barrier");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -236,22 +236,25 @@ void Parse::do_put_xxx(Node* obj, ciField* field, bool is_field) {
|
||||
set_wrote_fields(true);
|
||||
|
||||
// If the field is final, the rules of Java say we are in <init> or <clinit>.
|
||||
// Note the presence of writes to final non-static fields, so that we
|
||||
// If the field is @Stable, we can be in any method, but we only care about
|
||||
// constructors at this point.
|
||||
//
|
||||
// Note the presence of writes to final/@Stable non-static fields, so that we
|
||||
// can insert a memory barrier later on to keep the writes from floating
|
||||
// out of the constructor.
|
||||
// Any method can write a @Stable field; insert memory barriers after those also.
|
||||
if (field->is_final()) {
|
||||
set_wrote_final(true);
|
||||
if (field->is_final() || field->is_stable()) {
|
||||
if (field->is_final()) {
|
||||
set_wrote_final(true);
|
||||
}
|
||||
if (field->is_stable()) {
|
||||
set_wrote_stable(true);
|
||||
}
|
||||
if (AllocateNode::Ideal_allocation(obj) != nullptr) {
|
||||
// Preserve allocation ptr to create precedent edge to it in membar
|
||||
// generated on exit from constructor.
|
||||
// Can't bind stable with its allocation, only record allocation for final field.
|
||||
set_alloc_with_final(obj);
|
||||
set_alloc_with_final_or_stable(obj);
|
||||
}
|
||||
}
|
||||
if (field->is_stable()) {
|
||||
set_wrote_stable(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -97,25 +97,35 @@ jint os_getChildren(JNIEnv *env, jlong jpid, jlongArray jarray,
|
||||
}
|
||||
}
|
||||
|
||||
// Get buffer size needed to read all processes
|
||||
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
|
||||
if (sysctl(mib, 4, NULL, &bufSize, NULL, 0) < 0) {
|
||||
JNU_ThrowByNameWithLastError(env,
|
||||
"java/lang/RuntimeException", "sysctl failed");
|
||||
return -1;
|
||||
}
|
||||
int errsysctl;
|
||||
int maxRetries = 100;
|
||||
void *buffer = NULL;
|
||||
do {
|
||||
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
|
||||
if (buffer != NULL) free(buffer);
|
||||
// Get buffer size needed to read all processes
|
||||
if (sysctl(mib, 4, NULL, &bufSize, NULL, 0) < 0) {
|
||||
JNU_ThrowByNameWithMessageAndLastError(env,
|
||||
"java/lang/RuntimeException", "sysctl failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Allocate buffer big enough for all processes
|
||||
void *buffer = malloc(bufSize);
|
||||
if (buffer == NULL) {
|
||||
JNU_ThrowOutOfMemoryError(env, "malloc failed");
|
||||
return -1;
|
||||
}
|
||||
// Allocate buffer big enough for all processes; add a little
|
||||
// bit of space to be able to hold a few more proc infos
|
||||
// for processes started right after the first sysctl call
|
||||
buffer = malloc(bufSize + 4 * sizeof(struct kinfo_proc));
|
||||
if (buffer == NULL) {
|
||||
JNU_ThrowOutOfMemoryError(env, "malloc failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Read process info for all processes
|
||||
if (sysctl(mib, 4, buffer, &bufSize, NULL, 0) < 0) {
|
||||
JNU_ThrowByNameWithLastError(env,
|
||||
"java/lang/RuntimeException", "sysctl failed");
|
||||
// Read process info for all processes
|
||||
errsysctl = sysctl(mib, 4, buffer, &bufSize, NULL, 0);
|
||||
} while (errsysctl < 0 && errno == ENOMEM && maxRetries-- > 0);
|
||||
|
||||
if (errsysctl < 0) {
|
||||
JNU_ThrowByNameWithMessageAndLastError(env,
|
||||
"java/lang/RuntimeException", "sysctl failed to get info about all processes");
|
||||
free(buffer);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,6 +27,8 @@ package java.lang.invoke;
|
||||
|
||||
|
||||
import jdk.internal.loader.ClassLoaders;
|
||||
import jdk.internal.vm.annotation.DontInline;
|
||||
import jdk.internal.vm.annotation.ForceInline;
|
||||
import jdk.internal.vm.annotation.IntrinsicCandidate;
|
||||
|
||||
import java.lang.constant.ClassDesc;
|
||||
@ -856,6 +858,7 @@ public abstract sealed class MethodHandle implements Constable
|
||||
* @throws WrongMethodTypeException if the conversion cannot be made
|
||||
* @see MethodHandles#explicitCastArguments
|
||||
*/
|
||||
@ForceInline
|
||||
public final MethodHandle asType(MethodType newType) {
|
||||
// Fast path alternative to a heavyweight {@code asType} call.
|
||||
// Return 'this' if the conversion will be a no-op.
|
||||
@ -867,7 +870,7 @@ public abstract sealed class MethodHandle implements Constable
|
||||
if (at != null) {
|
||||
return at;
|
||||
}
|
||||
return setAsTypeCache(asTypeUncached(newType));
|
||||
return setAsTypeCache(newType);
|
||||
}
|
||||
|
||||
private MethodHandle asTypeCached(MethodType newType) {
|
||||
@ -885,7 +888,16 @@ public abstract sealed class MethodHandle implements Constable
|
||||
return null;
|
||||
}
|
||||
|
||||
private MethodHandle setAsTypeCache(MethodHandle at) {
|
||||
/*
|
||||
* We disable inlining here to prevent complex code in the slow path
|
||||
* of MethodHandle::asType from being inlined into that method.
|
||||
* Excessive inlining into MethodHandle::asType can cause that method
|
||||
* to become too big, which will then cause performance issues during
|
||||
* var handle and method handle calls.
|
||||
*/
|
||||
@DontInline
|
||||
private MethodHandle setAsTypeCache(MethodType newType) {
|
||||
MethodHandle at = asTypeUncached(newType);
|
||||
// Don't introduce a strong reference in the cache if newType depends on any class loader other than
|
||||
// current method handle already does to avoid class loader leaks.
|
||||
if (isSafeToCache(at.type)) {
|
||||
@ -1879,8 +1891,7 @@ assertEquals("[three, thee, tee]", asListFix.invoke((Object)argv).toString());
|
||||
if (oldForm != newForm) {
|
||||
assert (newForm.customized == null || newForm.customized == this);
|
||||
newForm.prepare(); // as in MethodHandle.<init>
|
||||
UNSAFE.putReference(this, FORM_OFFSET, newForm);
|
||||
UNSAFE.fullFence();
|
||||
UNSAFE.putReferenceRelease(this, FORM_OFFSET, newForm); // properly publish newForm
|
||||
}
|
||||
} finally {
|
||||
updateInProgress = false;
|
||||
|
||||
@ -1132,7 +1132,6 @@ public final class Main {
|
||||
}
|
||||
}
|
||||
|
||||
KeyStore cakstore = buildTrustedCerts();
|
||||
// -trustcacerts can be specified on -importcert, -printcert or -printcrl.
|
||||
// Reset it so that warnings on CA cert will remain for other command.
|
||||
if (command != IMPORTCERT && command != PRINTCERT
|
||||
@ -1141,6 +1140,7 @@ public final class Main {
|
||||
}
|
||||
|
||||
if (trustcacerts) {
|
||||
KeyStore cakstore = buildTrustedCerts();
|
||||
if (cakstore != null) {
|
||||
caks = cakstore;
|
||||
} else {
|
||||
|
||||
@ -264,7 +264,13 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
||||
}
|
||||
|
||||
private String toGMTFormat(String id, boolean daylight, Locale l) {
|
||||
var zr = ZoneInfoFile.getZoneInfo(id).toZoneId().getRules();
|
||||
LocaleResources lr = LocaleProviderAdapter.forType(Type.CLDR).getLocaleResources(l);
|
||||
ResourceBundle fd = lr.getJavaTimeFormatData();
|
||||
var zi = ZoneInfoFile.getZoneInfo(id);
|
||||
if (zi == null) {
|
||||
return fd.getString("timezone.gmtZeroFormat");
|
||||
}
|
||||
var zr = zi.toZoneId().getRules();
|
||||
var now = Instant.now();
|
||||
var saving = zr.getTransitions().reversed().stream()
|
||||
.dropWhile(zot -> zot.getInstant().isAfter(now))
|
||||
@ -276,8 +282,6 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
|
||||
.orElse(0);
|
||||
int offset = (zr.getStandardOffset(now).getTotalSeconds() +
|
||||
(daylight ? saving : 0)) / 60;
|
||||
LocaleResources lr = LocaleProviderAdapter.forType(Type.CLDR).getLocaleResources(l);
|
||||
ResourceBundle fd = lr.getJavaTimeFormatData();
|
||||
|
||||
if (offset == 0) {
|
||||
return fd.getString("timezone.gmtZeroFormat");
|
||||
|
||||
@ -21,4 +21,4 @@
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
tzdata2024a
|
||||
tzdata2024b
|
||||
|
||||
@ -126,17 +126,16 @@ Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 16
|
||||
|
||||
# Cape Verde / Cabo Verde
|
||||
#
|
||||
# From Paul Eggert (2018-02-16):
|
||||
# Shanks gives 1907 for the transition to +02.
|
||||
# For now, ignore that and follow the 1911-05-26 Portuguese decree
|
||||
# (see Europe/Lisbon).
|
||||
# From Tim Parenti (2024-07-01), per Paul Eggert (2018-02-16):
|
||||
# For timestamps before independence, see commentary for Europe/Lisbon.
|
||||
# Shanks gives 1907 instead for the transition to -02.
|
||||
#
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Atlantic/Cape_Verde -1:34:04 - LMT 1912 Jan 01 2:00u # Praia
|
||||
-2:00 - -02 1942 Sep
|
||||
-2:00 1:00 -01 1945 Oct 15
|
||||
-2:00 - -02 1975 Nov 25 2:00
|
||||
-1:00 - -01
|
||||
-2:00 - %z 1942 Sep
|
||||
-2:00 1:00 %z 1945 Oct 15
|
||||
-2:00 - %z 1975 Nov 25 2:00
|
||||
-1:00 - %z
|
||||
|
||||
# Chad
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
@ -368,14 +367,12 @@ Zone Africa/Cairo 2:05:09 - LMT 1900 Oct
|
||||
|
||||
# Guinea-Bissau
|
||||
#
|
||||
# From Paul Eggert (2018-02-16):
|
||||
# Shanks gives 1911-05-26 for the transition to WAT,
|
||||
# evidently confusing the date of the Portuguese decree
|
||||
# (see Europe/Lisbon) with the date that it took effect.
|
||||
# From Tim Parenti (2024-07-01), per Paul Eggert (2018-02-16):
|
||||
# For timestamps before independence, see commentary for Europe/Lisbon.
|
||||
#
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
|
||||
-1:00 - -01 1975
|
||||
-1:00 - %z 1975
|
||||
0:00 - GMT
|
||||
|
||||
# Comoros
|
||||
@ -440,10 +437,10 @@ Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Africa/Nairobi 2:27:16 - LMT 1908 May
|
||||
2:30 - +0230 1928 Jun 30 24:00
|
||||
2:30 - %z 1928 Jun 30 24:00
|
||||
3:00 - EAT 1930 Jan 4 24:00
|
||||
2:30 - +0230 1936 Dec 31 24:00
|
||||
2:45 - +0245 1942 Jul 31 24:00
|
||||
2:30 - %z 1936 Dec 31 24:00
|
||||
2:45 - %z 1942 Jul 31 24:00
|
||||
3:00 - EAT
|
||||
|
||||
# Liberia
|
||||
@ -614,7 +611,7 @@ Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 -
|
||||
Rule Mauritius 2009 only - Mar lastSun 2:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis
|
||||
4:00 Mauritius +04/+05
|
||||
4:00 Mauritius %z
|
||||
# Agalega Is, Rodriguez
|
||||
# no information; probably like Indian/Mauritius
|
||||
|
||||
@ -1094,10 +1091,10 @@ Rule Morocco 2087 only - May 11 2:00 0 -
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
|
||||
0:00 Morocco +00/+01 1984 Mar 16
|
||||
1:00 - +01 1986
|
||||
0:00 Morocco +00/+01 2018 Oct 28 3:00
|
||||
1:00 Morocco +01/+00
|
||||
0:00 Morocco %z 1984 Mar 16
|
||||
1:00 - %z 1986
|
||||
0:00 Morocco %z 2018 Oct 28 3:00
|
||||
1:00 Morocco %z
|
||||
|
||||
# Western Sahara
|
||||
#
|
||||
@ -1111,9 +1108,9 @@ Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
|
||||
# since most of it was then controlled by Morocco.
|
||||
|
||||
Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún
|
||||
-1:00 - -01 1976 Apr 14
|
||||
0:00 Morocco +00/+01 2018 Oct 28 3:00
|
||||
1:00 Morocco +01/+00
|
||||
-1:00 - %z 1976 Apr 14
|
||||
0:00 Morocco %z 2018 Oct 28 3:00
|
||||
1:00 Morocco %z
|
||||
|
||||
# Botswana
|
||||
# Burundi
|
||||
@ -1124,13 +1121,27 @@ Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún
|
||||
# Zambia
|
||||
# Zimbabwe
|
||||
#
|
||||
# Shanks gives 1903-03-01 for the transition to CAT.
|
||||
# Perhaps the 1911-05-26 Portuguese decree
|
||||
# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
|
||||
# merely made it official?
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# For timestamps before Mozambique's independence, see commentary for
|
||||
# Europe/Lisbon.
|
||||
#
|
||||
# From Paul Eggert (2024-05-24):
|
||||
# The London Gazette, 1903-04-03, page 2245, says that
|
||||
# as of 1903-03-03 a time ball at the port of Lourenço Marques
|
||||
# (as Maputo was then called) was dropped daily at 13:00:00 LMT,
|
||||
# corresponding to 22:49:41.7 GMT, so local time was +02:10:18.3.
|
||||
# Conversely, the newspaper South Africa, 1909-02-09, page 321,
|
||||
# says the port had just installed an apparatus that communicated
|
||||
# "from the controlling clock in the new Observatory at Reuben Point ...
|
||||
# exact mean South African time, i.e., 30 deg., or 2 hours East of Greenwich".
|
||||
# Although Shanks gives 1903-03-01 for the transition to CAT,
|
||||
# evidently the port transitioned to CAT after 1903-03-03 but before
|
||||
# the Portuguese legal transition of 1912-01-01 (see Europe/Lisbon commentary).
|
||||
# For lack of better info, list 1909 as the transition date.
|
||||
#
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Africa/Maputo 2:10:20 - LMT 1903 Mar
|
||||
#STDOFF 2:10:18.3
|
||||
Zone Africa/Maputo 2:10:18 - LMT 1909
|
||||
2:00 - CAT
|
||||
|
||||
# Namibia
|
||||
@ -1195,7 +1206,7 @@ Rule Namibia 1995 2017 - Apr Sun>=1 2:00 -1:00 WAT
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
|
||||
1:30 - +0130 1903 Mar
|
||||
1:30 - %z 1903 Mar
|
||||
2:00 - SAST 1942 Sep 20 2:00
|
||||
2:00 1:00 SAST 1943 Mar 21 2:00
|
||||
2:00 - SAST 1990 Mar 21 # independence
|
||||
@ -1283,7 +1294,7 @@ Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
|
||||
Zone Africa/Lagos 0:13:35 - LMT 1905 Jul 1
|
||||
0:00 - GMT 1908 Jul 1
|
||||
0:13:35 - LMT 1914 Jan 1
|
||||
0:30 - +0030 1919 Sep 1
|
||||
0:30 - %z 1919 Sep 1
|
||||
1:00 - WAT
|
||||
|
||||
# São Tomé and Príncipe
|
||||
|
||||
@ -110,34 +110,34 @@
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Antarctica/Casey 0 - -00 1969
|
||||
8:00 - +08 2009 Oct 18 2:00
|
||||
11:00 - +11 2010 Mar 5 2:00
|
||||
8:00 - +08 2011 Oct 28 2:00
|
||||
11:00 - +11 2012 Feb 21 17:00u
|
||||
8:00 - +08 2016 Oct 22
|
||||
11:00 - +11 2018 Mar 11 4:00
|
||||
8:00 - +08 2018 Oct 7 4:00
|
||||
11:00 - +11 2019 Mar 17 3:00
|
||||
8:00 - +08 2019 Oct 4 3:00
|
||||
11:00 - +11 2020 Mar 8 3:00
|
||||
8:00 - +08 2020 Oct 4 0:01
|
||||
11:00 - +11 2021 Mar 14 0:00
|
||||
8:00 - +08 2021 Oct 3 0:01
|
||||
11:00 - +11 2022 Mar 13 0:00
|
||||
8:00 - +08 2022 Oct 2 0:01
|
||||
11:00 - +11 2023 Mar 9 3:00
|
||||
8:00 - +08
|
||||
8:00 - %z 2009 Oct 18 2:00
|
||||
11:00 - %z 2010 Mar 5 2:00
|
||||
8:00 - %z 2011 Oct 28 2:00
|
||||
11:00 - %z 2012 Feb 21 17:00u
|
||||
8:00 - %z 2016 Oct 22
|
||||
11:00 - %z 2018 Mar 11 4:00
|
||||
8:00 - %z 2018 Oct 7 4:00
|
||||
11:00 - %z 2019 Mar 17 3:00
|
||||
8:00 - %z 2019 Oct 4 3:00
|
||||
11:00 - %z 2020 Mar 8 3:00
|
||||
8:00 - %z 2020 Oct 4 0:01
|
||||
11:00 - %z 2021 Mar 14 0:00
|
||||
8:00 - %z 2021 Oct 3 0:01
|
||||
11:00 - %z 2022 Mar 13 0:00
|
||||
8:00 - %z 2022 Oct 2 0:01
|
||||
11:00 - %z 2023 Mar 9 3:00
|
||||
8:00 - %z
|
||||
Zone Antarctica/Davis 0 - -00 1957 Jan 13
|
||||
7:00 - +07 1964 Nov
|
||||
7:00 - %z 1964 Nov
|
||||
0 - -00 1969 Feb
|
||||
7:00 - +07 2009 Oct 18 2:00
|
||||
5:00 - +05 2010 Mar 10 20:00u
|
||||
7:00 - +07 2011 Oct 28 2:00
|
||||
5:00 - +05 2012 Feb 21 20:00u
|
||||
7:00 - +07
|
||||
7:00 - %z 2009 Oct 18 2:00
|
||||
5:00 - %z 2010 Mar 10 20:00u
|
||||
7:00 - %z 2011 Oct 28 2:00
|
||||
5:00 - %z 2012 Feb 21 20:00u
|
||||
7:00 - %z
|
||||
Zone Antarctica/Mawson 0 - -00 1954 Feb 13
|
||||
6:00 - +06 2009 Oct 18 2:00
|
||||
5:00 - +05
|
||||
6:00 - %z 2009 Oct 18 2:00
|
||||
5:00 - %z
|
||||
# References:
|
||||
# Casey Weather (1998-02-26)
|
||||
# http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html
|
||||
@ -313,10 +313,10 @@ Zone Antarctica/Troll 0 - -00 2005 Feb 12
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Antarctica/Vostok 0 - -00 1957 Dec 16
|
||||
7:00 - +07 1994 Feb
|
||||
7:00 - %z 1994 Feb
|
||||
0 - -00 1994 Nov
|
||||
7:00 - +07 2023 Dec 18 2:00
|
||||
5:00 - +05
|
||||
7:00 - %z 2023 Dec 18 2:00
|
||||
5:00 - %z
|
||||
|
||||
# S Africa - year-round bases
|
||||
# Marion Island, -4653+03752
|
||||
@ -349,7 +349,7 @@ Zone Antarctica/Vostok 0 - -00 1957 Dec 16
|
||||
#
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Antarctica/Rothera 0 - -00 1976 Dec 1
|
||||
-3:00 - -03
|
||||
-3:00 - %z
|
||||
|
||||
# Uruguay - year round base
|
||||
# Artigas, King George Island, -621104-0585107
|
||||
|
||||
@ -106,8 +106,8 @@ Rule RussiaAsia 1996 2010 - Oct lastSun 2:00s 0 -
|
||||
# Afghanistan
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Kabul 4:36:48 - LMT 1890
|
||||
4:00 - +04 1945
|
||||
4:30 - +0430
|
||||
4:00 - %z 1945
|
||||
4:30 - %z
|
||||
|
||||
# Armenia
|
||||
# From Paul Eggert (2006-03-22):
|
||||
@ -139,12 +139,12 @@ Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 -
|
||||
Rule Armenia 2011 only - Oct lastSun 2:00s 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2
|
||||
3:00 - +03 1957 Mar
|
||||
4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s
|
||||
3:00 RussiaAsia +03/+04 1995 Sep 24 2:00s
|
||||
4:00 - +04 1997
|
||||
4:00 RussiaAsia +04/+05 2011
|
||||
4:00 Armenia +04/+05
|
||||
3:00 - %z 1957 Mar
|
||||
4:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
3:00 RussiaAsia %z 1995 Sep 24 2:00s
|
||||
4:00 - %z 1997
|
||||
4:00 RussiaAsia %z 2011
|
||||
4:00 Armenia %z
|
||||
|
||||
# Azerbaijan
|
||||
|
||||
@ -165,12 +165,12 @@ Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 -
|
||||
Rule Azer 1997 2015 - Oct lastSun 5:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Baku 3:19:24 - LMT 1924 May 2
|
||||
3:00 - +03 1957 Mar
|
||||
4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s
|
||||
3:00 RussiaAsia +03/+04 1992 Sep lastSun 2:00s
|
||||
4:00 - +04 1996
|
||||
4:00 EUAsia +04/+05 1997
|
||||
4:00 Azer +04/+05
|
||||
3:00 - %z 1957 Mar
|
||||
4:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
3:00 RussiaAsia %z 1992 Sep lastSun 2:00s
|
||||
4:00 - %z 1996
|
||||
4:00 EUAsia %z 1997
|
||||
4:00 Azer %z
|
||||
|
||||
# Bangladesh
|
||||
# From Alexander Krivenyshev (2009-05-13):
|
||||
@ -251,17 +251,17 @@ Rule Dhaka 2009 only - Dec 31 24:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Dhaka 6:01:40 - LMT 1890
|
||||
5:53:20 - HMT 1941 Oct # Howrah Mean Time?
|
||||
6:30 - +0630 1942 May 15
|
||||
5:30 - +0530 1942 Sep
|
||||
6:30 - +0630 1951 Sep 30
|
||||
6:00 - +06 2009
|
||||
6:00 Dhaka +06/+07
|
||||
6:30 - %z 1942 May 15
|
||||
5:30 - %z 1942 Sep
|
||||
6:30 - %z 1951 Sep 30
|
||||
6:00 - %z 2009
|
||||
6:00 Dhaka %z
|
||||
|
||||
# Bhutan
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu
|
||||
5:30 - +0530 1987 Oct
|
||||
6:00 - +06
|
||||
5:30 - %z 1987 Oct
|
||||
6:00 - %z
|
||||
|
||||
# British Indian Ocean Territory
|
||||
# Whitman and the 1995 CIA time zone map say 5:00, but the
|
||||
@ -271,8 +271,8 @@ Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu
|
||||
# then contained the Chagos Archipelago).
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Indian/Chagos 4:49:40 - LMT 1907
|
||||
5:00 - +05 1996
|
||||
6:00 - +06
|
||||
5:00 - %z 1996
|
||||
6:00 - %z
|
||||
|
||||
# Cocos (Keeling) Islands
|
||||
# Myanmar (Burma)
|
||||
@ -288,9 +288,9 @@ Zone Indian/Chagos 4:49:40 - LMT 1907
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Yangon 6:24:47 - LMT 1880 # or Rangoon
|
||||
6:24:47 - RMT 1920 # Rangoon local time
|
||||
6:30 - +0630 1942 May
|
||||
9:00 - +09 1945 May 3
|
||||
6:30 - +0630
|
||||
6:30 - %z 1942 May
|
||||
9:00 - %z 1945 May 3
|
||||
6:30 - %z
|
||||
|
||||
# China
|
||||
|
||||
@ -679,7 +679,7 @@ Zone Asia/Shanghai 8:05:43 - LMT 1901
|
||||
# Xinjiang time, used by many in western China; represented by Ürümqi / Ürümchi
|
||||
# / Wulumuqi. (Please use Asia/Shanghai if you prefer Beijing time.)
|
||||
Zone Asia/Urumqi 5:50:20 - LMT 1928
|
||||
6:00 - +06
|
||||
6:00 - %z
|
||||
|
||||
# Hong Kong
|
||||
|
||||
@ -1137,7 +1137,7 @@ Rule Macau 1979 only - Oct Sun>=16 03:30 0 S
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Macau 7:34:10 - LMT 1904 Oct 30
|
||||
8:00 - CST 1941 Dec 21 23:00
|
||||
9:00 Macau +09/+10 1945 Sep 30 24:00
|
||||
9:00 Macau %z 1945 Sep 30 24:00
|
||||
8:00 Macau C%sT
|
||||
|
||||
|
||||
@ -1180,7 +1180,7 @@ Zone Asia/Nicosia 2:13:28 - LMT 1921 Nov 14
|
||||
Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14
|
||||
2:00 Cyprus EE%sT 1998 Sep
|
||||
2:00 EUAsia EE%sT 2016 Sep 8
|
||||
3:00 - +03 2017 Oct 29 1:00u
|
||||
3:00 - %z 2017 Oct 29 1:00u
|
||||
2:00 EUAsia EE%sT
|
||||
|
||||
# Georgia
|
||||
@ -1221,18 +1221,25 @@ Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Tbilisi 2:59:11 - LMT 1880
|
||||
2:59:11 - TBMT 1924 May 2 # Tbilisi Mean Time
|
||||
3:00 - +03 1957 Mar
|
||||
4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s
|
||||
3:00 RussiaAsia +03/+04 1992
|
||||
3:00 E-EurAsia +03/+04 1994 Sep lastSun
|
||||
4:00 E-EurAsia +04/+05 1996 Oct lastSun
|
||||
4:00 1:00 +05 1997 Mar lastSun
|
||||
4:00 E-EurAsia +04/+05 2004 Jun 27
|
||||
3:00 RussiaAsia +03/+04 2005 Mar lastSun 2:00
|
||||
4:00 - +04
|
||||
3:00 - %z 1957 Mar
|
||||
4:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
3:00 RussiaAsia %z 1992
|
||||
3:00 E-EurAsia %z 1994 Sep lastSun
|
||||
4:00 E-EurAsia %z 1996 Oct lastSun
|
||||
4:00 1:00 %z 1997 Mar lastSun
|
||||
4:00 E-EurAsia %z 2004 Jun 27
|
||||
3:00 RussiaAsia %z 2005 Mar lastSun 2:00
|
||||
4:00 - %z
|
||||
|
||||
# East Timor
|
||||
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# The 1912-01-01 transition occurred at 00:00 new time, per the 1911-05-24
|
||||
# Portuguese decree (see Europe/Lisbon). A provision in article 5(c) of the
|
||||
# decree prescribed that Timor "will keep counting time in harmony with
|
||||
# neighboring foreign colonies, [for] as long as they do not adopt the time
|
||||
# that belongs to them in [the Washington Convention] system."
|
||||
|
||||
# See Indonesia for the 1945 transition.
|
||||
|
||||
# From João Carrascalão, brother of the former governor of East Timor, in
|
||||
@ -1256,11 +1263,11 @@ Zone Asia/Tbilisi 2:59:11 - LMT 1880
|
||||
# midnight on Saturday, September 16.
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Dili 8:22:20 - LMT 1912 Jan 1
|
||||
8:00 - +08 1942 Feb 21 23:00
|
||||
9:00 - +09 1976 May 3
|
||||
8:00 - +08 2000 Sep 17 0:00
|
||||
9:00 - +09
|
||||
Zone Asia/Dili 8:22:20 - LMT 1911 Dec 31 16:00u
|
||||
8:00 - %z 1942 Feb 21 23:00
|
||||
9:00 - %z 1976 May 3
|
||||
8:00 - %z 2000 Sep 17 0:00
|
||||
9:00 - %z
|
||||
|
||||
# India
|
||||
|
||||
@ -1326,9 +1333,9 @@ Zone Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 # Kolkata
|
||||
5:53:20 - HMT 1870 # Howrah Mean Time?
|
||||
5:21:10 - MMT 1906 Jan 1 # Madras local time
|
||||
5:30 - IST 1941 Oct
|
||||
5:30 1:00 +0630 1942 May 15
|
||||
5:30 1:00 %z 1942 May 15
|
||||
5:30 - IST 1942 Sep
|
||||
5:30 1:00 +0630 1945 Oct 15
|
||||
5:30 1:00 %z 1945 Oct 15
|
||||
5:30 - IST
|
||||
# Since 1970 the following are like Asia/Kolkata:
|
||||
# Andaman Is
|
||||
@ -1380,33 +1387,33 @@ Zone Asia/Jakarta 7:07:12 - LMT 1867 Aug 10
|
||||
# Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13,
|
||||
# but this must be a typo.
|
||||
7:07:12 - BMT 1923 Dec 31 16:40u # Batavia
|
||||
7:20 - +0720 1932 Nov
|
||||
7:30 - +0730 1942 Mar 23
|
||||
9:00 - +09 1945 Sep 23
|
||||
7:30 - +0730 1948 May
|
||||
8:00 - +08 1950 May
|
||||
7:30 - +0730 1964
|
||||
7:20 - %z 1932 Nov
|
||||
7:30 - %z 1942 Mar 23
|
||||
9:00 - %z 1945 Sep 23
|
||||
7:30 - %z 1948 May
|
||||
8:00 - %z 1950 May
|
||||
7:30 - %z 1964
|
||||
7:00 - WIB
|
||||
# west and central Borneo
|
||||
Zone Asia/Pontianak 7:17:20 - LMT 1908 May
|
||||
7:17:20 - PMT 1932 Nov # Pontianak MT
|
||||
7:30 - +0730 1942 Jan 29
|
||||
9:00 - +09 1945 Sep 23
|
||||
7:30 - +0730 1948 May
|
||||
8:00 - +08 1950 May
|
||||
7:30 - +0730 1964
|
||||
7:30 - %z 1942 Jan 29
|
||||
9:00 - %z 1945 Sep 23
|
||||
7:30 - %z 1948 May
|
||||
8:00 - %z 1950 May
|
||||
7:30 - %z 1964
|
||||
8:00 - WITA 1988 Jan 1
|
||||
7:00 - WIB
|
||||
# Sulawesi, Lesser Sundas, east and south Borneo
|
||||
Zone Asia/Makassar 7:57:36 - LMT 1920
|
||||
7:57:36 - MMT 1932 Nov # Macassar MT
|
||||
8:00 - +08 1942 Feb 9
|
||||
9:00 - +09 1945 Sep 23
|
||||
8:00 - %z 1942 Feb 9
|
||||
9:00 - %z 1945 Sep 23
|
||||
8:00 - WITA
|
||||
# Maluku Islands, West Papua, Papua
|
||||
Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov
|
||||
9:00 - +09 1944 Sep 1
|
||||
9:30 - +0930 1964
|
||||
9:00 - %z 1944 Sep 1
|
||||
9:30 - %z 1964
|
||||
9:00 - WIT
|
||||
|
||||
# Iran
|
||||
@ -1642,9 +1649,9 @@ Rule Iran 2021 2022 - Sep 21 24:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Tehran 3:25:44 - LMT 1916
|
||||
3:25:44 - TMT 1935 Jun 13 # Tehran Mean Time
|
||||
3:30 Iran +0330/+0430 1977 Oct 20 24:00
|
||||
4:00 Iran +04/+05 1979
|
||||
3:30 Iran +0330/+0430
|
||||
3:30 Iran %z 1977 Oct 20 24:00
|
||||
4:00 Iran %z 1979
|
||||
3:30 Iran %z
|
||||
|
||||
|
||||
# Iraq
|
||||
@ -1687,8 +1694,8 @@ Rule Iraq 1991 2007 - Oct 1 3:00s 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Baghdad 2:57:40 - LMT 1890
|
||||
2:57:36 - BMT 1918 # Baghdad Mean Time?
|
||||
3:00 - +03 1982 May
|
||||
3:00 Iraq +03/+04
|
||||
3:00 - %z 1982 May
|
||||
3:00 Iraq %z
|
||||
|
||||
|
||||
###############################################################################
|
||||
@ -2285,7 +2292,7 @@ Rule Jordan 2022 only - Feb lastThu 24:00 1:00 S
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Amman 2:23:44 - LMT 1931
|
||||
2:00 Jordan EE%sT 2022 Oct 28 0:00s
|
||||
3:00 - +03
|
||||
3:00 - %z
|
||||
|
||||
|
||||
# Kazakhstan
|
||||
@ -2496,88 +2503,88 @@ Zone Asia/Amman 2:23:44 - LMT 1931
|
||||
# Almaty (formerly Alma-Ata), representing most locations in Kazakhstan
|
||||
# This includes Abai/Abay (ISO 3166-2 code KZ-10), Aqmola/Akmola (KZ-11),
|
||||
# Almaty (KZ-19), Almaty city (KZ-75), Astana city (KZ-71),
|
||||
# East Kazkhstan (KZ-63), Jambyl/Zhambyl (KZ-31), Jetisu/Zhetysu (KZ-33),
|
||||
# East Kazakhstan (KZ-63), Jambyl/Zhambyl (KZ-31), Jetisu/Zhetysu (KZ-33),
|
||||
# Karaganda (KZ-35), North Kazakhstan (KZ-59), Pavlodar (KZ-55),
|
||||
# Shyumkent city (KZ-79), Turkistan (KZ-61), and Ulytau (KZ-62).
|
||||
# Shymkent city (KZ-79), Turkistan (KZ-61), and Ulytau (KZ-62).
|
||||
Zone Asia/Almaty 5:07:48 - LMT 1924 May 2 # or Alma-Ata
|
||||
5:00 - +05 1930 Jun 21
|
||||
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
|
||||
5:00 RussiaAsia +05/+06 1992 Jan 19 2:00s
|
||||
6:00 RussiaAsia +06/+07 2004 Oct 31 2:00s
|
||||
6:00 - +06 2024 Mar 1 0:00
|
||||
5:00 - +05
|
||||
5:00 - %z 1930 Jun 21
|
||||
6:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
5:00 RussiaAsia %z 1992 Jan 19 2:00s
|
||||
6:00 RussiaAsia %z 2004 Oct 31 2:00s
|
||||
6:00 - %z 2024 Mar 1 0:00
|
||||
5:00 - %z
|
||||
# Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.) (KZ-43)
|
||||
Zone Asia/Qyzylorda 4:21:52 - LMT 1924 May 2
|
||||
4:00 - +04 1930 Jun 21
|
||||
5:00 - +05 1981 Apr 1
|
||||
5:00 1:00 +06 1981 Oct 1
|
||||
6:00 - +06 1982 Apr 1
|
||||
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia +04/+05 1991 Sep 29 2:00s
|
||||
5:00 RussiaAsia +05/+06 1992 Jan 19 2:00s
|
||||
6:00 RussiaAsia +06/+07 1992 Mar 29 2:00s
|
||||
5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
|
||||
6:00 - +06 2018 Dec 21 0:00
|
||||
5:00 - +05
|
||||
4:00 - %z 1930 Jun 21
|
||||
5:00 - %z 1981 Apr 1
|
||||
5:00 1:00 %z 1981 Oct 1
|
||||
6:00 - %z 1982 Apr 1
|
||||
5:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia %z 1991 Sep 29 2:00s
|
||||
5:00 RussiaAsia %z 1992 Jan 19 2:00s
|
||||
6:00 RussiaAsia %z 1992 Mar 29 2:00s
|
||||
5:00 RussiaAsia %z 2004 Oct 31 2:00s
|
||||
6:00 - %z 2018 Dec 21 0:00
|
||||
5:00 - %z
|
||||
# Qostanay (aka Kostanay, Kustanay) (KZ-39)
|
||||
# The 1991/2 rules are unclear partly because of the 1997 Turgai
|
||||
# reorganization.
|
||||
Zone Asia/Qostanay 4:14:28 - LMT 1924 May 2
|
||||
4:00 - +04 1930 Jun 21
|
||||
5:00 - +05 1981 Apr 1
|
||||
5:00 1:00 +06 1981 Oct 1
|
||||
6:00 - +06 1982 Apr 1
|
||||
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
|
||||
6:00 - +06 2024 Mar 1 0:00
|
||||
5:00 - +05
|
||||
4:00 - %z 1930 Jun 21
|
||||
5:00 - %z 1981 Apr 1
|
||||
5:00 1:00 %z 1981 Oct 1
|
||||
6:00 - %z 1982 Apr 1
|
||||
5:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia %z 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia %z 2004 Oct 31 2:00s
|
||||
6:00 - %z 2024 Mar 1 0:00
|
||||
5:00 - %z
|
||||
# Aqtöbe (aka Aktobe, formerly Aktyubinsk) (KZ-15)
|
||||
Zone Asia/Aqtobe 3:48:40 - LMT 1924 May 2
|
||||
4:00 - +04 1930 Jun 21
|
||||
5:00 - +05 1981 Apr 1
|
||||
5:00 1:00 +06 1981 Oct 1
|
||||
6:00 - +06 1982 Apr 1
|
||||
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
|
||||
5:00 - +05
|
||||
4:00 - %z 1930 Jun 21
|
||||
5:00 - %z 1981 Apr 1
|
||||
5:00 1:00 %z 1981 Oct 1
|
||||
6:00 - %z 1982 Apr 1
|
||||
5:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia %z 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia %z 2004 Oct 31 2:00s
|
||||
5:00 - %z
|
||||
# Mangghystaū (KZ-47)
|
||||
# Aqtau was not founded until 1963, but it represents an inhabited region,
|
||||
# so include timestamps before 1963.
|
||||
Zone Asia/Aqtau 3:21:04 - LMT 1924 May 2
|
||||
4:00 - +04 1930 Jun 21
|
||||
5:00 - +05 1981 Oct 1
|
||||
6:00 - +06 1982 Apr 1
|
||||
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia +05/+06 1994 Sep 25 2:00s
|
||||
4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
|
||||
5:00 - +05
|
||||
4:00 - %z 1930 Jun 21
|
||||
5:00 - %z 1981 Oct 1
|
||||
6:00 - %z 1982 Apr 1
|
||||
5:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia %z 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia %z 1994 Sep 25 2:00s
|
||||
4:00 RussiaAsia %z 2004 Oct 31 2:00s
|
||||
5:00 - %z
|
||||
# Atyraū (KZ-23) is like Mangghystaū except it switched from
|
||||
# +04/+05 to +05/+06 in spring 1999, not fall 1994.
|
||||
Zone Asia/Atyrau 3:27:44 - LMT 1924 May 2
|
||||
3:00 - +03 1930 Jun 21
|
||||
5:00 - +05 1981 Oct 1
|
||||
6:00 - +06 1982 Apr 1
|
||||
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia +05/+06 1999 Mar 28 2:00s
|
||||
4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
|
||||
5:00 - +05
|
||||
3:00 - %z 1930 Jun 21
|
||||
5:00 - %z 1981 Oct 1
|
||||
6:00 - %z 1982 Apr 1
|
||||
5:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
4:00 RussiaAsia %z 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia %z 1999 Mar 28 2:00s
|
||||
4:00 RussiaAsia %z 2004 Oct 31 2:00s
|
||||
5:00 - %z
|
||||
# West Kazakhstan (KZ-27)
|
||||
# From Paul Eggert (2016-03-18):
|
||||
# The 1989 transition is from USSR act No. 227 (1989-03-14).
|
||||
Zone Asia/Oral 3:25:24 - LMT 1924 May 2 # or Ural'sk
|
||||
3:00 - +03 1930 Jun 21
|
||||
5:00 - +05 1981 Apr 1
|
||||
5:00 1:00 +06 1981 Oct 1
|
||||
6:00 - +06 1982 Apr 1
|
||||
5:00 RussiaAsia +05/+06 1989 Mar 26 2:00s
|
||||
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia +05/+06 1992 Mar 29 2:00s
|
||||
4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
|
||||
5:00 - +05
|
||||
3:00 - %z 1930 Jun 21
|
||||
5:00 - %z 1981 Apr 1
|
||||
5:00 1:00 %z 1981 Oct 1
|
||||
6:00 - %z 1982 Apr 1
|
||||
5:00 RussiaAsia %z 1989 Mar 26 2:00s
|
||||
4:00 RussiaAsia %z 1992 Jan 19 2:00s
|
||||
5:00 RussiaAsia %z 1992 Mar 29 2:00s
|
||||
4:00 RussiaAsia %z 2004 Oct 31 2:00s
|
||||
5:00 - %z
|
||||
|
||||
# Kyrgyzstan (Kirgizstan)
|
||||
# Transitions through 1991 are from Shanks & Pottenger.
|
||||
@ -2598,11 +2605,11 @@ Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 -
|
||||
Rule Kyrgyz 1997 2004 - Oct lastSun 2:30 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2
|
||||
5:00 - +05 1930 Jun 21
|
||||
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
|
||||
5:00 RussiaAsia +05/+06 1991 Aug 31 2:00
|
||||
5:00 Kyrgyz +05/+06 2005 Aug 12
|
||||
6:00 - +06
|
||||
5:00 - %z 1930 Jun 21
|
||||
6:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
5:00 RussiaAsia %z 1991 Aug 31 2:00
|
||||
5:00 Kyrgyz %z 2005 Aug 12
|
||||
6:00 - %z
|
||||
|
||||
###############################################################################
|
||||
|
||||
@ -2809,16 +2816,16 @@ Rule NBorneo 1935 1941 - Dec 14 0:00 0 -
|
||||
# and 1982 transition dates are from Mok Ly Yng.
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Kuching 7:21:20 - LMT 1926 Mar
|
||||
7:30 - +0730 1933
|
||||
8:00 NBorneo +08/+0820 1942 Feb 16
|
||||
9:00 - +09 1945 Sep 12
|
||||
8:00 - +08
|
||||
7:30 - %z 1933
|
||||
8:00 NBorneo %z 1942 Feb 16
|
||||
9:00 - %z 1945 Sep 12
|
||||
8:00 - %z
|
||||
|
||||
# Maldives
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé
|
||||
4:54:00 - MMT 1960 # Malé Mean Time
|
||||
5:00 - +05
|
||||
5:00 - %z
|
||||
|
||||
# Mongolia
|
||||
|
||||
@ -2920,9 +2927,37 @@ Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé
|
||||
|
||||
# From Arthur David Olson (2008-05-19):
|
||||
# Assume that Choibalsan is indeed offset by 8:00.
|
||||
# XXX--in the absence of better information, assume that transition
|
||||
# was at the start of 2008-03-31 (the day of Steffen Thorsen's report);
|
||||
# this is almost surely wrong.
|
||||
|
||||
# From Heitor David Pinto (2024-06-23):
|
||||
# Sources about time zones in Mongolia seem to list one of two conflicting
|
||||
# configurations. The first configuration, mentioned in a comment to the TZ
|
||||
# database in 1999, citing a Mongolian government website, lists the provinces
|
||||
# of Bayan-Ölgii, Khovd and Uvs in UTC+7, and the rest of the country in
|
||||
# UTC+8. The second configuration, mentioned in a comment to the database in
|
||||
# 2001, lists Bayan-Ölgii, Khovd, Uvs, Govi-Altai and Zavkhan in UTC+7, Dornod
|
||||
# and Sükhbaatar in UTC+9, and the rest of the country in UTC+8.
|
||||
#
|
||||
# The first configuration is still mentioned by several Mongolian travel
|
||||
# agencies:
|
||||
# https://www.adventurerider.mn/en/page/about_mongolia
|
||||
# http://www.naturetours.mn/nt/mongolia.php
|
||||
# https://www.newjuulchin.mn/web/content/7506?unique=fa24a0f6e96e022a3578ee5195ac879638c734ce
|
||||
#
|
||||
# It also matches these flight schedules in 2013:
|
||||
# http://web.archive.org/web/20130722023600/https://www.hunnuair.com/en/timetabled
|
||||
# The flight times imply that the airports of Uliastai (Zavkhan), Choibalsan
|
||||
# (Dornod) and Altai (Govi-Altai) are in the same time zone as Ulaanbaatar,
|
||||
# and Khovd is one hour behind....
|
||||
#
|
||||
# The second configuration was mentioned by an official of the Mongolian
|
||||
# standards agency in an interview in 2014: https://ikon.mn/n/9v6
|
||||
# And it's still listed by the Mongolian aviation agency:
|
||||
# https://ais.mn/files/aip/eAIP/2023-12-25/html/eSUP/ZM-eSUP-23-04-en-MN.html
|
||||
#
|
||||
# ... I believe that the first configuration is what is actually observed in
|
||||
# Mongolia and has been so all along, at least since 1999. The second
|
||||
# configuration closely matches the ideal time zone boundaries at 97.5° E and
|
||||
# 112.5° E but it doesn't seem to be used in practice.
|
||||
|
||||
# From Ganbold Tsagaankhuu (2015-03-10):
|
||||
# It seems like yesterday Mongolian Government meeting has concluded to use
|
||||
@ -2961,25 +2996,18 @@ Rule Mongol 2015 2016 - Sep lastSat 0:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
# Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta
|
||||
Zone Asia/Hovd 6:06:36 - LMT 1905 Aug
|
||||
6:00 - +06 1978
|
||||
7:00 Mongol +07/+08
|
||||
6:00 - %z 1978
|
||||
7:00 Mongol %z
|
||||
# Ulaanbaatar, a.k.a. Ulan Bataar, Ulan Bator, Urga
|
||||
Zone Asia/Ulaanbaatar 7:07:32 - LMT 1905 Aug
|
||||
7:00 - +07 1978
|
||||
8:00 Mongol +08/+09
|
||||
# Choibalsan, a.k.a. Bajan Tümen, Bajan Tumen, Chojbalsan,
|
||||
# Choybalsan, Sanbejse, Tchoibalsan
|
||||
Zone Asia/Choibalsan 7:38:00 - LMT 1905 Aug
|
||||
7:00 - +07 1978
|
||||
8:00 - +08 1983 Apr
|
||||
9:00 Mongol +09/+10 2008 Mar 31
|
||||
8:00 Mongol +08/+09
|
||||
7:00 - %z 1978
|
||||
8:00 Mongol %z
|
||||
|
||||
# Nepal
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Kathmandu 5:41:16 - LMT 1920
|
||||
5:30 - +0530 1986
|
||||
5:45 - +0545
|
||||
5:30 - %z 1986
|
||||
5:45 - %z
|
||||
|
||||
# Pakistan
|
||||
|
||||
@ -3125,10 +3153,10 @@ Rule Pakistan 2009 only - Apr 15 0:00 1:00 S
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Karachi 4:28:12 - LMT 1907
|
||||
5:30 - +0530 1942 Sep
|
||||
5:30 1:00 +0630 1945 Oct 15
|
||||
5:30 - +0530 1951 Sep 30
|
||||
5:00 - +05 1971 Mar 26
|
||||
5:30 - %z 1942 Sep
|
||||
5:30 1:00 %z 1945 Oct 15
|
||||
5:30 - %z 1951 Sep 30
|
||||
5:00 - %z 1971 Mar 26
|
||||
5:00 Pakistan PK%sT # Pakistan Time
|
||||
|
||||
# Palestine
|
||||
@ -3676,14 +3704,14 @@ Zone Asia/Hebron 2:20:23 - LMT 1900 Oct
|
||||
# Philippine Star 2014-08-05
|
||||
# http://www.philstar.com/headlines/2014/08/05/1354152/pnoy-urged-declare-use-daylight-saving-time
|
||||
|
||||
# From Paul Goyette (2018-06-15):
|
||||
# From Paul Goyette (2018-06-15) with URLs updated by Guy Harris (2024-02-15):
|
||||
# In the Philippines, there is a national law, Republic Act No. 10535
|
||||
# which declares the official time here as "Philippine Standard Time".
|
||||
# The act [1] even specifies use of PST as the abbreviation, although
|
||||
# the FAQ provided by PAGASA [2] uses the "acronym PhST to distinguish
|
||||
# it from the Pacific Standard Time (PST)."
|
||||
# [1] http://www.officialgazette.gov.ph/2013/05/15/republic-act-no-10535/
|
||||
# [2] https://www1.pagasa.dost.gov.ph/index.php/astronomy/philippine-standard-time#republic-act-10535
|
||||
# [1] https://www.officialgazette.gov.ph/2013/05/15/republic-act-no-10535/
|
||||
# [2] https://prsd.pagasa.dost.gov.ph/index.php/28-astronomy/302-philippine-standard-time
|
||||
#
|
||||
# From Paul Eggert (2018-06-19):
|
||||
# I surveyed recent news reports, and my impression is that "PST" is
|
||||
@ -3716,8 +3744,8 @@ Zone Asia/Manila -15:56:00 - LMT 1844 Dec 31
|
||||
# Qatar
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha
|
||||
4:00 - +04 1972 Jun
|
||||
3:00 - +03
|
||||
4:00 - %z 1972 Jun
|
||||
3:00 - %z
|
||||
|
||||
# Kuwait
|
||||
# Saudi Arabia
|
||||
@ -3767,7 +3795,7 @@ Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha
|
||||
#
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14
|
||||
3:00 - +03
|
||||
3:00 - %z
|
||||
|
||||
# Singapore
|
||||
# taken from Mok Ly Yng (2003-10-30)
|
||||
@ -3775,13 +3803,13 @@ Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
|
||||
6:55:25 - SMT 1905 Jun 1 # Singapore M.T.
|
||||
7:00 - +07 1933 Jan 1
|
||||
7:00 0:20 +0720 1936 Jan 1
|
||||
7:20 - +0720 1941 Sep 1
|
||||
7:30 - +0730 1942 Feb 16
|
||||
9:00 - +09 1945 Sep 12
|
||||
7:30 - +0730 1981 Dec 31 16:00u
|
||||
8:00 - +08
|
||||
7:00 - %z 1933 Jan 1
|
||||
7:00 0:20 %z 1936 Jan 1
|
||||
7:20 - %z 1941 Sep 1
|
||||
7:30 - %z 1942 Feb 16
|
||||
9:00 - %z 1945 Sep 12
|
||||
7:30 - %z 1981 Dec 31 16:00u
|
||||
8:00 - %z
|
||||
|
||||
# Spratly Is
|
||||
# no information
|
||||
@ -3839,13 +3867,13 @@ Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Colombo 5:19:24 - LMT 1880
|
||||
5:19:32 - MMT 1906 # Moratuwa Mean Time
|
||||
5:30 - +0530 1942 Jan 5
|
||||
5:30 0:30 +06 1942 Sep
|
||||
5:30 1:00 +0630 1945 Oct 16 2:00
|
||||
5:30 - +0530 1996 May 25 0:00
|
||||
6:30 - +0630 1996 Oct 26 0:30
|
||||
6:00 - +06 2006 Apr 15 0:30
|
||||
5:30 - +0530
|
||||
5:30 - %z 1942 Jan 5
|
||||
5:30 0:30 %z 1942 Sep
|
||||
5:30 1:00 %z 1945 Oct 16 2:00
|
||||
5:30 - %z 1996 May 25 0:00
|
||||
6:30 - %z 1996 Oct 26 0:30
|
||||
6:00 - %z 2006 Apr 15 0:30
|
||||
5:30 - %z
|
||||
|
||||
# Syria
|
||||
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
|
||||
@ -4016,16 +4044,16 @@ Rule Syria 2009 2022 - Oct lastFri 0:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq
|
||||
2:00 Syria EE%sT 2022 Oct 28 0:00
|
||||
3:00 - +03
|
||||
3:00 - %z
|
||||
|
||||
# Tajikistan
|
||||
# From Shanks & Pottenger.
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2
|
||||
5:00 - +05 1930 Jun 21
|
||||
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
|
||||
5:00 1:00 +06 1991 Sep 9 2:00s
|
||||
5:00 - +05
|
||||
5:00 - %z 1930 Jun 21
|
||||
6:00 RussiaAsia %z 1991 Mar 31 2:00s
|
||||
5:00 1:00 %z 1991 Sep 9 2:00s
|
||||
5:00 - %z
|
||||
|
||||
# Cambodia
|
||||
# Christmas I
|
||||
@ -4035,16 +4063,16 @@ Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Bangkok 6:42:04 - LMT 1880
|
||||
6:42:04 - BMT 1920 Apr # Bangkok Mean Time
|
||||
7:00 - +07
|
||||
7:00 - %z
|
||||
|
||||
# Turkmenistan
|
||||
# From Shanks & Pottenger.
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad
|
||||
4:00 - +04 1930 Jun 21
|
||||
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00
|
||||
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00
|
||||
5:00 - +05
|
||||
4:00 - %z 1930 Jun 21
|
||||
5:00 RussiaAsia %z 1991 Mar 31 2:00
|
||||
4:00 RussiaAsia %z 1992 Jan 19 2:00
|
||||
5:00 - %z
|
||||
|
||||
# Oman
|
||||
# Réunion
|
||||
@ -4054,25 +4082,25 @@ Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad
|
||||
# The Crozet Is also observe Réunion time; see the 'antarctica' file.
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Dubai 3:41:12 - LMT 1920
|
||||
4:00 - +04
|
||||
4:00 - %z
|
||||
|
||||
# Uzbekistan
|
||||
# Byalokoz 1919 says Uzbekistan was 4:27:53.
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Asia/Samarkand 4:27:53 - LMT 1924 May 2
|
||||
4:00 - +04 1930 Jun 21
|
||||
5:00 - +05 1981 Apr 1
|
||||
5:00 1:00 +06 1981 Oct 1
|
||||
6:00 - +06 1982 Apr 1
|
||||
5:00 RussiaAsia +05/+06 1992
|
||||
5:00 - +05
|
||||
4:00 - %z 1930 Jun 21
|
||||
5:00 - %z 1981 Apr 1
|
||||
5:00 1:00 %z 1981 Oct 1
|
||||
6:00 - %z 1982 Apr 1
|
||||
5:00 RussiaAsia %z 1992
|
||||
5:00 - %z
|
||||
# Milne says Tashkent was 4:37:10.8.
|
||||
#STDOFF 4:37:10.8
|
||||
Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
|
||||
5:00 - +05 1930 Jun 21
|
||||
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00
|
||||
5:00 RussiaAsia +05/+06 1992
|
||||
5:00 - +05
|
||||
5:00 - %z 1930 Jun 21
|
||||
6:00 RussiaAsia %z 1991 Mar 31 2:00
|
||||
5:00 RussiaAsia %z 1992
|
||||
5:00 - %z
|
||||
|
||||
# Vietnam (southern)
|
||||
|
||||
@ -4130,7 +4158,7 @@ Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
|
||||
# Võ Nguyên Giáp, Việt Nam Dân Quốc Công Báo, No. 1 (1945-09-29), page 13
|
||||
# http://baochi.nlv.gov.vn/baochi/cgi-bin/baochi?a=d&d=JwvzO19450929.2.5&dliv=none
|
||||
# It says that on 1945-09-01 at 24:00, Vietnam moved back two hours, to +07.
|
||||
# It also mentions a 1945-03-29 decree (by a Japanese Goveror-General)
|
||||
# It also mentions a 1945-03-29 decree (by a Japanese Governor-General)
|
||||
# to set the time zone to +09, but does not say whether that decree
|
||||
# merely legalized an earlier change to +09.
|
||||
#
|
||||
@ -4151,14 +4179,14 @@ Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
|
||||
#STDOFF 7:06:30.13
|
||||
Zone Asia/Ho_Chi_Minh 7:06:30 - LMT 1906 Jul 1
|
||||
7:06:30 - PLMT 1911 May 1 # Phù Liễn MT
|
||||
7:00 - +07 1942 Dec 31 23:00
|
||||
8:00 - +08 1945 Mar 14 23:00
|
||||
9:00 - +09 1945 Sep 1 24:00
|
||||
7:00 - +07 1947 Apr 1
|
||||
8:00 - +08 1955 Jul 1 01:00
|
||||
7:00 - +07 1959 Dec 31 23:00
|
||||
8:00 - +08 1975 Jun 13
|
||||
7:00 - +07
|
||||
7:00 - %z 1942 Dec 31 23:00
|
||||
8:00 - %z 1945 Mar 14 23:00
|
||||
9:00 - %z 1945 Sep 1 24:00
|
||||
7:00 - %z 1947 Apr 1
|
||||
8:00 - %z 1955 Jul 1 01:00
|
||||
7:00 - %z 1959 Dec 31 23:00
|
||||
8:00 - %z 1975 Jun 13
|
||||
7:00 - %z
|
||||
|
||||
# From Paul Eggert (2019-02-19):
|
||||
#
|
||||
|
||||
@ -66,8 +66,8 @@ Zone Australia/Perth 7:43:24 - LMT 1895 Dec
|
||||
8:00 Aus AW%sT 1943 Jul
|
||||
8:00 AW AW%sT
|
||||
Zone Australia/Eucla 8:35:28 - LMT 1895 Dec
|
||||
8:45 Aus +0845/+0945 1943 Jul
|
||||
8:45 AW +0845/+0945
|
||||
8:45 Aus %z 1943 Jul
|
||||
8:45 AW %z
|
||||
|
||||
# Queensland
|
||||
#
|
||||
@ -232,8 +232,8 @@ Rule LH 2008 max - Apr Sun>=1 2:00 0 -
|
||||
Rule LH 2008 max - Oct Sun>=1 2:00 0:30 -
|
||||
Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb
|
||||
10:00 - AEST 1981 Mar
|
||||
10:30 LH +1030/+1130 1985 Jul
|
||||
10:30 LH +1030/+11
|
||||
10:30 LH %z 1985 Jul
|
||||
10:30 LH %z
|
||||
|
||||
# Australian miscellany
|
||||
#
|
||||
@ -439,16 +439,16 @@ Rule Fiji 2019 only - Nov Sun>=8 2:00 1:00 -
|
||||
Rule Fiji 2020 only - Dec 20 2:00 1:00 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva
|
||||
12:00 Fiji +12/+13
|
||||
12:00 Fiji %z
|
||||
|
||||
# French Polynesia
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct 1 # Rikitea
|
||||
-9:00 - -09
|
||||
-9:00 - %z
|
||||
Zone Pacific/Marquesas -9:18:00 - LMT 1912 Oct 1
|
||||
-9:30 - -0930
|
||||
-9:30 - %z
|
||||
Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct 1 # Papeete
|
||||
-10:00 - -10
|
||||
-10:00 - %z
|
||||
# Clipperton (near North America) is administered from French Polynesia;
|
||||
# it is uninhabited.
|
||||
|
||||
@ -491,7 +491,7 @@ Rule Guam 1977 only - Aug 28 2:00 0 S
|
||||
Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
|
||||
9:39:00 - LMT 1901 # Agana
|
||||
10:00 - GST 1941 Dec 10 # Guam
|
||||
9:00 - +09 1944 Jul 31
|
||||
9:00 - %z 1944 Jul 31
|
||||
10:00 Guam G%sT 2000 Dec 23
|
||||
10:00 - ChST # Chamorro Standard Time
|
||||
|
||||
@ -503,30 +503,30 @@ Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
|
||||
# Wallis & Futuna
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Tarawa 11:32:04 - LMT 1901 # Bairiki
|
||||
12:00 - +12
|
||||
12:00 - %z
|
||||
|
||||
# Kiribati (except Gilbert Is)
|
||||
# See Pacific/Tarawa for the Gilbert Is.
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Kanton 0 - -00 1937 Aug 31
|
||||
-12:00 - -12 1979 Oct
|
||||
-11:00 - -11 1994 Dec 31
|
||||
13:00 - +13
|
||||
-12:00 - %z 1979 Oct
|
||||
-11:00 - %z 1994 Dec 31
|
||||
13:00 - %z
|
||||
Zone Pacific/Kiritimati -10:29:20 - LMT 1901
|
||||
-10:40 - -1040 1979 Oct
|
||||
-10:00 - -10 1994 Dec 31
|
||||
14:00 - +14
|
||||
-10:40 - %z 1979 Oct
|
||||
-10:00 - %z 1994 Dec 31
|
||||
14:00 - %z
|
||||
|
||||
# Marshall Is
|
||||
# See Pacific/Tarawa for most locations.
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Kwajalein 11:09:20 - LMT 1901
|
||||
11:00 - +11 1937
|
||||
10:00 - +10 1941 Apr 1
|
||||
9:00 - +09 1944 Feb 6
|
||||
11:00 - +11 1969 Oct
|
||||
-12:00 - -12 1993 Aug 20 24:00
|
||||
12:00 - +12
|
||||
11:00 - %z 1937
|
||||
10:00 - %z 1941 Apr 1
|
||||
9:00 - %z 1944 Feb 6
|
||||
11:00 - %z 1969 Oct
|
||||
-12:00 - %z 1993 Aug 20 24:00
|
||||
12:00 - %z
|
||||
|
||||
# Micronesia
|
||||
# For Chuuk and Yap see Pacific/Port_Moresby.
|
||||
@ -534,22 +534,22 @@ Zone Pacific/Kwajalein 11:09:20 - LMT 1901
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Kosrae -13:08:04 - LMT 1844 Dec 31
|
||||
10:51:56 - LMT 1901
|
||||
11:00 - +11 1914 Oct
|
||||
9:00 - +09 1919 Feb 1
|
||||
11:00 - +11 1937
|
||||
10:00 - +10 1941 Apr 1
|
||||
9:00 - +09 1945 Aug
|
||||
11:00 - +11 1969 Oct
|
||||
12:00 - +12 1999
|
||||
11:00 - +11
|
||||
11:00 - %z 1914 Oct
|
||||
9:00 - %z 1919 Feb 1
|
||||
11:00 - %z 1937
|
||||
10:00 - %z 1941 Apr 1
|
||||
9:00 - %z 1945 Aug
|
||||
11:00 - %z 1969 Oct
|
||||
12:00 - %z 1999
|
||||
11:00 - %z
|
||||
|
||||
# Nauru
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Nauru 11:07:40 - LMT 1921 Jan 15 # Uaobe
|
||||
11:30 - +1130 1942 Aug 29
|
||||
9:00 - +09 1945 Sep 8
|
||||
11:30 - +1130 1979 Feb 10 2:00
|
||||
12:00 - +12
|
||||
11:30 - %z 1942 Aug 29
|
||||
9:00 - %z 1945 Sep 8
|
||||
11:30 - %z 1979 Feb 10 2:00
|
||||
12:00 - %z
|
||||
|
||||
# New Caledonia
|
||||
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
|
||||
@ -560,7 +560,7 @@ Rule NC 1996 only - Dec 1 2:00s 1:00 -
|
||||
Rule NC 1997 only - Mar 2 2:00s 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Noumea 11:05:48 - LMT 1912 Jan 13 # Nouméa
|
||||
11:00 NC +11/+12
|
||||
11:00 NC %z
|
||||
|
||||
|
||||
###############################################################################
|
||||
@ -604,8 +604,8 @@ Zone Pacific/Auckland 11:39:04 - LMT 1868 Nov 2
|
||||
12:00 NZ NZ%sT
|
||||
|
||||
Zone Pacific/Chatham 12:13:48 - LMT 1868 Nov 2
|
||||
12:15 - +1215 1946 Jan 1
|
||||
12:45 Chatham +1245/+1345
|
||||
12:15 - %z 1946 Jan 1
|
||||
12:45 Chatham %z
|
||||
|
||||
# Auckland Is
|
||||
# uninhabited; Māori and Moriori, colonial settlers, pastoralists, sealers,
|
||||
@ -658,8 +658,8 @@ Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Rarotonga 13:20:56 - LMT 1899 Dec 26 # Avarua
|
||||
-10:39:04 - LMT 1952 Oct 16
|
||||
-10:30 - -1030 1978 Nov 12
|
||||
-10:00 Cook -10/-0930
|
||||
-10:30 - %z 1978 Nov 12
|
||||
-10:00 Cook %z
|
||||
|
||||
###############################################################################
|
||||
|
||||
@ -676,30 +676,30 @@ Zone Pacific/Rarotonga 13:20:56 - LMT 1899 Dec 26 # Avarua
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Niue -11:19:40 - LMT 1952 Oct 16 # Alofi
|
||||
-11:20 - -1120 1964 Jul
|
||||
-11:00 - -11
|
||||
-11:20 - %z 1964 Jul
|
||||
-11:00 - %z
|
||||
|
||||
# Norfolk
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Norfolk 11:11:52 - LMT 1901 # Kingston
|
||||
11:12 - +1112 1951
|
||||
11:30 - +1130 1974 Oct 27 02:00s
|
||||
11:30 1:00 +1230 1975 Mar 2 02:00s
|
||||
11:30 - +1130 2015 Oct 4 02:00s
|
||||
11:00 - +11 2019 Jul
|
||||
11:00 AN +11/+12
|
||||
11:12 - %z 1951
|
||||
11:30 - %z 1974 Oct 27 02:00s
|
||||
11:30 1:00 %z 1975 Mar 2 02:00s
|
||||
11:30 - %z 2015 Oct 4 02:00s
|
||||
11:00 - %z 2019 Jul
|
||||
11:00 AN %z
|
||||
|
||||
# Palau (Belau)
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Palau -15:02:04 - LMT 1844 Dec 31 # Koror
|
||||
8:57:56 - LMT 1901
|
||||
9:00 - +09
|
||||
9:00 - %z
|
||||
|
||||
# Papua New Guinea
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Port_Moresby 9:48:40 - LMT 1880
|
||||
9:48:32 - PMMT 1895 # Port Moresby Mean Time
|
||||
10:00 - +10
|
||||
10:00 - %z
|
||||
#
|
||||
# From Paul Eggert (2014-10-13):
|
||||
# Base the Bougainville entry on the Arawa-Kieta region, which appears to have
|
||||
@ -720,16 +720,16 @@ Zone Pacific/Port_Moresby 9:48:40 - LMT 1880
|
||||
#
|
||||
Zone Pacific/Bougainville 10:22:16 - LMT 1880
|
||||
9:48:32 - PMMT 1895
|
||||
10:00 - +10 1942 Jul
|
||||
9:00 - +09 1945 Aug 21
|
||||
10:00 - +10 2014 Dec 28 2:00
|
||||
11:00 - +11
|
||||
10:00 - %z 1942 Jul
|
||||
9:00 - %z 1945 Aug 21
|
||||
10:00 - %z 2014 Dec 28 2:00
|
||||
11:00 - %z
|
||||
|
||||
# Pitcairn
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Pitcairn -8:40:20 - LMT 1901 # Adamstown
|
||||
-8:30 - -0830 1998 Apr 27 0:00
|
||||
-8:00 - -08
|
||||
-8:30 - %z 1998 Apr 27 0:00
|
||||
-8:00 - %z
|
||||
|
||||
# American Samoa
|
||||
# Midway
|
||||
@ -818,15 +818,15 @@ Rule WS 2012 2020 - Sep lastSun 3:00 1 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Apia 12:33:04 - LMT 1892 Jul 5
|
||||
-11:26:56 - LMT 1911
|
||||
-11:30 - -1130 1950
|
||||
-11:00 WS -11/-10 2011 Dec 29 24:00
|
||||
13:00 WS +13/+14
|
||||
-11:30 - %z 1950
|
||||
-11:00 WS %z 2011 Dec 29 24:00
|
||||
13:00 WS %z
|
||||
|
||||
# Solomon Is
|
||||
# excludes Bougainville, for which see Papua New Guinea
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara
|
||||
11:00 - +11
|
||||
11:00 - %z
|
||||
|
||||
# Tokelau
|
||||
#
|
||||
@ -849,8 +849,8 @@ Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Fakaofo -11:24:56 - LMT 1901
|
||||
-11:00 - -11 2011 Dec 30
|
||||
13:00 - +13
|
||||
-11:00 - %z 2011 Dec 30
|
||||
13:00 - %z
|
||||
|
||||
# Tonga
|
||||
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
|
||||
@ -862,9 +862,9 @@ Rule Tonga 2016 only - Nov Sun>=1 2:00 1:00 -
|
||||
Rule Tonga 2017 only - Jan Sun>=15 3:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Tongatapu 12:19:12 - LMT 1945 Sep 10
|
||||
12:20 - +1220 1961
|
||||
13:00 - +13 1999
|
||||
13:00 Tonga +13/+14
|
||||
12:20 - %z 1961
|
||||
13:00 - %z 1999
|
||||
13:00 Tonga %z
|
||||
|
||||
|
||||
# US minor outlying islands
|
||||
@ -953,7 +953,7 @@ Rule Vanuatu 1992 1993 - Jan Sat>=22 24:00 0 -
|
||||
Rule Vanuatu 1992 only - Oct Sat>=22 24:00 1:00 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila
|
||||
11:00 Vanuatu +11/+12
|
||||
11:00 Vanuatu %z
|
||||
|
||||
###############################################################################
|
||||
|
||||
|
||||
@ -21,12 +21,13 @@
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# tzdb links for backward compatibility
|
||||
# Links and zones for backward compatibility
|
||||
|
||||
# This file is in the public domain, so clarified as of
|
||||
# 2009-05-17 by Arthur David Olson.
|
||||
|
||||
# This file provides links from old or merged timezone names to current ones.
|
||||
# It also provides a few zone entries for old naming conventions.
|
||||
# Many names changed in 1993 and in 1995, and many merged names moved here
|
||||
# in the period from 2013 through 2022. Several of these names are
|
||||
# also present in the file 'backzone', which has data important only
|
||||
@ -67,6 +68,8 @@ Link America/Rio_Branco Brazil/Acre #= America/Porto_Acre
|
||||
Link America/Noronha Brazil/DeNoronha
|
||||
Link America/Sao_Paulo Brazil/East
|
||||
Link America/Manaus Brazil/West
|
||||
Link Europe/Brussels CET
|
||||
Link America/Chicago CST6CDT
|
||||
Link America/Halifax Canada/Atlantic
|
||||
Link America/Winnipeg Canada/Central
|
||||
# This line is commented out, as the name exceeded the 14-character limit
|
||||
@ -81,6 +84,9 @@ Link America/Whitehorse Canada/Yukon
|
||||
Link America/Santiago Chile/Continental
|
||||
Link Pacific/Easter Chile/EasterIsland
|
||||
Link America/Havana Cuba
|
||||
Link Europe/Athens EET
|
||||
Link America/Panama EST
|
||||
Link America/New_York EST5EDT
|
||||
Link Africa/Cairo Egypt
|
||||
Link Europe/Dublin Eire
|
||||
# Vanguard section, for most .zi parsers.
|
||||
@ -119,6 +125,9 @@ Link America/Jamaica Jamaica
|
||||
Link Asia/Tokyo Japan
|
||||
Link Pacific/Kwajalein Kwajalein
|
||||
Link Africa/Tripoli Libya
|
||||
Link Europe/Brussels MET
|
||||
Link America/Phoenix MST
|
||||
Link America/Denver MST7MDT
|
||||
Link America/Tijuana Mexico/BajaNorte
|
||||
Link America/Mazatlan Mexico/BajaSur
|
||||
Link America/Mexico_City Mexico/General
|
||||
@ -298,6 +307,7 @@ Link America/Denver America/Shiprock
|
||||
Link America/Toronto America/Thunder_Bay
|
||||
Link America/Edmonton America/Yellowknife
|
||||
Link Pacific/Auckland Antarctica/South_Pole
|
||||
Link Asia/Ulaanbaatar Asia/Choibalsan
|
||||
Link Asia/Shanghai Asia/Chongqing
|
||||
Link Asia/Shanghai Asia/Harbin
|
||||
Link Asia/Urumqi Asia/Kashgar
|
||||
@ -312,6 +322,7 @@ Link Europe/Kyiv Europe/Zaporozhye
|
||||
Link Pacific/Kanton Pacific/Enderbury
|
||||
Link Pacific/Honolulu Pacific/Johnston
|
||||
Link Pacific/Port_Moresby Pacific/Yap
|
||||
Link Europe/Lisbon WET
|
||||
|
||||
|
||||
# Alternate names for the same location
|
||||
@ -337,5 +348,7 @@ Link Europe/Kyiv Europe/Kiev
|
||||
# Classically, Cyprus is in Asia; e.g. see Herodotus, Histories, I.72.
|
||||
# However, for various reasons many users expect to find it under Europe.
|
||||
Link Asia/Nicosia Europe/Nicosia
|
||||
Link Pacific/Honolulu HST
|
||||
Link America/Los_Angeles PST8PDT
|
||||
Link Pacific/Guadalcanal Pacific/Ponape #= Pacific/Pohnpei
|
||||
Link Pacific/Port_Moresby Pacific/Truk #= Pacific/Chuuk
|
||||
|
||||
@ -28,7 +28,7 @@
|
||||
|
||||
# These entries are for uses not otherwise covered by the tz database.
|
||||
# Their main practical use is for platforms like Android that lack
|
||||
# support for POSIX.1-2017-style TZ strings. On such platforms these entries
|
||||
# support for POSIX proleptic TZ strings. On such platforms these entries
|
||||
# can be useful if the timezone database is wrong or if a ship or
|
||||
# aircraft at sea is not in a timezone.
|
||||
|
||||
@ -74,29 +74,29 @@ Link Etc/GMT GMT
|
||||
# so we moved the names into the Etc subdirectory.
|
||||
# Also, the time zone abbreviations are now compatible with %z.
|
||||
|
||||
Zone Etc/GMT-14 14 - +14
|
||||
Zone Etc/GMT-13 13 - +13
|
||||
Zone Etc/GMT-12 12 - +12
|
||||
Zone Etc/GMT-11 11 - +11
|
||||
Zone Etc/GMT-10 10 - +10
|
||||
Zone Etc/GMT-9 9 - +09
|
||||
Zone Etc/GMT-8 8 - +08
|
||||
Zone Etc/GMT-7 7 - +07
|
||||
Zone Etc/GMT-6 6 - +06
|
||||
Zone Etc/GMT-5 5 - +05
|
||||
Zone Etc/GMT-4 4 - +04
|
||||
Zone Etc/GMT-3 3 - +03
|
||||
Zone Etc/GMT-2 2 - +02
|
||||
Zone Etc/GMT-1 1 - +01
|
||||
Zone Etc/GMT+1 -1 - -01
|
||||
Zone Etc/GMT+2 -2 - -02
|
||||
Zone Etc/GMT+3 -3 - -03
|
||||
Zone Etc/GMT+4 -4 - -04
|
||||
Zone Etc/GMT+5 -5 - -05
|
||||
Zone Etc/GMT+6 -6 - -06
|
||||
Zone Etc/GMT+7 -7 - -07
|
||||
Zone Etc/GMT+8 -8 - -08
|
||||
Zone Etc/GMT+9 -9 - -09
|
||||
Zone Etc/GMT+10 -10 - -10
|
||||
Zone Etc/GMT+11 -11 - -11
|
||||
Zone Etc/GMT+12 -12 - -12
|
||||
Zone Etc/GMT-14 14 - %z
|
||||
Zone Etc/GMT-13 13 - %z
|
||||
Zone Etc/GMT-12 12 - %z
|
||||
Zone Etc/GMT-11 11 - %z
|
||||
Zone Etc/GMT-10 10 - %z
|
||||
Zone Etc/GMT-9 9 - %z
|
||||
Zone Etc/GMT-8 8 - %z
|
||||
Zone Etc/GMT-7 7 - %z
|
||||
Zone Etc/GMT-6 6 - %z
|
||||
Zone Etc/GMT-5 5 - %z
|
||||
Zone Etc/GMT-4 4 - %z
|
||||
Zone Etc/GMT-3 3 - %z
|
||||
Zone Etc/GMT-2 2 - %z
|
||||
Zone Etc/GMT-1 1 - %z
|
||||
Zone Etc/GMT+1 -1 - %z
|
||||
Zone Etc/GMT+2 -2 - %z
|
||||
Zone Etc/GMT+3 -3 - %z
|
||||
Zone Etc/GMT+4 -4 - %z
|
||||
Zone Etc/GMT+5 -5 - %z
|
||||
Zone Etc/GMT+6 -6 - %z
|
||||
Zone Etc/GMT+7 -7 - %z
|
||||
Zone Etc/GMT+8 -8 - %z
|
||||
Zone Etc/GMT+9 -9 - %z
|
||||
Zone Etc/GMT+10 -10 - %z
|
||||
Zone Etc/GMT+11 -11 - %z
|
||||
Zone Etc/GMT+12 -12 - %z
|
||||
|
||||
@ -753,14 +753,6 @@ Rule Russia 1996 2010 - Oct lastSun 2:00s 0 -
|
||||
# Take "abolishing daylight saving time" to mean that time is now considered
|
||||
# to be standard.
|
||||
|
||||
# These are for backward compatibility with older versions.
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone WET 0:00 EU WE%sT
|
||||
Zone CET 1:00 C-Eur CE%sT
|
||||
Zone MET 1:00 C-Eur ME%sT
|
||||
Zone EET 2:00 EU EE%sT
|
||||
|
||||
# Previous editions of this database used abbreviations like MET DST
|
||||
# for Central European Summer Time, but this didn't agree with common usage.
|
||||
|
||||
@ -894,7 +886,7 @@ Zone Europe/Minsk 1:50:16 - LMT 1880
|
||||
3:00 Russia MSK/MSD 1990
|
||||
3:00 - MSK 1991 Mar 31 2:00s
|
||||
2:00 Russia EE%sT 2011 Mar 27 2:00s
|
||||
3:00 - +03
|
||||
3:00 - %z
|
||||
|
||||
# Belgium
|
||||
# Luxembourg
|
||||
@ -1199,22 +1191,22 @@ Rule Thule 2007 max - Nov Sun>=1 2:00 0 S
|
||||
#
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28
|
||||
-3:00 - -03 1980 Apr 6 2:00
|
||||
-3:00 EU -03/-02 1996
|
||||
-3:00 - %z 1980 Apr 6 2:00
|
||||
-3:00 EU %z 1996
|
||||
0:00 - GMT
|
||||
#
|
||||
# Use the old name Scoresbysund, as the current name Ittoqqortoormiit
|
||||
# exceeds tzdb's 14-letter limit and has no common English abbreviation.
|
||||
Zone America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 # Ittoqqortoormiit
|
||||
-2:00 - -02 1980 Apr 6 2:00
|
||||
-2:00 C-Eur -02/-01 1981 Mar 29
|
||||
-1:00 EU -01/+00 2024 Mar 31
|
||||
-2:00 EU -02/-01
|
||||
-2:00 - %z 1980 Apr 6 2:00
|
||||
-2:00 C-Eur %z 1981 Mar 29
|
||||
-1:00 EU %z 2024 Mar 31
|
||||
-2:00 EU %z
|
||||
Zone America/Nuuk -3:26:56 - LMT 1916 Jul 28 # Godthåb
|
||||
-3:00 - -03 1980 Apr 6 2:00
|
||||
-3:00 EU -03/-02 2023 Mar 26 1:00u
|
||||
-2:00 - -02 2023 Oct 29 1:00u
|
||||
-2:00 EU -02/-01
|
||||
-3:00 - %z 1980 Apr 6 2:00
|
||||
-3:00 EU %z 2023 Mar 26 1:00u
|
||||
-2:00 - %z 2023 Oct 29 1:00u
|
||||
-2:00 EU %z
|
||||
Zone America/Thule -4:35:08 - LMT 1916 Jul 28 # Pituffik
|
||||
-4:00 Thule A%sT
|
||||
|
||||
@ -2086,10 +2078,39 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880
|
||||
|
||||
# Portugal
|
||||
|
||||
# From Paul Eggert (2014-08-11), after a heads-up from Stephen Colebourne:
|
||||
# According to a Portuguese decree (1911-05-26)
|
||||
# https://dre.pt/application/dir/pdf1sdip/1911/05/12500/23132313.pdf
|
||||
# Lisbon was at -0:36:44.68, but switched to GMT on 1912-01-01 at 00:00.
|
||||
# From Tim Parenti (2024-07-01), per Alois Treindl (2021-02-07) and Michael
|
||||
# Deckers (2021-02-10):
|
||||
# http://oal.ul.pt/documentos/2018/01/hl1911a2018.pdf/
|
||||
# The Astronomical Observatory of Lisbon has published a list detailing the
|
||||
# historical transitions in legal time within continental Portugal. It
|
||||
# directly references many decrees and ordinances which are, in turn,
|
||||
# referenced below. They can be viewed in the public archives of the Diário da
|
||||
# República (until 1976-04-09 known as the Diário do Govêrno) at
|
||||
# https://dre.pt/ (in Portuguese).
|
||||
#
|
||||
# Most of the Rules below have been updated simply to match the Observatory's
|
||||
# listing for continental (mainland) Portugal. Although there are over 50
|
||||
# referenced decrees and ordinances, only the handful with comments below have
|
||||
# been verified against the text, typically to provide additional confidence
|
||||
# wherever dates provided by Whitman and Shanks & Pottenger had disagreed.
|
||||
# See further below for the Azores and Madeira.
|
||||
|
||||
# From Tim Parenti (2024-07-01), per Paul Eggert (2014-08-11), after a
|
||||
# heads-up from Stephen Colebourne:
|
||||
# According to a 1911-05-24 Portuguese decree, Lisbon was at -0:36:44.68, but
|
||||
# switched to GMT on 1912-01-01 at 00:00.
|
||||
# https://dre.pt/dr/detalhe/decreto/593090
|
||||
# https://dre.pt/application/conteudo/593090
|
||||
# The decree made legal time throughout Portugal and her possessions
|
||||
# "subordinate to the Greenwich meridian, according to the principle adopted at
|
||||
# the Washington Convention in 1884" and eliminated the "difference of five
|
||||
# minutes between the internal and external clocks of railway stations".
|
||||
#
|
||||
# The decree was gazetted in the 1911-05-30 issue of Diário do Govêrno, and is
|
||||
# considered to be dated 1911-05-24 by that issue's summary; however, the text
|
||||
# of the decree itself is dated 1911-05-26. The Diário da República website
|
||||
# notes the discrepancy, but later laws and the Observatory all seem to refer
|
||||
# to this decree by the 1911-05-24 date.
|
||||
#
|
||||
# From Michael Deckers (2018-02-15):
|
||||
# article 5 [of the 1911 decree; Deckers's translation] ...:
|
||||
@ -2097,37 +2118,62 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880
|
||||
# according to the 2nd article, the civil day January 1, 1912 begins,
|
||||
# all clocks therefore having to be advanced or set back correspondingly ...
|
||||
|
||||
# From Rui Pedro Salgueiro (1992-11-12):
|
||||
# Portugal has recently (September, 27) changed timezone
|
||||
# (from WET to MET or CET) to harmonize with EEC.
|
||||
#
|
||||
# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
|
||||
# that Portugal is reverting to 0:00 by not moving its clocks this spring.
|
||||
# The new Prime Minister was fed up with getting up in the dark in the winter.
|
||||
#
|
||||
# From Paul Eggert (1996-11-12):
|
||||
# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
|
||||
# at 02:00u, not 01:00u. Assume that these are typos.
|
||||
# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
|
||||
# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
|
||||
# Guess that the Azores changed to EU rules in 1992 (since that's when Portugal
|
||||
# harmonized with EU rules), and that they stayed +0:00 that winter.
|
||||
#
|
||||
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
|
||||
# DSH writes that despite Decree 1,469 (1915), the change to the clocks was not
|
||||
# done every year, depending on what Spain did, because of railroad schedules.
|
||||
# Go with Shanks & Pottenger.
|
||||
# From Tim Parenti (2024-07-01), per Paul Eggert (1999-01-30):
|
||||
# DSH writes in their history that Decreto 1469 of 1915-03-30 established
|
||||
# summer time and that, "despite" this, the change to the clocks was not done
|
||||
# every year, depending on what Spain did, because of railroad schedules.
|
||||
# In fact, that decree had nothing to do with DST; rather, it regulated the
|
||||
# sending of time signals. But we do see linkage to Spain in the 1920s below.
|
||||
# https://dre.pt/dr/detalhe/decreto/1469-1915-285721
|
||||
# https://dre.pt/application/conteudo/285721
|
||||
#
|
||||
# According to the Observatory, standard time was first advanced by Decreto
|
||||
# 2433 of 1916-06-09 and restored by Decreto 2712 of 1916-10-28. While Whitman
|
||||
# gives 1916-10-31 for the latter transition, Shanks & Pottenger agrees more
|
||||
# closely with the decree, which stated that its provision "will start sixty
|
||||
# minutes after the end of 31 October, according to the current time," i.e.,
|
||||
# 01:00 on 1 November.
|
||||
# https://dre.pt/dr/detalhe/decreto/2433-1916-267192
|
||||
# https://dre.pt/application/conteudo/267192
|
||||
# https://dre.pt/dr/detalhe/decreto/2712-1916-590937
|
||||
# https://dre.pt/application/conteudo/590937
|
||||
Rule Port 1916 only - Jun 17 23:00 1:00 S
|
||||
# Whitman gives 1916 Oct 31; go with Shanks & Pottenger.
|
||||
Rule Port 1916 only - Nov 1 1:00 0 -
|
||||
Rule Port 1917 only - Feb 28 23:00s 1:00 S
|
||||
Rule Port 1917 1921 - Oct 14 23:00s 0 -
|
||||
Rule Port 1918 only - Mar 1 23:00s 1:00 S
|
||||
Rule Port 1919 only - Feb 28 23:00s 1:00 S
|
||||
Rule Port 1920 only - Feb 29 23:00s 1:00 S
|
||||
Rule Port 1921 only - Feb 28 23:00s 1:00 S
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# Article 7 of Decreto 2922 of 1916-12-30 stated that "the legal time will be
|
||||
# advanced by sixty minutes from 1 March to 31 October." Per Article 15, this
|
||||
# came into force from 1917-01-01. Just before the first fall back, Decreto
|
||||
# 3446 of 1917-10-11 changed the annual end date to 14 October.
|
||||
# https://dre.pt/dr/detalhe/decreto/2922-1916-261894
|
||||
# https://dre.pt/application/conteudo/261894
|
||||
# https://dre.pt/dr/detalhe/decreto/3446-1917-495161
|
||||
# https://dre.pt/application/conteudo/495161
|
||||
# This annual change was revoked by Decreto 8038 of 1922-02-18.
|
||||
# https://dre.pt/dr/detalhe/decreto/8038-1922-569751
|
||||
# https://dre.pt/application/conteudo/569751
|
||||
Rule Port 1917 1921 - Mar 1 0:00 1:00 S
|
||||
Rule Port 1917 1921 - Oct 14 24:00 0 -
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# Decreto 9592 of 1924-04-14 noted that "France maintains the advance of legal
|
||||
# time in the summer and Spain has now adopted it for the first time" and
|
||||
# considered "that the absence of similar measures would cause serious
|
||||
# difficulties for international rail connections with consequent repercussions
|
||||
# on domestic service hours..." along with "inconvenient analogues...for postal
|
||||
# and telegraph services." Summer time would be in effect from 17 April to 4
|
||||
# October, with the spring change explicitly specified by bringing clocks
|
||||
# forward from 16 April 23:00.
|
||||
# https://dre.pt/dr/detalhe/decreto/9592-1924-652133
|
||||
# https://dre.pt/application/conteudo/652133
|
||||
#
|
||||
# Decreto 10700, issued 1925-04-16, noted that Spain had not continued summer
|
||||
# time, declared that "the current legal hour prior to 17 April remains
|
||||
# unchanged from that day forward", and revoked legislation to the contrary,
|
||||
# just a day before summer time would have otherwise resumed.
|
||||
# https://dre.pt/dr/detalhe/decreto/10700-1925-437826
|
||||
# https://dre.pt/application/conteudo/437826
|
||||
Rule Port 1924 only - Apr 16 23:00s 1:00 S
|
||||
Rule Port 1924 only - Oct 14 23:00s 0 -
|
||||
Rule Port 1924 only - Oct 4 23:00s 0 -
|
||||
Rule Port 1926 only - Apr 17 23:00s 1:00 S
|
||||
Rule Port 1926 1929 - Oct Sat>=1 23:00s 0 -
|
||||
Rule Port 1927 only - Apr 9 23:00s 1:00 S
|
||||
@ -2139,6 +2185,8 @@ Rule Port 1931 1932 - Oct Sat>=1 23:00s 0 -
|
||||
Rule Port 1932 only - Apr 2 23:00s 1:00 S
|
||||
Rule Port 1934 only - Apr 7 23:00s 1:00 S
|
||||
# Whitman gives 1934 Oct 5; go with Shanks & Pottenger.
|
||||
# Note: The 1935 law specified 10-06 00:00, not 10-05 24:00, but the following
|
||||
# is equivalent and more succinct.
|
||||
Rule Port 1934 1938 - Oct Sat>=1 23:00s 0 -
|
||||
# Shanks & Pottenger give 1935 Apr 30; go with Whitman.
|
||||
Rule Port 1935 only - Mar 30 23:00s 1:00 S
|
||||
@ -2149,10 +2197,19 @@ Rule Port 1938 only - Mar 26 23:00s 1:00 S
|
||||
Rule Port 1939 only - Apr 15 23:00s 1:00 S
|
||||
# Whitman gives 1939 Oct 7; go with Shanks & Pottenger.
|
||||
Rule Port 1939 only - Nov 18 23:00s 0 -
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# Portaria 9465 of 1940-02-17 advanced clocks from Saturday 1940-02-24 23:00.
|
||||
# The clocks were restored by Portaria 9658, issued Monday 1940-10-07,
|
||||
# effective from 24:00 that very night, which agrees with Shanks & Pottenger;
|
||||
# Whitman gives Saturday 1940-10-05 instead.
|
||||
# https://dre.pt/dr/detalhe/portaria/9465-1940-189096
|
||||
# https://dre.pt/application/conteudo/189096
|
||||
# https://dre.pt/dr/detalhe/portaria/9658-1940-196729
|
||||
# https://dre.pt/application/conteudo/196729
|
||||
Rule Port 1940 only - Feb 24 23:00s 1:00 S
|
||||
# Shanks & Pottenger give 1940 Oct 7; go with Whitman.
|
||||
Rule Port 1940 1941 - Oct 5 23:00s 0 -
|
||||
Rule Port 1940 only - Oct 7 23:00s 0 -
|
||||
Rule Port 1941 only - Apr 5 23:00s 1:00 S
|
||||
Rule Port 1941 only - Oct 5 23:00s 0 -
|
||||
Rule Port 1942 1945 - Mar Sat>=8 23:00s 1:00 S
|
||||
Rule Port 1942 only - Apr 25 22:00s 2:00 M # Midsummer
|
||||
Rule Port 1942 only - Aug 15 22:00s 1:00 S
|
||||
@ -2162,66 +2219,195 @@ Rule Port 1943 1945 - Aug Sat>=25 22:00s 1:00 S
|
||||
Rule Port 1944 1945 - Apr Sat>=21 22:00s 2:00 M
|
||||
Rule Port 1946 only - Apr Sat>=1 23:00s 1:00 S
|
||||
Rule Port 1946 only - Oct Sat>=1 23:00s 0 -
|
||||
# Whitman says DST was not observed in 1950; go with Shanks & Pottenger.
|
||||
# Whitman gives Oct lastSun for 1952 on; go with Shanks & Pottenger.
|
||||
Rule Port 1947 1965 - Apr Sun>=1 2:00s 1:00 S
|
||||
# From Tim Parenti (2024-07-01), per Alois Treindl (2021-02-07):
|
||||
# The Astronomical Observatory of Lisbon cites Portaria 11767 of 1947-03-28 for
|
||||
# 1947 and Portaria 12286 of 1948-02-19 for 1948.
|
||||
# https://dre.pt/dr/detalhe/portaria/11767-1947-414787
|
||||
# https://dre.pt/application/conteudo/414787
|
||||
# https://dre.pt/dr/detalhe/portaria/12286-1948-152953
|
||||
# https://dre.pt/application/conteudo/152953
|
||||
#
|
||||
# Although the latter ordinance explicitly had the 1948-10-03 transition
|
||||
# scheduled for 02:00 rather than 03:00 as had been used in 1947, Decreto-Lei
|
||||
# 37048 of 1948-09-07 recognized "that it is advisable to definitely set...the
|
||||
# 'summer time' regime", and fixed the fall transition at 03:00 moving forward.
|
||||
# https://dre.pt/dr/detalhe/decreto-lei/37048-1948-373810
|
||||
# https://dre.pt/application/conteudo/373810
|
||||
# While the Observatory only cites this act for 1949-1965 and not for 1948, it
|
||||
# does not appear to have had any provision delaying its effect, so assume that
|
||||
# it overrode the prior ordinance for 1948-10-03.
|
||||
#
|
||||
# Whitman says DST was not observed in 1950 and gives Oct lastSun for 1952 on.
|
||||
# The Observatory, however, agrees with Shanks & Pottenger that 1950 was not an
|
||||
# exception and that Oct Sun>=1 was maintained through 1965.
|
||||
Rule Port 1947 1966 - Apr Sun>=1 2:00s 1:00 S
|
||||
Rule Port 1947 1965 - Oct Sun>=1 2:00s 0 -
|
||||
Rule Port 1977 only - Mar 27 0:00s 1:00 S
|
||||
Rule Port 1977 only - Sep 25 0:00s 0 -
|
||||
Rule Port 1978 1979 - Apr Sun>=1 0:00s 1:00 S
|
||||
Rule Port 1978 only - Oct 1 0:00s 0 -
|
||||
Rule Port 1979 1982 - Sep lastSun 1:00s 0 -
|
||||
Rule Port 1980 only - Mar lastSun 0:00s 1:00 S
|
||||
Rule Port 1981 1982 - Mar lastSun 1:00s 1:00 S
|
||||
Rule Port 1983 only - Mar lastSun 2:00s 1:00 S
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# Decreto-Lei 47233 of 1966-10-01 considered that the "duality" in time was
|
||||
# "the cause of serious disturbances" and noted that "the countries with which
|
||||
# we have the most frequent contacts...have already adopted" a solution
|
||||
# coinciding with the extant "summer time". It established that the former
|
||||
# "summer time" would apply year-round on the mainland and adjacent islands
|
||||
# with immediate effect, as the fall back would have otherwise occurred later
|
||||
# that evening.
|
||||
# https://dre.pt/dr/detalhe/decreto-lei/47233-1966-293729
|
||||
# Model this by changing zones without changing clocks at the
|
||||
# previously-appointed fall back time.
|
||||
#
|
||||
# Decreto-Lei 309/76 of 1976-04-27 acknowledged that those international
|
||||
# contacts had returned to adopting seasonal times, and considered that the
|
||||
# year-round advancement "entails considerable sacrifices for the vast majority
|
||||
# of the working population during the winter months", including morning
|
||||
# visibility concerns for schoolchildren. It specified, beginning 1976-09-26
|
||||
# 01:00, an annual return to UT+00 on the mainland from 00:00 UT on Sep lastSun
|
||||
# to 00:00 UT on Mar lastSun (unless the latter date fell on Easter, in which
|
||||
# case it was to be brought forward to the preceding Sunday). It also assigned
|
||||
# the Permanent Time Commission to study and propose revisions for the Azores
|
||||
# and Madeira, neither of which resumed DST until 1982 (as described further
|
||||
# below).
|
||||
# https://dre.pt/dr/detalhe/decreto-lei/309-1976-502063
|
||||
Rule Port 1976 only - Sep lastSun 1:00 0 -
|
||||
Rule Port 1977 only - Mar lastSun 0:00s 1:00 S
|
||||
Rule Port 1977 only - Sep lastSun 0:00s 0 -
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# Beginning in 1978, rather than triggering the Easter rule of the 1976 decree
|
||||
# (Easter fell on 1978-03-26), Article 5 was used instead, which allowed DST
|
||||
# dates to be changed by order of the Minister of Education and Scientific
|
||||
# Research, upon consultation with the Permanent Time Commission, "whenever
|
||||
# considered convenient." As such, a series of one-off ordinances were
|
||||
# promulgated for the mainland in 1978 through 1980, after which the 1976
|
||||
# decree naturally came back into force from 1981.
|
||||
Rule Port 1978 1980 - Apr Sun>=1 1:00s 1:00 S
|
||||
Rule Port 1978 only - Oct 1 1:00s 0 -
|
||||
Rule Port 1979 1980 - Sep lastSun 1:00s 0 -
|
||||
Rule Port 1981 1986 - Mar lastSun 0:00s 1:00 S
|
||||
Rule Port 1981 1985 - Sep lastSun 0:00s 0 -
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# Decreto-Lei 44-B/86 of 1986-03-07 switched mainland Portugal's transition
|
||||
# times from 0:00s to 1:00u to harmonize with the EEC from 1986-03-30.
|
||||
# https://dre.pt/dr/detalhe/decreto-lei/44-b-1986-628280
|
||||
# (Transitions of 1:00s as previously reported and used by the W-Eur rules,
|
||||
# though equivalent, appear to have been fiction here.) Madeira continued to
|
||||
# use 0:00s for spring 1986 before joining with the mainland using 1:00u in the
|
||||
# fall; meanwhile, in the Azores the two were equivalent, so the law specifying
|
||||
# 0:00s wasn't touched until 1992. (See below for more on the islands.)
|
||||
#
|
||||
# From Rui Pedro Salgueiro (1992-11-12):
|
||||
# Portugal has recently (September, 27) changed timezone
|
||||
# (from WET to MET or CET) to harmonize with EEC.
|
||||
#
|
||||
# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
|
||||
# that Portugal is reverting to 0:00 by not moving its clocks this spring.
|
||||
# The new Prime Minister was fed up with getting up in the dark in the winter.
|
||||
#
|
||||
# From Paul Eggert (1996-11-12):
|
||||
# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
|
||||
# at 02:00u, not 01:00u. Assume that these are typos.
|
||||
#
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
#STDOFF -0:36:44.68
|
||||
Zone Europe/Lisbon -0:36:45 - LMT 1884
|
||||
-0:36:45 - LMT 1912 Jan 1 0:00u # Lisbon MT
|
||||
0:00 Port WE%sT 1966 Apr 3 2:00
|
||||
0:00 Port WE%sT 1966 Oct 2 2:00s
|
||||
1:00 - CET 1976 Sep 26 1:00
|
||||
0:00 Port WE%sT 1983 Sep 25 1:00s
|
||||
0:00 W-Eur WE%sT 1992 Sep 27 1:00s
|
||||
0:00 Port WE%sT 1986
|
||||
0:00 EU WE%sT 1992 Sep 27 1:00u
|
||||
1:00 EU CE%sT 1996 Mar 31 1:00u
|
||||
0:00 EU WE%sT
|
||||
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# For the Azores and Madeira, legislation was followed from the laws currently
|
||||
# in force as listed at:
|
||||
# https://oal.ul.pt/hora-legal/legislacao/
|
||||
# working backward through references of revocation and abrogation to
|
||||
# Decreto-Lei 47233 of 1966-10-01, the last time DST was abolished across the
|
||||
# mainland and its adjacent islands. Because of that reference, it is
|
||||
# therefore assumed that DST rules in the islands prior to 1966 were like that
|
||||
# of the mainland, though most legislation of the time didn't explicitly
|
||||
# specify DST practices for the islands.
|
||||
Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada
|
||||
-1:54:32 - HMT 1912 Jan 1 2:00u # Horta MT
|
||||
# Vanguard section, for zic and other parsers that support %z.
|
||||
# -2:00 Port %z 1966 Apr 3 2:00
|
||||
# -1:00 Port %z 1983 Sep 25 1:00s
|
||||
# -1:00 W-Eur %z 1992 Sep 27 1:00s
|
||||
-2:00 Port %z 1966 Oct 2 2:00s
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# While Decreto-Lei 309/76 of 1976-04-27 reintroduced DST on the mainland by
|
||||
# falling back on 1976-09-26, it assigned the Permanent Time Commission to
|
||||
# study and propose revisions for the Azores and Madeira. Decreto Regional
|
||||
# 9/77/A of 1977-05-17 affirmed that "the legal time remained unchanged in the
|
||||
# Azores" at UT-1, and would remain there year-round.
|
||||
# https://dre.pt/dr/detalhe/decreto-regional/9-1977-252066
|
||||
#
|
||||
# Decreto Regional 2/82/A, published 1982-03-02, adopted DST in the same
|
||||
# fashion as the mainland used at the time.
|
||||
# https://dre.pt/dr/detalhe/decreto-regional/2-1982-599965
|
||||
# Though transitions in the Azores officially remained at 0:00s through 1992,
|
||||
# this was equivalent to the EU-style 1:00u adopted by the mainland in 1986, so
|
||||
# model it as such.
|
||||
-1:00 - %z 1982 Mar 28 0:00s
|
||||
-1:00 Port %z 1986
|
||||
# Rearguard section, for parsers lacking %z; see ziguard.awk.
|
||||
-2:00 Port -02/-01 1942 Apr 25 22:00s
|
||||
-2:00 Port +00 1942 Aug 15 22:00s
|
||||
-2:00 Port -02/-01 1943 Apr 17 22:00s
|
||||
-2:00 Port +00 1943 Aug 28 22:00s
|
||||
-2:00 Port -02/-01 1944 Apr 22 22:00s
|
||||
-2:00 Port +00 1944 Aug 26 22:00s
|
||||
-2:00 Port -02/-01 1945 Apr 21 22:00s
|
||||
-2:00 Port +00 1945 Aug 25 22:00s
|
||||
-2:00 Port -02/-01 1966 Apr 3 2:00
|
||||
-1:00 Port -01/+00 1983 Sep 25 1:00s
|
||||
-1:00 W-Eur -01/+00 1992 Sep 27 1:00s
|
||||
# -2:00 Port -02/-01 1942 Apr 25 22:00s
|
||||
# -2:00 Port +00 1942 Aug 15 22:00s
|
||||
# -2:00 Port -02/-01 1943 Apr 17 22:00s
|
||||
# -2:00 Port +00 1943 Aug 28 22:00s
|
||||
# -2:00 Port -02/-01 1944 Apr 22 22:00s
|
||||
# -2:00 Port +00 1944 Aug 26 22:00s
|
||||
# -2:00 Port -02/-01 1945 Apr 21 22:00s
|
||||
# -2:00 Port +00 1945 Aug 25 22:00s
|
||||
# -2:00 Port -02/-01 1966 Oct 2 2:00s
|
||||
# -1:00 - -01 1982 Mar 28 0:00s
|
||||
# -1:00 Port -01/+00 1986
|
||||
# End of rearguard section.
|
||||
0:00 EU WE%sT 1993 Mar 28 1:00u
|
||||
-1:00 EU -01/+00
|
||||
#
|
||||
# From Paul Eggert (1996-11-12):
|
||||
# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
|
||||
# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
|
||||
#
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# After mainland Portugal had shifted forward an hour from 1992-09-27, Decreto
|
||||
# Legislativo Regional 29/92/A of 1992-12-23 sought to "reduce the time
|
||||
# difference" by shifting the Azores forward as well from 1992-12-27. Just six
|
||||
# months later, this was revoked by Decreto Legislativo Regional 9/93/A, citing
|
||||
# "major changes in work habits and way of life." Though the revocation didn't
|
||||
# give a transition time, it was signed Wednesday 1993-06-16; assume it took
|
||||
# effect later that evening, and that an EU-style spring forward (to +01) was
|
||||
# still observed in the interim on 1993-03-28.
|
||||
# https://dre.pt/dr/detalhe/decreto-legislativo-regional/29-1992-621553
|
||||
# https://dre.pt/dr/detalhe/decreto-legislativo-regional/9-1993-389633
|
||||
-1:00 EU %z 1992 Dec 27 1:00s
|
||||
0:00 EU WE%sT 1993 Jun 17 1:00u
|
||||
-1:00 EU %z
|
||||
|
||||
Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal
|
||||
-1:07:36 - FMT 1912 Jan 1 1:00u # Funchal MT
|
||||
# Vanguard section, for zic and other parsers that support %z.
|
||||
# -1:00 Port %z 1966 Apr 3 2:00
|
||||
-1:00 Port %z 1966 Oct 2 2:00s
|
||||
# Rearguard section, for parsers lacking %z; see ziguard.awk.
|
||||
-1:00 Port -01/+00 1942 Apr 25 22:00s
|
||||
-1:00 Port +01 1942 Aug 15 22:00s
|
||||
-1:00 Port -01/+00 1943 Apr 17 22:00s
|
||||
-1:00 Port +01 1943 Aug 28 22:00s
|
||||
-1:00 Port -01/+00 1944 Apr 22 22:00s
|
||||
-1:00 Port +01 1944 Aug 26 22:00s
|
||||
-1:00 Port -01/+00 1945 Apr 21 22:00s
|
||||
-1:00 Port +01 1945 Aug 25 22:00s
|
||||
-1:00 Port -01/+00 1966 Apr 3 2:00
|
||||
# -1:00 Port -01/+00 1942 Apr 25 22:00s
|
||||
# -1:00 Port +01 1942 Aug 15 22:00s
|
||||
# -1:00 Port -01/+00 1943 Apr 17 22:00s
|
||||
# -1:00 Port +01 1943 Aug 28 22:00s
|
||||
# -1:00 Port -01/+00 1944 Apr 22 22:00s
|
||||
# -1:00 Port +01 1944 Aug 26 22:00s
|
||||
# -1:00 Port -01/+00 1945 Apr 21 22:00s
|
||||
# -1:00 Port +01 1945 Aug 25 22:00s
|
||||
# -1:00 Port -01/+00 1966 Oct 2 2:00s
|
||||
# End of rearguard section.
|
||||
0:00 Port WE%sT 1983 Sep 25 1:00s
|
||||
#
|
||||
# From Tim Parenti (2024-07-01):
|
||||
# Decreto Regional 5/82/M, published 1982-04-03, established DST transitions at
|
||||
# 0:00u, which for Madeira is equivalent to the mainland's rules (0:00s) at the
|
||||
# time. It came into effect the day following its publication, Sunday
|
||||
# 1982-04-04, thus resuming Madeira's DST practice about a week later than the
|
||||
# mainland and the Azores.
|
||||
# https://dre.pt/dr/detalhe/decreto-regional/5-1982-608273
|
||||
#
|
||||
# Decreto Legislativo Regional 18/86/M, published 1986-10-01, adopted EU-style
|
||||
# rules (1:00u) and entered into immediate force after being signed on
|
||||
# 1986-07-31.
|
||||
# https://dre.pt/dr/detalhe/decreto-legislativo-regional/18-1986-221705
|
||||
0:00 - WET 1982 Apr 4
|
||||
0:00 Port WE%sT 1986 Jul 31
|
||||
0:00 EU WE%sT
|
||||
|
||||
# Romania
|
||||
@ -2433,7 +2619,7 @@ Zone Europe/Kaliningrad 1:22:00 - LMT 1893 Apr
|
||||
2:00 Poland EE%sT 1946 Apr 7
|
||||
3:00 Russia MSK/MSD 1989 Mar 26 2:00s
|
||||
2:00 Russia EE%sT 2011 Mar 27 2:00s
|
||||
3:00 - +03 2014 Oct 26 2:00s
|
||||
3:00 - %z 2014 Oct 26 2:00s
|
||||
2:00 - EET
|
||||
|
||||
|
||||
@ -2683,14 +2869,14 @@ Zone Europe/Simferopol 2:16:24 - LMT 1880
|
||||
# http://publication.pravo.gov.ru/Document/View/0001201602150056
|
||||
|
||||
Zone Europe/Astrakhan 3:12:12 - LMT 1924 May
|
||||
3:00 - +03 1930 Jun 21
|
||||
4:00 Russia +04/+05 1989 Mar 26 2:00s
|
||||
3:00 Russia +03/+04 1991 Mar 31 2:00s
|
||||
4:00 - +04 1992 Mar 29 2:00s
|
||||
3:00 Russia +03/+04 2011 Mar 27 2:00s
|
||||
4:00 - +04 2014 Oct 26 2:00s
|
||||
3:00 - +03 2016 Mar 27 2:00s
|
||||
4:00 - +04
|
||||
3:00 - %z 1930 Jun 21
|
||||
4:00 Russia %z 1989 Mar 26 2:00s
|
||||
3:00 Russia %z 1991 Mar 31 2:00s
|
||||
4:00 - %z 1992 Mar 29 2:00s
|
||||
3:00 Russia %z 2011 Mar 27 2:00s
|
||||
4:00 - %z 2014 Oct 26 2:00s
|
||||
3:00 - %z 2016 Mar 27 2:00s
|
||||
4:00 - %z
|
||||
|
||||
# From Paul Eggert (2016-11-11):
|
||||
# Europe/Volgograd covers:
|
||||
@ -2720,15 +2906,15 @@ Zone Europe/Astrakhan 3:12:12 - LMT 1924 May
|
||||
# http://publication.pravo.gov.ru/Document/View/0001202012220002
|
||||
|
||||
Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
|
||||
3:00 - +03 1930 Jun 21
|
||||
4:00 - +04 1961 Nov 11
|
||||
4:00 Russia +04/+05 1988 Mar 27 2:00s
|
||||
3:00 - %z 1930 Jun 21
|
||||
4:00 - %z 1961 Nov 11
|
||||
4:00 Russia %z 1988 Mar 27 2:00s
|
||||
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
|
||||
4:00 - +04 1992 Mar 29 2:00s
|
||||
4:00 - %z 1992 Mar 29 2:00s
|
||||
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
|
||||
4:00 - MSK 2014 Oct 26 2:00s
|
||||
3:00 - MSK 2018 Oct 28 2:00s
|
||||
4:00 - +04 2020 Dec 27 2:00s
|
||||
4:00 - %z 2020 Dec 27 2:00s
|
||||
3:00 - MSK
|
||||
|
||||
# From Paul Eggert (2016-11-11):
|
||||
@ -2743,14 +2929,14 @@ Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
|
||||
# http://publication.pravo.gov.ru/Document/View/0001201611220031
|
||||
|
||||
Zone Europe/Saratov 3:04:18 - LMT 1919 Jul 1 0:00u
|
||||
3:00 - +03 1930 Jun 21
|
||||
4:00 Russia +04/+05 1988 Mar 27 2:00s
|
||||
3:00 Russia +03/+04 1991 Mar 31 2:00s
|
||||
4:00 - +04 1992 Mar 29 2:00s
|
||||
3:00 Russia +03/+04 2011 Mar 27 2:00s
|
||||
4:00 - +04 2014 Oct 26 2:00s
|
||||
3:00 - +03 2016 Dec 4 2:00s
|
||||
4:00 - +04
|
||||
3:00 - %z 1930 Jun 21
|
||||
4:00 Russia %z 1988 Mar 27 2:00s
|
||||
3:00 Russia %z 1991 Mar 31 2:00s
|
||||
4:00 - %z 1992 Mar 29 2:00s
|
||||
3:00 Russia %z 2011 Mar 27 2:00s
|
||||
4:00 - %z 2014 Oct 26 2:00s
|
||||
3:00 - %z 2016 Dec 4 2:00s
|
||||
4:00 - %z
|
||||
|
||||
# From Paul Eggert (2016-03-18):
|
||||
# Europe/Kirov covers:
|
||||
@ -2758,10 +2944,10 @@ Zone Europe/Saratov 3:04:18 - LMT 1919 Jul 1 0:00u
|
||||
# The 1989 transition is from USSR act No. 227 (1989-03-14).
|
||||
#
|
||||
Zone Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0:00u
|
||||
3:00 - +03 1930 Jun 21
|
||||
4:00 Russia +04/+05 1989 Mar 26 2:00s
|
||||
3:00 - %z 1930 Jun 21
|
||||
4:00 Russia %z 1989 Mar 26 2:00s
|
||||
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
|
||||
4:00 - +04 1992 Mar 29 2:00s
|
||||
4:00 - %z 1992 Mar 29 2:00s
|
||||
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
|
||||
4:00 - MSK 2014 Oct 26 2:00s
|
||||
3:00 - MSK
|
||||
@ -2776,15 +2962,15 @@ Zone Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0:00u
|
||||
# The 1989 transition is from USSR act No. 227 (1989-03-14).
|
||||
|
||||
Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 0:00u
|
||||
3:00 - +03 1930 Jun 21
|
||||
4:00 - +04 1935 Jan 27
|
||||
4:00 Russia +04/+05 1989 Mar 26 2:00s
|
||||
3:00 Russia +03/+04 1991 Mar 31 2:00s
|
||||
2:00 Russia +02/+03 1991 Sep 29 2:00s
|
||||
3:00 - +03 1991 Oct 20 3:00
|
||||
4:00 Russia +04/+05 2010 Mar 28 2:00s
|
||||
3:00 Russia +03/+04 2011 Mar 27 2:00s
|
||||
4:00 - +04
|
||||
3:00 - %z 1930 Jun 21
|
||||
4:00 - %z 1935 Jan 27
|
||||
4:00 Russia %z 1989 Mar 26 2:00s
|
||||
3:00 Russia %z 1991 Mar 31 2:00s
|
||||
2:00 Russia %z 1991 Sep 29 2:00s
|
||||
3:00 - %z 1991 Oct 20 3:00
|
||||
4:00 Russia %z 2010 Mar 28 2:00s
|
||||
3:00 Russia %z 2011 Mar 27 2:00s
|
||||
4:00 - %z
|
||||
|
||||
# From Paul Eggert (2016-03-18):
|
||||
# Europe/Ulyanovsk covers:
|
||||
@ -2800,14 +2986,14 @@ Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 0:00u
|
||||
# http://publication.pravo.gov.ru/Document/View/0001201603090051
|
||||
|
||||
Zone Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0:00u
|
||||
3:00 - +03 1930 Jun 21
|
||||
4:00 Russia +04/+05 1989 Mar 26 2:00s
|
||||
3:00 Russia +03/+04 1991 Mar 31 2:00s
|
||||
2:00 Russia +02/+03 1992 Jan 19 2:00s
|
||||
3:00 Russia +03/+04 2011 Mar 27 2:00s
|
||||
4:00 - +04 2014 Oct 26 2:00s
|
||||
3:00 - +03 2016 Mar 27 2:00s
|
||||
4:00 - +04
|
||||
3:00 - %z 1930 Jun 21
|
||||
4:00 Russia %z 1989 Mar 26 2:00s
|
||||
3:00 Russia %z 1991 Mar 31 2:00s
|
||||
2:00 Russia %z 1992 Jan 19 2:00s
|
||||
3:00 Russia %z 2011 Mar 27 2:00s
|
||||
4:00 - %z 2014 Oct 26 2:00s
|
||||
3:00 - %z 2016 Mar 27 2:00s
|
||||
4:00 - %z
|
||||
|
||||
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
|
||||
# Asia/Yekaterinburg covers...
|
||||
@ -2832,12 +3018,12 @@ Zone Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0:00u
|
||||
#STDOFF 4:02:32.9
|
||||
Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3
|
||||
3:45:05 - PMT 1919 Jul 15 4:00
|
||||
4:00 - +04 1930 Jun 21
|
||||
5:00 Russia +05/+06 1991 Mar 31 2:00s
|
||||
4:00 Russia +04/+05 1992 Jan 19 2:00s
|
||||
5:00 Russia +05/+06 2011 Mar 27 2:00s
|
||||
6:00 - +06 2014 Oct 26 2:00s
|
||||
5:00 - +05
|
||||
4:00 - %z 1930 Jun 21
|
||||
5:00 Russia %z 1991 Mar 31 2:00s
|
||||
4:00 Russia %z 1992 Jan 19 2:00s
|
||||
5:00 Russia %z 2011 Mar 27 2:00s
|
||||
6:00 - %z 2014 Oct 26 2:00s
|
||||
5:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
|
||||
@ -2847,12 +3033,12 @@ Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3
|
||||
# Byalokoz 1919 says Omsk was 4:53:30.
|
||||
|
||||
Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14
|
||||
5:00 - +05 1930 Jun 21
|
||||
6:00 Russia +06/+07 1991 Mar 31 2:00s
|
||||
5:00 Russia +05/+06 1992 Jan 19 2:00s
|
||||
6:00 Russia +06/+07 2011 Mar 27 2:00s
|
||||
7:00 - +07 2014 Oct 26 2:00s
|
||||
6:00 - +06
|
||||
5:00 - %z 1930 Jun 21
|
||||
6:00 Russia %z 1991 Mar 31 2:00s
|
||||
5:00 Russia %z 1992 Jan 19 2:00s
|
||||
6:00 Russia %z 2011 Mar 27 2:00s
|
||||
7:00 - %z 2014 Oct 26 2:00s
|
||||
6:00 - %z
|
||||
|
||||
# From Paul Eggert (2016-02-22):
|
||||
# Asia/Barnaul covers:
|
||||
@ -2885,14 +3071,14 @@ Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14
|
||||
# http://publication.pravo.gov.ru/Document/View/0001201603090038
|
||||
|
||||
Zone Asia/Barnaul 5:35:00 - LMT 1919 Dec 10
|
||||
6:00 - +06 1930 Jun 21
|
||||
7:00 Russia +07/+08 1991 Mar 31 2:00s
|
||||
6:00 Russia +06/+07 1992 Jan 19 2:00s
|
||||
7:00 Russia +07/+08 1995 May 28
|
||||
6:00 Russia +06/+07 2011 Mar 27 2:00s
|
||||
7:00 - +07 2014 Oct 26 2:00s
|
||||
6:00 - +06 2016 Mar 27 2:00s
|
||||
7:00 - +07
|
||||
6:00 - %z 1930 Jun 21
|
||||
7:00 Russia %z 1991 Mar 31 2:00s
|
||||
6:00 Russia %z 1992 Jan 19 2:00s
|
||||
7:00 Russia %z 1995 May 28
|
||||
6:00 Russia %z 2011 Mar 27 2:00s
|
||||
7:00 - %z 2014 Oct 26 2:00s
|
||||
6:00 - %z 2016 Mar 27 2:00s
|
||||
7:00 - %z
|
||||
|
||||
# From Paul Eggert (2016-03-18):
|
||||
# Asia/Novosibirsk covers:
|
||||
@ -2906,14 +3092,14 @@ Zone Asia/Barnaul 5:35:00 - LMT 1919 Dec 10
|
||||
# http://publication.pravo.gov.ru/Document/View/0001201607040064
|
||||
|
||||
Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
|
||||
6:00 - +06 1930 Jun 21
|
||||
7:00 Russia +07/+08 1991 Mar 31 2:00s
|
||||
6:00 Russia +06/+07 1992 Jan 19 2:00s
|
||||
7:00 Russia +07/+08 1993 May 23 # say Shanks & P.
|
||||
6:00 Russia +06/+07 2011 Mar 27 2:00s
|
||||
7:00 - +07 2014 Oct 26 2:00s
|
||||
6:00 - +06 2016 Jul 24 2:00s
|
||||
7:00 - +07
|
||||
6:00 - %z 1930 Jun 21
|
||||
7:00 Russia %z 1991 Mar 31 2:00s
|
||||
6:00 Russia %z 1992 Jan 19 2:00s
|
||||
7:00 Russia %z 1993 May 23 # say Shanks & P.
|
||||
6:00 Russia %z 2011 Mar 27 2:00s
|
||||
7:00 - %z 2014 Oct 26 2:00s
|
||||
6:00 - %z 2016 Jul 24 2:00s
|
||||
7:00 - %z
|
||||
|
||||
# From Paul Eggert (2016-03-18):
|
||||
# Asia/Tomsk covers:
|
||||
@ -2958,14 +3144,14 @@ Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
|
||||
# http://publication.pravo.gov.ru/Document/View/0001201604260048
|
||||
|
||||
Zone Asia/Tomsk 5:39:51 - LMT 1919 Dec 22
|
||||
6:00 - +06 1930 Jun 21
|
||||
7:00 Russia +07/+08 1991 Mar 31 2:00s
|
||||
6:00 Russia +06/+07 1992 Jan 19 2:00s
|
||||
7:00 Russia +07/+08 2002 May 1 3:00
|
||||
6:00 Russia +06/+07 2011 Mar 27 2:00s
|
||||
7:00 - +07 2014 Oct 26 2:00s
|
||||
6:00 - +06 2016 May 29 2:00s
|
||||
7:00 - +07
|
||||
6:00 - %z 1930 Jun 21
|
||||
7:00 Russia %z 1991 Mar 31 2:00s
|
||||
6:00 Russia %z 1992 Jan 19 2:00s
|
||||
7:00 Russia %z 2002 May 1 3:00
|
||||
6:00 Russia %z 2011 Mar 27 2:00s
|
||||
7:00 - %z 2014 Oct 26 2:00s
|
||||
6:00 - %z 2016 May 29 2:00s
|
||||
7:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03):
|
||||
@ -2996,12 +3182,12 @@ Zone Asia/Tomsk 5:39:51 - LMT 1919 Dec 22
|
||||
# realigning itself with KRAT.
|
||||
|
||||
Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1
|
||||
6:00 - +06 1930 Jun 21
|
||||
7:00 Russia +07/+08 1991 Mar 31 2:00s
|
||||
6:00 Russia +06/+07 1992 Jan 19 2:00s
|
||||
7:00 Russia +07/+08 2010 Mar 28 2:00s
|
||||
6:00 Russia +06/+07 2011 Mar 27 2:00s
|
||||
7:00 - +07
|
||||
6:00 - %z 1930 Jun 21
|
||||
7:00 Russia %z 1991 Mar 31 2:00s
|
||||
6:00 Russia %z 1992 Jan 19 2:00s
|
||||
7:00 Russia %z 2010 Mar 28 2:00s
|
||||
6:00 Russia %z 2011 Mar 27 2:00s
|
||||
7:00 - %z
|
||||
|
||||
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
|
||||
# Asia/Krasnoyarsk covers...
|
||||
@ -3015,12 +3201,12 @@ Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1
|
||||
# Byalokoz 1919 says Krasnoyarsk was 6:11:26.
|
||||
|
||||
Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6
|
||||
6:00 - +06 1930 Jun 21
|
||||
7:00 Russia +07/+08 1991 Mar 31 2:00s
|
||||
6:00 Russia +06/+07 1992 Jan 19 2:00s
|
||||
7:00 Russia +07/+08 2011 Mar 27 2:00s
|
||||
8:00 - +08 2014 Oct 26 2:00s
|
||||
7:00 - +07
|
||||
6:00 - %z 1930 Jun 21
|
||||
7:00 Russia %z 1991 Mar 31 2:00s
|
||||
6:00 Russia %z 1992 Jan 19 2:00s
|
||||
7:00 Russia %z 2011 Mar 27 2:00s
|
||||
8:00 - %z 2014 Oct 26 2:00s
|
||||
7:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
|
||||
@ -3037,12 +3223,12 @@ Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6
|
||||
|
||||
Zone Asia/Irkutsk 6:57:05 - LMT 1880
|
||||
6:57:05 - IMT 1920 Jan 25 # Irkutsk Mean Time
|
||||
7:00 - +07 1930 Jun 21
|
||||
8:00 Russia +08/+09 1991 Mar 31 2:00s
|
||||
7:00 Russia +07/+08 1992 Jan 19 2:00s
|
||||
8:00 Russia +08/+09 2011 Mar 27 2:00s
|
||||
9:00 - +09 2014 Oct 26 2:00s
|
||||
8:00 - +08
|
||||
7:00 - %z 1930 Jun 21
|
||||
8:00 Russia %z 1991 Mar 31 2:00s
|
||||
7:00 Russia %z 1992 Jan 19 2:00s
|
||||
8:00 Russia %z 2011 Mar 27 2:00s
|
||||
9:00 - %z 2014 Oct 26 2:00s
|
||||
8:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-06):
|
||||
@ -3059,13 +3245,13 @@ Zone Asia/Irkutsk 6:57:05 - LMT 1880
|
||||
# http://publication.pravo.gov.ru/Document/View/0001201512300107
|
||||
|
||||
Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15
|
||||
8:00 - +08 1930 Jun 21
|
||||
9:00 Russia +09/+10 1991 Mar 31 2:00s
|
||||
8:00 Russia +08/+09 1992 Jan 19 2:00s
|
||||
9:00 Russia +09/+10 2011 Mar 27 2:00s
|
||||
10:00 - +10 2014 Oct 26 2:00s
|
||||
8:00 - +08 2016 Mar 27 2:00
|
||||
9:00 - +09
|
||||
8:00 - %z 1930 Jun 21
|
||||
9:00 Russia %z 1991 Mar 31 2:00s
|
||||
8:00 Russia %z 1992 Jan 19 2:00s
|
||||
9:00 Russia %z 2011 Mar 27 2:00s
|
||||
10:00 - %z 2014 Oct 26 2:00s
|
||||
8:00 - %z 2016 Mar 27 2:00
|
||||
9:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
|
||||
@ -3105,12 +3291,12 @@ Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15
|
||||
# Byalokoz 1919 says Yakutsk was 8:38:58.
|
||||
|
||||
Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15
|
||||
8:00 - +08 1930 Jun 21
|
||||
9:00 Russia +09/+10 1991 Mar 31 2:00s
|
||||
8:00 Russia +08/+09 1992 Jan 19 2:00s
|
||||
9:00 Russia +09/+10 2011 Mar 27 2:00s
|
||||
10:00 - +10 2014 Oct 26 2:00s
|
||||
9:00 - +09
|
||||
8:00 - %z 1930 Jun 21
|
||||
9:00 Russia %z 1991 Mar 31 2:00s
|
||||
8:00 Russia %z 1992 Jan 19 2:00s
|
||||
9:00 Russia %z 2011 Mar 27 2:00s
|
||||
10:00 - %z 2014 Oct 26 2:00s
|
||||
9:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
|
||||
@ -3128,12 +3314,12 @@ Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15
|
||||
# Go with Byalokoz.
|
||||
|
||||
Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15
|
||||
9:00 - +09 1930 Jun 21
|
||||
10:00 Russia +10/+11 1991 Mar 31 2:00s
|
||||
9:00 Russia +09/+10 1992 Jan 19 2:00s
|
||||
10:00 Russia +10/+11 2011 Mar 27 2:00s
|
||||
11:00 - +11 2014 Oct 26 2:00s
|
||||
10:00 - +10
|
||||
9:00 - %z 1930 Jun 21
|
||||
10:00 Russia %z 1991 Mar 31 2:00s
|
||||
9:00 Russia %z 1992 Jan 19 2:00s
|
||||
10:00 Russia %z 2011 Mar 27 2:00s
|
||||
11:00 - %z 2014 Oct 26 2:00s
|
||||
10:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03):
|
||||
@ -3151,14 +3337,14 @@ Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15
|
||||
# This transition is no doubt wrong, but we have no better info.
|
||||
|
||||
Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15
|
||||
8:00 - +08 1930 Jun 21
|
||||
9:00 Russia +09/+10 1991 Mar 31 2:00s
|
||||
8:00 Russia +08/+09 1992 Jan 19 2:00s
|
||||
9:00 Russia +09/+10 2004
|
||||
10:00 Russia +10/+11 2011 Mar 27 2:00s
|
||||
11:00 - +11 2011 Sep 13 0:00s # Decree 725?
|
||||
10:00 - +10 2014 Oct 26 2:00s
|
||||
9:00 - +09
|
||||
8:00 - %z 1930 Jun 21
|
||||
9:00 Russia %z 1991 Mar 31 2:00s
|
||||
8:00 Russia %z 1992 Jan 19 2:00s
|
||||
9:00 Russia %z 2004
|
||||
10:00 Russia %z 2011 Mar 27 2:00s
|
||||
11:00 - %z 2011 Sep 13 0:00s # Decree 725?
|
||||
10:00 - %z 2014 Oct 26 2:00s
|
||||
9:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03):
|
||||
@ -3174,14 +3360,14 @@ Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15
|
||||
|
||||
# The Zone name should be Asia/Yuzhno-Sakhalinsk, but that's too long.
|
||||
Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
|
||||
9:00 - +09 1945 Aug 25
|
||||
11:00 Russia +11/+12 1991 Mar 31 2:00s # Sakhalin T
|
||||
10:00 Russia +10/+11 1992 Jan 19 2:00s
|
||||
11:00 Russia +11/+12 1997 Mar lastSun 2:00s
|
||||
10:00 Russia +10/+11 2011 Mar 27 2:00s
|
||||
11:00 - +11 2014 Oct 26 2:00s
|
||||
10:00 - +10 2016 Mar 27 2:00s
|
||||
11:00 - +11
|
||||
9:00 - %z 1945 Aug 25
|
||||
11:00 Russia %z 1991 Mar 31 2:00s # Sakhalin T
|
||||
10:00 Russia %z 1992 Jan 19 2:00s
|
||||
11:00 Russia %z 1997 Mar lastSun 2:00s
|
||||
10:00 Russia %z 2011 Mar 27 2:00s
|
||||
11:00 - %z 2014 Oct 26 2:00s
|
||||
10:00 - %z 2016 Mar 27 2:00s
|
||||
11:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
|
||||
@ -3204,13 +3390,13 @@ Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
|
||||
# http://publication.pravo.gov.ru/Document/View/0001201604050038
|
||||
|
||||
Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
|
||||
10:00 - +10 1930 Jun 21 # Magadan Time
|
||||
11:00 Russia +11/+12 1991 Mar 31 2:00s
|
||||
10:00 Russia +10/+11 1992 Jan 19 2:00s
|
||||
11:00 Russia +11/+12 2011 Mar 27 2:00s
|
||||
12:00 - +12 2014 Oct 26 2:00s
|
||||
10:00 - +10 2016 Apr 24 2:00s
|
||||
11:00 - +11
|
||||
10:00 - %z 1930 Jun 21 # Magadan Time
|
||||
11:00 Russia %z 1991 Mar 31 2:00s
|
||||
10:00 Russia %z 1992 Jan 19 2:00s
|
||||
11:00 Russia %z 2011 Mar 27 2:00s
|
||||
12:00 - %z 2014 Oct 26 2:00s
|
||||
10:00 - %z 2016 Apr 24 2:00s
|
||||
11:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-06):
|
||||
@ -3255,12 +3441,12 @@ Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
|
||||
# Go with Srednekolymsk.
|
||||
|
||||
Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2
|
||||
10:00 - +10 1930 Jun 21
|
||||
11:00 Russia +11/+12 1991 Mar 31 2:00s
|
||||
10:00 Russia +10/+11 1992 Jan 19 2:00s
|
||||
11:00 Russia +11/+12 2011 Mar 27 2:00s
|
||||
12:00 - +12 2014 Oct 26 2:00s
|
||||
11:00 - +11
|
||||
10:00 - %z 1930 Jun 21
|
||||
11:00 Russia %z 1991 Mar 31 2:00s
|
||||
10:00 Russia %z 1992 Jan 19 2:00s
|
||||
11:00 Russia %z 2011 Mar 27 2:00s
|
||||
12:00 - %z 2014 Oct 26 2:00s
|
||||
11:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03):
|
||||
@ -3278,14 +3464,14 @@ Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2
|
||||
# UTC+12 since at least then, too.
|
||||
|
||||
Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15
|
||||
8:00 - +08 1930 Jun 21
|
||||
9:00 Russia +09/+10 1981 Apr 1
|
||||
11:00 Russia +11/+12 1991 Mar 31 2:00s
|
||||
10:00 Russia +10/+11 1992 Jan 19 2:00s
|
||||
11:00 Russia +11/+12 2011 Mar 27 2:00s
|
||||
12:00 - +12 2011 Sep 13 0:00s # Decree 725?
|
||||
11:00 - +11 2014 Oct 26 2:00s
|
||||
10:00 - +10
|
||||
8:00 - %z 1930 Jun 21
|
||||
9:00 Russia %z 1981 Apr 1
|
||||
11:00 Russia %z 1991 Mar 31 2:00s
|
||||
10:00 Russia %z 1992 Jan 19 2:00s
|
||||
11:00 Russia %z 2011 Mar 27 2:00s
|
||||
12:00 - %z 2011 Sep 13 0:00s # Decree 725?
|
||||
11:00 - %z 2014 Oct 26 2:00s
|
||||
10:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
|
||||
@ -3298,12 +3484,12 @@ Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15
|
||||
# The Zone name should be Asia/Petropavlovsk-Kamchatski or perhaps
|
||||
# Asia/Petropavlovsk-Kamchatsky, but these are too long.
|
||||
Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
|
||||
11:00 - +11 1930 Jun 21
|
||||
12:00 Russia +12/+13 1991 Mar 31 2:00s
|
||||
11:00 Russia +11/+12 1992 Jan 19 2:00s
|
||||
12:00 Russia +12/+13 2010 Mar 28 2:00s
|
||||
11:00 Russia +11/+12 2011 Mar 27 2:00s
|
||||
12:00 - +12
|
||||
11:00 - %z 1930 Jun 21
|
||||
12:00 Russia %z 1991 Mar 31 2:00s
|
||||
11:00 Russia %z 1992 Jan 19 2:00s
|
||||
12:00 Russia %z 2010 Mar 28 2:00s
|
||||
11:00 Russia %z 2011 Mar 27 2:00s
|
||||
12:00 - %z
|
||||
|
||||
|
||||
# From Tim Parenti (2014-07-03):
|
||||
@ -3311,13 +3497,13 @@ Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
|
||||
# 87 RU-CHU Chukotka Autonomous Okrug
|
||||
|
||||
Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2
|
||||
12:00 - +12 1930 Jun 21
|
||||
13:00 Russia +13/+14 1982 Apr 1 0:00s
|
||||
12:00 Russia +12/+13 1991 Mar 31 2:00s
|
||||
11:00 Russia +11/+12 1992 Jan 19 2:00s
|
||||
12:00 Russia +12/+13 2010 Mar 28 2:00s
|
||||
11:00 Russia +11/+12 2011 Mar 27 2:00s
|
||||
12:00 - +12
|
||||
12:00 - %z 1930 Jun 21
|
||||
13:00 Russia %z 1982 Apr 1 0:00s
|
||||
12:00 Russia %z 1991 Mar 31 2:00s
|
||||
11:00 Russia %z 1992 Jan 19 2:00s
|
||||
12:00 Russia %z 2010 Mar 28 2:00s
|
||||
11:00 Russia %z 2011 Mar 27 2:00s
|
||||
12:00 - %z
|
||||
|
||||
# Bosnia & Herzegovina
|
||||
# Croatia
|
||||
@ -3436,7 +3622,7 @@ Zone Africa/Ceuta -0:21:16 - LMT 1901 Jan 1 0:00u
|
||||
1:00 - CET 1986
|
||||
1:00 EU CE%sT
|
||||
Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C.
|
||||
-1:00 - -01 1946 Sep 30 1:00
|
||||
-1:00 - %z 1946 Sep 30 1:00
|
||||
0:00 - WET 1980 Apr 6 0:00s
|
||||
0:00 1:00 WEST 1980 Sep 28 1:00u
|
||||
0:00 EU WE%sT
|
||||
@ -3517,8 +3703,8 @@ Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C.
|
||||
# but if no one is present after 11 at night, could be postponed until one
|
||||
# hour before the beginning of service.
|
||||
|
||||
# From Paul Eggert (2013-09-11):
|
||||
# Round BMT to the nearest even second, 0:29:46.
|
||||
# From Paul Eggert (2024-05-24):
|
||||
# Express BMT as 0:29:45.500, approximately the same precision 7° 26' 22.50".
|
||||
#
|
||||
# We can find no reliable source for Shanks's assertion that all of Switzerland
|
||||
# except Geneva switched to Bern Mean Time at 00:00 on 1848-09-12. This book:
|
||||
@ -3557,6 +3743,7 @@ Rule Swiss 1941 1942 - May Mon>=1 1:00 1:00 S
|
||||
Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Europe/Zurich 0:34:08 - LMT 1853 Jul 16 # See above comment.
|
||||
#STDOFF 0:29:45.500
|
||||
0:29:46 - BMT 1894 Jun # Bern Mean Time
|
||||
1:00 Swiss CE%sT 1981
|
||||
1:00 EU CE%sT
|
||||
@ -3754,7 +3941,7 @@ Rule Turkey 1996 2006 - Oct lastSun 1:00s 0 -
|
||||
Zone Europe/Istanbul 1:55:52 - LMT 1880
|
||||
1:56:56 - IMT 1910 Oct # Istanbul Mean Time?
|
||||
2:00 Turkey EE%sT 1978 Jun 29
|
||||
3:00 Turkey +03/+04 1984 Nov 1 2:00
|
||||
3:00 Turkey %z 1984 Nov 1 2:00
|
||||
2:00 Turkey EE%sT 2007
|
||||
2:00 EU EE%sT 2011 Mar 27 1:00u
|
||||
2:00 - EET 2011 Mar 28 1:00u
|
||||
@ -3763,7 +3950,7 @@ Zone Europe/Istanbul 1:55:52 - LMT 1880
|
||||
2:00 EU EE%sT 2015 Oct 25 1:00u
|
||||
2:00 1:00 EEST 2015 Nov 8 1:00u
|
||||
2:00 EU EE%sT 2016 Sep 7
|
||||
3:00 - +03
|
||||
3:00 - %z
|
||||
|
||||
# Ukraine
|
||||
#
|
||||
|
||||
@ -92,11 +92,11 @@ Leap 2016 Dec 31 23:59:60 + S
|
||||
# Any additional leap seconds will come after this.
|
||||
# This Expires line is commented out for now,
|
||||
# so that pre-2020a zic implementations do not reject this file.
|
||||
#Expires 2024 Dec 28 00:00:00
|
||||
#Expires 2025 Jun 28 00:00:00
|
||||
|
||||
# POSIX timestamps for the data in this file:
|
||||
#updated 1704708379 (2024-01-08 10:06:19 UTC)
|
||||
#expires 1735344000 (2024-12-28 00:00:00 UTC)
|
||||
#updated 1720104763 (2024-07-04 14:52:43 UTC)
|
||||
#expires 1751068800 (2025-06-28 00:00:00 UTC)
|
||||
|
||||
# Updated through IERS Bulletin C (https://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat)
|
||||
# File expires on 28 December 2024
|
||||
# File expires on 28 June 2025
|
||||
|
||||
@ -208,26 +208,6 @@ Rule US 1987 2006 - Apr Sun>=1 2:00 1:00 D
|
||||
Rule US 2007 max - Mar Sun>=8 2:00 1:00 D
|
||||
Rule US 2007 max - Nov Sun>=1 2:00 0 S
|
||||
|
||||
# From Arthur David Olson, 2005-12-19
|
||||
# We generate the files specified below to guard against old files with
|
||||
# obsolete information being left in the time zone binary directory.
|
||||
# We limit the list to names that have appeared in previous versions of
|
||||
# this time zone package.
|
||||
# We do these as separate Zones rather than as Links to avoid problems if
|
||||
# a particular place changes whether it observes DST.
|
||||
# We put these specifications here in the northamerica file both to
|
||||
# increase the chances that they'll actually get compiled and to
|
||||
# avoid the need to duplicate the US rules in another file.
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone EST -5:00 - EST
|
||||
Zone MST -7:00 - MST
|
||||
Zone HST -10:00 - HST
|
||||
Zone EST5EDT -5:00 US E%sT
|
||||
Zone CST6CDT -6:00 US C%sT
|
||||
Zone MST7MDT -7:00 US M%sT
|
||||
Zone PST8PDT -8:00 US P%sT
|
||||
|
||||
# From U. S. Naval Observatory (1989-01-19):
|
||||
# USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON
|
||||
# USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30
|
||||
@ -2396,6 +2376,81 @@ Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
|
||||
# the researchers who prepared the Decrees page failed to find some of
|
||||
# the relevant documents.
|
||||
|
||||
# From Heitor David Pinto (2024-08-04):
|
||||
# In 1931, the decree implementing DST specified that it would take
|
||||
# effect on 30 April....
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=192270&pagina=2&seccion=1
|
||||
#
|
||||
# In 1981, the decree changing Campeche, Yucatán and Quintana Roo to UTC-5
|
||||
# specified that it would enter into force on 26 December 1981 at 2:00....
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4705667&fecha=23/12/1981&cod_diario=202796
|
||||
#
|
||||
# In 1982, the decree returning Campeche and Yucatán to UTC-6 specified that
|
||||
# it would enter into force on 2 November 1982 at 2:00....
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=205689&pagina=3&seccion=0
|
||||
#
|
||||
# Quintana Roo changed to UTC-6 on 4 January 1983 at 0:00, and again
|
||||
# to UTC-5 on 26 October 1997 at 2:00....
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4787355&fecha=28/12/1982&cod_diario=206112
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=209559&pagina=15&seccion=0
|
||||
#
|
||||
# Durango, Coahuila, Nuevo León and Tamaulipas were set to UTC-7 on 1 January
|
||||
# 1922, and changed to UTC-6 on 10 June 1927. Then Durango, Coahuila and
|
||||
# Nuevo León (but not Tamaulipas) returned to UTC-7 on 15 November 1930,
|
||||
# observed DST in 1931, and changed again to UTC-6 on 1 April 1932....
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4441846&fecha=29/12/1921&cod_diario=187468
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4541520&fecha=09/06/1927&cod_diario=193920
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4491963&fecha=15/11/1930&cod_diario=190835
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4418437&fecha=21/01/1932&cod_diario=185588
|
||||
#
|
||||
# ... the ... 10 June 1927 ... decree only said 10 June 1927, without
|
||||
# specifying a time, so I suppose that it should be considered at 0:00.
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4541520&fecha=09/06/1927&cod_diario=193920
|
||||
#
|
||||
# In 1942, the decree changing Baja California, Baja California Sur, Sonora,
|
||||
# Sinaloa and Nayarit to UTC-7 was published on 24 April, but it said that it
|
||||
# would apply from 1 April, so it's unclear when the change actually
|
||||
# occurred. The database currently shows 24 April 1942.
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=192203&pagina=2&seccion=1
|
||||
#
|
||||
# Baja California Sur, Sonora, Sinaloa and Nayarit never used UTC-8. The ...
|
||||
# 14 January 1949 ... change [to UTC-8] only occurred in Baja California.
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4515613&fecha=13/01/1949&cod_diario=192309
|
||||
#
|
||||
# In 1945, the decree changing Baja California to UTC-8 specified that it
|
||||
# would take effect on the third day from its publication.
|
||||
# It was published on 12 November, so it would take effect on 15 November....
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4555049&fecha=12/11/1945&cod_diario=194763
|
||||
#
|
||||
# In 1948, the decree changing Baja California to UTC-7 specified that it
|
||||
# would take effect on "this date". The decree was made on 13 March,
|
||||
# but published on 5 April, so it's unclear when the change actually occurred.
|
||||
# The database currently shows 5 April 1948.
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=188624&pagina=2&seccion=0
|
||||
#
|
||||
# In 1949, the decree changing Baja California to UTC-8 was published on 13
|
||||
# January, but it said that it would apply from 1 January, so it's unclear when
|
||||
# the change actually occurred. The database currently shows 14 January 1949.
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4515613&fecha=13/01/1949&cod_diario=192309
|
||||
#
|
||||
# Baja California also observed UTC-7 from 1 May to 24 September 1950,
|
||||
# from 29 April to 30 September 1951 at 2:00,
|
||||
# and from 27 April to 28 September 1952 at 2:00....
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4600403&fecha=29/04/1950&cod_diario=197505
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4623553&fecha=23/09/1950&cod_diario=198805
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4469444&fecha=27/04/1951&cod_diario=189317
|
||||
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4533868&fecha=10/03/1952&cod_diario=193465
|
||||
#
|
||||
# All changes in Baja California from 1948 to 1952 match those in California,
|
||||
# on the same dates or with a difference of one day.
|
||||
# So it may be easier to implement these changes as DST with rule CA
|
||||
# during this whole period.
|
||||
#
|
||||
# From Paul Eggert (2024-08-18):
|
||||
# For now, maintain the slightly-different history for Baja California,
|
||||
# as we have no information on whether 1948/1952 clocks in Tijuana followed
|
||||
# the decrees or followed San Diego.
|
||||
|
||||
# From Alan Perry (1996-02-15):
|
||||
# A guy from our Mexico subsidiary finally found the Presidential Decree
|
||||
# outlining the timezone changes in Mexico.
|
||||
@ -2599,7 +2654,7 @@ Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
|
||||
# http://puentelibre.mx/noticia/ciudad_juarez_cambio_horario_noviembre_2022/
|
||||
|
||||
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
|
||||
Rule Mexico 1931 only - May 1 23:00 1:00 D
|
||||
Rule Mexico 1931 only - April 30 0:00 1:00 D
|
||||
Rule Mexico 1931 only - Oct 1 0:00 0 S
|
||||
Rule Mexico 1939 only - Feb 5 0:00 1:00 D
|
||||
Rule Mexico 1939 only - Jun 25 0:00 0 S
|
||||
@ -2618,14 +2673,16 @@ Rule Mexico 2002 2022 - Oct lastSun 2:00 0 S
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
# Quintana Roo; represented by Cancún
|
||||
Zone America/Cancun -5:47:04 - LMT 1922 Jan 1 6:00u
|
||||
-6:00 - CST 1981 Dec 23
|
||||
-6:00 - CST 1981 Dec 26 2:00
|
||||
-5:00 - EST 1983 Jan 4 0:00
|
||||
-6:00 Mexico C%sT 1997 Oct 26 2:00
|
||||
-5:00 Mexico E%sT 1998 Aug 2 2:00
|
||||
-6:00 Mexico C%sT 2015 Feb 1 2:00
|
||||
-5:00 - EST
|
||||
# Campeche, Yucatán; represented by Mérida
|
||||
Zone America/Merida -5:58:28 - LMT 1922 Jan 1 6:00u
|
||||
-6:00 - CST 1981 Dec 23
|
||||
-5:00 - EST 1982 Dec 2
|
||||
-6:00 - CST 1981 Dec 26 2:00
|
||||
-5:00 - EST 1982 Nov 2 2:00
|
||||
-6:00 Mexico C%sT
|
||||
# Coahuila, Nuevo León, Tamaulipas (near US border)
|
||||
# This includes the following municipios:
|
||||
@ -2642,12 +2699,15 @@ Zone America/Matamoros -6:30:00 - LMT 1922 Jan 1 6:00u
|
||||
-6:00 US C%sT
|
||||
# Durango; Coahuila, Nuevo León, Tamaulipas (away from US border)
|
||||
Zone America/Monterrey -6:41:16 - LMT 1922 Jan 1 6:00u
|
||||
-7:00 - MST 1927 Jun 10
|
||||
-6:00 - CST 1930 Nov 15
|
||||
-7:00 Mexico M%sT 1932 Apr 1
|
||||
-6:00 - CST 1988
|
||||
-6:00 US C%sT 1989
|
||||
-6:00 Mexico C%sT
|
||||
# Central Mexico
|
||||
Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 7:00u
|
||||
-7:00 - MST 1927 Jun 10 23:00
|
||||
-7:00 - MST 1927 Jun 10
|
||||
-6:00 - CST 1930 Nov 15
|
||||
-7:00 Mexico M%sT 1932 Apr 1
|
||||
-6:00 Mexico C%sT 2001 Sep 30 2:00
|
||||
@ -2658,7 +2718,7 @@ Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 7:00u
|
||||
# Práxedis G Guerrero.
|
||||
# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf
|
||||
Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u
|
||||
-7:00 - MST 1927 Jun 10 23:00
|
||||
-7:00 - MST 1927 Jun 10
|
||||
-6:00 - CST 1930 Nov 15
|
||||
-7:00 Mexico M%sT 1932 Apr 1
|
||||
-6:00 - CST 1996
|
||||
@ -2673,7 +2733,7 @@ Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u
|
||||
# Benavides.
|
||||
# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf
|
||||
Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u
|
||||
-7:00 - MST 1927 Jun 10 23:00
|
||||
-7:00 - MST 1927 Jun 10
|
||||
-6:00 - CST 1930 Nov 15
|
||||
-7:00 Mexico M%sT 1932 Apr 1
|
||||
-6:00 - CST 1996
|
||||
@ -2685,7 +2745,7 @@ Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u
|
||||
-6:00 US C%sT
|
||||
# Chihuahua (away from US border)
|
||||
Zone America/Chihuahua -7:04:20 - LMT 1922 Jan 1 7:00u
|
||||
-7:00 - MST 1927 Jun 10 23:00
|
||||
-7:00 - MST 1927 Jun 10
|
||||
-6:00 - CST 1930 Nov 15
|
||||
-7:00 Mexico M%sT 1932 Apr 1
|
||||
-6:00 - CST 1996
|
||||
@ -2695,23 +2755,21 @@ Zone America/Chihuahua -7:04:20 - LMT 1922 Jan 1 7:00u
|
||||
-6:00 - CST
|
||||
# Sonora
|
||||
Zone America/Hermosillo -7:23:52 - LMT 1922 Jan 1 7:00u
|
||||
-7:00 - MST 1927 Jun 10 23:00
|
||||
-7:00 - MST 1927 Jun 10
|
||||
-6:00 - CST 1930 Nov 15
|
||||
-7:00 Mexico M%sT 1932 Apr 1
|
||||
-6:00 - CST 1942 Apr 24
|
||||
-7:00 - MST 1949 Jan 14
|
||||
-8:00 - PST 1970
|
||||
-7:00 - MST 1996
|
||||
-7:00 Mexico M%sT 1999
|
||||
-7:00 - MST
|
||||
|
||||
# Baja California Sur, Nayarit (except Bahía de Banderas), Sinaloa
|
||||
Zone America/Mazatlan -7:05:40 - LMT 1922 Jan 1 7:00u
|
||||
-7:00 - MST 1927 Jun 10 23:00
|
||||
-7:00 - MST 1927 Jun 10
|
||||
-6:00 - CST 1930 Nov 15
|
||||
-7:00 Mexico M%sT 1932 Apr 1
|
||||
-6:00 - CST 1942 Apr 24
|
||||
-7:00 - MST 1949 Jan 14
|
||||
-8:00 - PST 1970
|
||||
-7:00 - MST 1970
|
||||
-7:00 Mexico M%sT
|
||||
|
||||
# Bahía de Banderas
|
||||
@ -2744,27 +2802,32 @@ Zone America/Mazatlan -7:05:40 - LMT 1922 Jan 1 7:00u
|
||||
# Use "Bahia_Banderas" to keep the name to fourteen characters.
|
||||
|
||||
Zone America/Bahia_Banderas -7:01:00 - LMT 1922 Jan 1 7:00u
|
||||
-7:00 - MST 1927 Jun 10 23:00
|
||||
-7:00 - MST 1927 Jun 10
|
||||
-6:00 - CST 1930 Nov 15
|
||||
-7:00 Mexico M%sT 1932 Apr 1
|
||||
-6:00 - CST 1942 Apr 24
|
||||
-7:00 - MST 1949 Jan 14
|
||||
-8:00 - PST 1970
|
||||
-7:00 - MST 1970
|
||||
-7:00 Mexico M%sT 2010 Apr 4 2:00
|
||||
-6:00 Mexico C%sT
|
||||
|
||||
# Baja California
|
||||
Zone America/Tijuana -7:48:04 - LMT 1922 Jan 1 7:00u
|
||||
-7:00 - MST 1924
|
||||
-8:00 - PST 1927 Jun 10 23:00
|
||||
-8:00 - PST 1927 Jun 10
|
||||
-7:00 - MST 1930 Nov 15
|
||||
-8:00 - PST 1931 Apr 1
|
||||
-8:00 1:00 PDT 1931 Sep 30
|
||||
-8:00 - PST 1942 Apr 24
|
||||
-8:00 1:00 PWT 1945 Aug 14 23:00u
|
||||
-8:00 1:00 PPT 1945 Nov 12 # Peace
|
||||
-8:00 1:00 PPT 1945 Nov 15 # Peace
|
||||
-8:00 - PST 1948 Apr 5
|
||||
-8:00 1:00 PDT 1949 Jan 14
|
||||
-8:00 - PST 1950 May 1
|
||||
-8:00 1:00 PDT 1950 Sep 24
|
||||
-8:00 - PST 1951 Apr 29 2:00
|
||||
-8:00 1:00 PDT 1951 Sep 30 2:00
|
||||
-8:00 - PST 1952 Apr 27 2:00
|
||||
-8:00 1:00 PDT 1952 Sep 28 2:00
|
||||
-8:00 - PST 1954
|
||||
-8:00 CA P%sT 1961
|
||||
-8:00 - PST 1976
|
||||
@ -3573,8 +3636,8 @@ Zone America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12:00 # San Juan
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Miquelon -3:44:40 - LMT 1911 Jun 15 # St Pierre
|
||||
-4:00 - AST 1980 May
|
||||
-3:00 - -03 1987
|
||||
-3:00 Canada -03/-02
|
||||
-3:00 - %z 1987
|
||||
-3:00 Canada %z
|
||||
|
||||
# Turks and Caicos
|
||||
#
|
||||
|
||||
@ -425,11 +425,11 @@ Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 -
|
||||
Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May # Córdoba Mean Time
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 Arg -03/-02
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 Arg %z
|
||||
#
|
||||
# Córdoba (CB), Santa Fe (SF), Entre Ríos (ER), Corrientes (CN), Misiones (MN),
|
||||
# Chaco (CC), Formosa (FM), Santiago del Estero (SE)
|
||||
@ -444,120 +444,120 @@ Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
Zone America/Argentina/Cordoba -4:16:48 - LMT 1894 Oct 31
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1991 Mar 3
|
||||
-4:00 - -04 1991 Oct 20
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 Arg -03/-02
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1991 Mar 3
|
||||
-4:00 - %z 1991 Oct 20
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 Arg %z
|
||||
#
|
||||
# Salta (SA), La Pampa (LP), Neuquén (NQ), Rio Negro (RN)
|
||||
Zone America/Argentina/Salta -4:21:40 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1991 Mar 3
|
||||
-4:00 - -04 1991 Oct 20
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 Arg -03/-02 2008 Oct 18
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1991 Mar 3
|
||||
-4:00 - %z 1991 Oct 20
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 Arg %z 2008 Oct 18
|
||||
-3:00 - %z
|
||||
#
|
||||
# Tucumán (TM)
|
||||
Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1991 Mar 3
|
||||
-4:00 - -04 1991 Oct 20
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 - -03 2004 Jun 1
|
||||
-4:00 - -04 2004 Jun 13
|
||||
-3:00 Arg -03/-02
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1991 Mar 3
|
||||
-4:00 - %z 1991 Oct 20
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 - %z 2004 Jun 1
|
||||
-4:00 - %z 2004 Jun 13
|
||||
-3:00 Arg %z
|
||||
#
|
||||
# La Rioja (LR)
|
||||
Zone America/Argentina/La_Rioja -4:27:24 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1991 Mar 1
|
||||
-4:00 - -04 1991 May 7
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 - -03 2004 Jun 1
|
||||
-4:00 - -04 2004 Jun 20
|
||||
-3:00 Arg -03/-02 2008 Oct 18
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1991 Mar 1
|
||||
-4:00 - %z 1991 May 7
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 - %z 2004 Jun 1
|
||||
-4:00 - %z 2004 Jun 20
|
||||
-3:00 Arg %z 2008 Oct 18
|
||||
-3:00 - %z
|
||||
#
|
||||
# San Juan (SJ)
|
||||
Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1991 Mar 1
|
||||
-4:00 - -04 1991 May 7
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 - -03 2004 May 31
|
||||
-4:00 - -04 2004 Jul 25
|
||||
-3:00 Arg -03/-02 2008 Oct 18
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1991 Mar 1
|
||||
-4:00 - %z 1991 May 7
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 - %z 2004 May 31
|
||||
-4:00 - %z 2004 Jul 25
|
||||
-3:00 Arg %z 2008 Oct 18
|
||||
-3:00 - %z
|
||||
#
|
||||
# Jujuy (JY)
|
||||
Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1990 Mar 4
|
||||
-4:00 - -04 1990 Oct 28
|
||||
-4:00 1:00 -03 1991 Mar 17
|
||||
-4:00 - -04 1991 Oct 6
|
||||
-3:00 1:00 -02 1992
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 Arg -03/-02 2008 Oct 18
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1990 Mar 4
|
||||
-4:00 - %z 1990 Oct 28
|
||||
-4:00 1:00 %z 1991 Mar 17
|
||||
-4:00 - %z 1991 Oct 6
|
||||
-3:00 1:00 %z 1992
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 Arg %z 2008 Oct 18
|
||||
-3:00 - %z
|
||||
#
|
||||
# Catamarca (CT), Chubut (CH)
|
||||
Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1991 Mar 3
|
||||
-4:00 - -04 1991 Oct 20
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 - -03 2004 Jun 1
|
||||
-4:00 - -04 2004 Jun 20
|
||||
-3:00 Arg -03/-02 2008 Oct 18
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1991 Mar 3
|
||||
-4:00 - %z 1991 Oct 20
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 - %z 2004 Jun 1
|
||||
-4:00 - %z 2004 Jun 20
|
||||
-3:00 Arg %z 2008 Oct 18
|
||||
-3:00 - %z
|
||||
#
|
||||
# Mendoza (MZ)
|
||||
Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1990 Mar 4
|
||||
-4:00 - -04 1990 Oct 15
|
||||
-4:00 1:00 -03 1991 Mar 1
|
||||
-4:00 - -04 1991 Oct 15
|
||||
-4:00 1:00 -03 1992 Mar 1
|
||||
-4:00 - -04 1992 Oct 18
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 - -03 2004 May 23
|
||||
-4:00 - -04 2004 Sep 26
|
||||
-3:00 Arg -03/-02 2008 Oct 18
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1990 Mar 4
|
||||
-4:00 - %z 1990 Oct 15
|
||||
-4:00 1:00 %z 1991 Mar 1
|
||||
-4:00 - %z 1991 Oct 15
|
||||
-4:00 1:00 %z 1992 Mar 1
|
||||
-4:00 - %z 1992 Oct 18
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 - %z 2004 May 23
|
||||
-4:00 - %z 2004 Sep 26
|
||||
-3:00 Arg %z 2008 Oct 18
|
||||
-3:00 - %z
|
||||
#
|
||||
# San Luis (SL)
|
||||
|
||||
@ -567,53 +567,53 @@ Rule SanLuis 2007 2008 - Oct Sun>=8 0:00 1:00 -
|
||||
Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1990
|
||||
-3:00 1:00 -02 1990 Mar 14
|
||||
-4:00 - -04 1990 Oct 15
|
||||
-4:00 1:00 -03 1991 Mar 1
|
||||
-4:00 - -04 1991 Jun 1
|
||||
-3:00 - -03 1999 Oct 3
|
||||
-4:00 1:00 -03 2000 Mar 3
|
||||
-3:00 - -03 2004 May 31
|
||||
-4:00 - -04 2004 Jul 25
|
||||
-3:00 Arg -03/-02 2008 Jan 21
|
||||
-4:00 SanLuis -04/-03 2009 Oct 11
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1990
|
||||
-3:00 1:00 %z 1990 Mar 14
|
||||
-4:00 - %z 1990 Oct 15
|
||||
-4:00 1:00 %z 1991 Mar 1
|
||||
-4:00 - %z 1991 Jun 1
|
||||
-3:00 - %z 1999 Oct 3
|
||||
-4:00 1:00 %z 2000 Mar 3
|
||||
-3:00 - %z 2004 May 31
|
||||
-4:00 - %z 2004 Jul 25
|
||||
-3:00 Arg %z 2008 Jan 21
|
||||
-4:00 SanLuis %z 2009 Oct 11
|
||||
-3:00 - %z
|
||||
#
|
||||
# Santa Cruz (SC)
|
||||
Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 - -03 2004 Jun 1
|
||||
-4:00 - -04 2004 Jun 20
|
||||
-3:00 Arg -03/-02 2008 Oct 18
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 - %z 2004 Jun 1
|
||||
-4:00 - %z 2004 Jun 20
|
||||
-3:00 Arg %z 2008 Oct 18
|
||||
-3:00 - %z
|
||||
#
|
||||
# Tierra del Fuego, Antártida e Islas del Atlántico Sur (TF)
|
||||
Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
|
||||
#STDOFF -4:16:48.25
|
||||
-4:16:48 - CMT 1920 May
|
||||
-4:00 - -04 1930 Dec
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1999 Oct 3
|
||||
-4:00 Arg -04/-03 2000 Mar 3
|
||||
-3:00 - -03 2004 May 30
|
||||
-4:00 - -04 2004 Jun 20
|
||||
-3:00 Arg -03/-02 2008 Oct 18
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1930 Dec
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1999 Oct 3
|
||||
-4:00 Arg %z 2000 Mar 3
|
||||
-3:00 - %z 2004 May 30
|
||||
-4:00 - %z 2004 Jun 20
|
||||
-3:00 Arg %z 2008 Oct 18
|
||||
-3:00 - %z
|
||||
|
||||
# Bolivia
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/La_Paz -4:32:36 - LMT 1890
|
||||
-4:32:36 - CMT 1931 Oct 15 # Calamarca MT
|
||||
-4:32:36 1:00 BST 1932 Mar 21 # Bolivia ST
|
||||
-4:00 - -04
|
||||
-4:00 - %z
|
||||
|
||||
# Brazil
|
||||
|
||||
@ -984,12 +984,12 @@ Rule Brazil 2018 only - Nov Sun>=1 0:00 1:00 -
|
||||
#
|
||||
# Fernando de Noronha (administratively part of PE)
|
||||
Zone America/Noronha -2:09:40 - LMT 1914
|
||||
-2:00 Brazil -02/-01 1990 Sep 17
|
||||
-2:00 - -02 1999 Sep 30
|
||||
-2:00 Brazil -02/-01 2000 Oct 15
|
||||
-2:00 - -02 2001 Sep 13
|
||||
-2:00 Brazil -02/-01 2002 Oct 1
|
||||
-2:00 - -02
|
||||
-2:00 Brazil %z 1990 Sep 17
|
||||
-2:00 - %z 1999 Sep 30
|
||||
-2:00 Brazil %z 2000 Oct 15
|
||||
-2:00 - %z 2001 Sep 13
|
||||
-2:00 Brazil %z 2002 Oct 1
|
||||
-2:00 - %z
|
||||
# Other Atlantic islands have no permanent settlement.
|
||||
# These include Trindade and Martim Vaz (administratively part of ES),
|
||||
# Rocas Atoll (RN), and the St Peter and St Paul Archipelago (PE).
|
||||
@ -1002,119 +1002,119 @@ Zone America/Noronha -2:09:40 - LMT 1914
|
||||
# In the north a very small part from the river Javary (now Jari I guess,
|
||||
# the border with Amapá) to the Amazon, then to the Xingu.
|
||||
Zone America/Belem -3:13:56 - LMT 1914
|
||||
-3:00 Brazil -03/-02 1988 Sep 12
|
||||
-3:00 - -03
|
||||
-3:00 Brazil %z 1988 Sep 12
|
||||
-3:00 - %z
|
||||
#
|
||||
# west Pará (PA)
|
||||
# West Pará includes Altamira, Óbidos, Prainha, Oriximiná, and Santarém.
|
||||
Zone America/Santarem -3:38:48 - LMT 1914
|
||||
-4:00 Brazil -04/-03 1988 Sep 12
|
||||
-4:00 - -04 2008 Jun 24 0:00
|
||||
-3:00 - -03
|
||||
-4:00 Brazil %z 1988 Sep 12
|
||||
-4:00 - %z 2008 Jun 24 0:00
|
||||
-3:00 - %z
|
||||
#
|
||||
# Maranhão (MA), Piauí (PI), Ceará (CE), Rio Grande do Norte (RN),
|
||||
# Paraíba (PB)
|
||||
Zone America/Fortaleza -2:34:00 - LMT 1914
|
||||
-3:00 Brazil -03/-02 1990 Sep 17
|
||||
-3:00 - -03 1999 Sep 30
|
||||
-3:00 Brazil -03/-02 2000 Oct 22
|
||||
-3:00 - -03 2001 Sep 13
|
||||
-3:00 Brazil -03/-02 2002 Oct 1
|
||||
-3:00 - -03
|
||||
-3:00 Brazil %z 1990 Sep 17
|
||||
-3:00 - %z 1999 Sep 30
|
||||
-3:00 Brazil %z 2000 Oct 22
|
||||
-3:00 - %z 2001 Sep 13
|
||||
-3:00 Brazil %z 2002 Oct 1
|
||||
-3:00 - %z
|
||||
#
|
||||
# Pernambuco (PE) (except Atlantic islands)
|
||||
Zone America/Recife -2:19:36 - LMT 1914
|
||||
-3:00 Brazil -03/-02 1990 Sep 17
|
||||
-3:00 - -03 1999 Sep 30
|
||||
-3:00 Brazil -03/-02 2000 Oct 15
|
||||
-3:00 - -03 2001 Sep 13
|
||||
-3:00 Brazil -03/-02 2002 Oct 1
|
||||
-3:00 - -03
|
||||
-3:00 Brazil %z 1990 Sep 17
|
||||
-3:00 - %z 1999 Sep 30
|
||||
-3:00 Brazil %z 2000 Oct 15
|
||||
-3:00 - %z 2001 Sep 13
|
||||
-3:00 Brazil %z 2002 Oct 1
|
||||
-3:00 - %z
|
||||
#
|
||||
# Tocantins (TO)
|
||||
Zone America/Araguaina -3:12:48 - LMT 1914
|
||||
-3:00 Brazil -03/-02 1990 Sep 17
|
||||
-3:00 - -03 1995 Sep 14
|
||||
-3:00 Brazil -03/-02 2003 Sep 24
|
||||
-3:00 - -03 2012 Oct 21
|
||||
-3:00 Brazil -03/-02 2013 Sep
|
||||
-3:00 - -03
|
||||
-3:00 Brazil %z 1990 Sep 17
|
||||
-3:00 - %z 1995 Sep 14
|
||||
-3:00 Brazil %z 2003 Sep 24
|
||||
-3:00 - %z 2012 Oct 21
|
||||
-3:00 Brazil %z 2013 Sep
|
||||
-3:00 - %z
|
||||
#
|
||||
# Alagoas (AL), Sergipe (SE)
|
||||
Zone America/Maceio -2:22:52 - LMT 1914
|
||||
-3:00 Brazil -03/-02 1990 Sep 17
|
||||
-3:00 - -03 1995 Oct 13
|
||||
-3:00 Brazil -03/-02 1996 Sep 4
|
||||
-3:00 - -03 1999 Sep 30
|
||||
-3:00 Brazil -03/-02 2000 Oct 22
|
||||
-3:00 - -03 2001 Sep 13
|
||||
-3:00 Brazil -03/-02 2002 Oct 1
|
||||
-3:00 - -03
|
||||
-3:00 Brazil %z 1990 Sep 17
|
||||
-3:00 - %z 1995 Oct 13
|
||||
-3:00 Brazil %z 1996 Sep 4
|
||||
-3:00 - %z 1999 Sep 30
|
||||
-3:00 Brazil %z 2000 Oct 22
|
||||
-3:00 - %z 2001 Sep 13
|
||||
-3:00 Brazil %z 2002 Oct 1
|
||||
-3:00 - %z
|
||||
#
|
||||
# Bahia (BA)
|
||||
# There are too many Salvadors elsewhere, so use America/Bahia instead
|
||||
# of America/Salvador.
|
||||
Zone America/Bahia -2:34:04 - LMT 1914
|
||||
-3:00 Brazil -03/-02 2003 Sep 24
|
||||
-3:00 - -03 2011 Oct 16
|
||||
-3:00 Brazil -03/-02 2012 Oct 21
|
||||
-3:00 - -03
|
||||
-3:00 Brazil %z 2003 Sep 24
|
||||
-3:00 - %z 2011 Oct 16
|
||||
-3:00 Brazil %z 2012 Oct 21
|
||||
-3:00 - %z
|
||||
#
|
||||
# Goiás (GO), Distrito Federal (DF), Minas Gerais (MG),
|
||||
# Espírito Santo (ES), Rio de Janeiro (RJ), São Paulo (SP), Paraná (PR),
|
||||
# Santa Catarina (SC), Rio Grande do Sul (RS)
|
||||
Zone America/Sao_Paulo -3:06:28 - LMT 1914
|
||||
-3:00 Brazil -03/-02 1963 Oct 23 0:00
|
||||
-3:00 1:00 -02 1964
|
||||
-3:00 Brazil -03/-02
|
||||
-3:00 Brazil %z 1963 Oct 23 0:00
|
||||
-3:00 1:00 %z 1964
|
||||
-3:00 Brazil %z
|
||||
#
|
||||
# Mato Grosso do Sul (MS)
|
||||
Zone America/Campo_Grande -3:38:28 - LMT 1914
|
||||
-4:00 Brazil -04/-03
|
||||
-4:00 Brazil %z
|
||||
#
|
||||
# Mato Grosso (MT)
|
||||
Zone America/Cuiaba -3:44:20 - LMT 1914
|
||||
-4:00 Brazil -04/-03 2003 Sep 24
|
||||
-4:00 - -04 2004 Oct 1
|
||||
-4:00 Brazil -04/-03
|
||||
-4:00 Brazil %z 2003 Sep 24
|
||||
-4:00 - %z 2004 Oct 1
|
||||
-4:00 Brazil %z
|
||||
#
|
||||
# Rondônia (RO)
|
||||
Zone America/Porto_Velho -4:15:36 - LMT 1914
|
||||
-4:00 Brazil -04/-03 1988 Sep 12
|
||||
-4:00 - -04
|
||||
-4:00 Brazil %z 1988 Sep 12
|
||||
-4:00 - %z
|
||||
#
|
||||
# Roraima (RR)
|
||||
Zone America/Boa_Vista -4:02:40 - LMT 1914
|
||||
-4:00 Brazil -04/-03 1988 Sep 12
|
||||
-4:00 - -04 1999 Sep 30
|
||||
-4:00 Brazil -04/-03 2000 Oct 15
|
||||
-4:00 - -04
|
||||
-4:00 Brazil %z 1988 Sep 12
|
||||
-4:00 - %z 1999 Sep 30
|
||||
-4:00 Brazil %z 2000 Oct 15
|
||||
-4:00 - %z
|
||||
#
|
||||
# east Amazonas (AM): Boca do Acre, Jutaí, Manaus, Floriano Peixoto
|
||||
# The great circle line from Tabatinga to Porto Acre divides
|
||||
# east from west Amazonas.
|
||||
Zone America/Manaus -4:00:04 - LMT 1914
|
||||
-4:00 Brazil -04/-03 1988 Sep 12
|
||||
-4:00 - -04 1993 Sep 28
|
||||
-4:00 Brazil -04/-03 1994 Sep 22
|
||||
-4:00 - -04
|
||||
-4:00 Brazil %z 1988 Sep 12
|
||||
-4:00 - %z 1993 Sep 28
|
||||
-4:00 Brazil %z 1994 Sep 22
|
||||
-4:00 - %z
|
||||
#
|
||||
# west Amazonas (AM): Atalaia do Norte, Boca do Maoco, Benjamin Constant,
|
||||
# Eirunepé, Envira, Ipixuna
|
||||
Zone America/Eirunepe -4:39:28 - LMT 1914
|
||||
-5:00 Brazil -05/-04 1988 Sep 12
|
||||
-5:00 - -05 1993 Sep 28
|
||||
-5:00 Brazil -05/-04 1994 Sep 22
|
||||
-5:00 - -05 2008 Jun 24 0:00
|
||||
-4:00 - -04 2013 Nov 10
|
||||
-5:00 - -05
|
||||
-5:00 Brazil %z 1988 Sep 12
|
||||
-5:00 - %z 1993 Sep 28
|
||||
-5:00 Brazil %z 1994 Sep 22
|
||||
-5:00 - %z 2008 Jun 24 0:00
|
||||
-4:00 - %z 2013 Nov 10
|
||||
-5:00 - %z
|
||||
#
|
||||
# Acre (AC)
|
||||
Zone America/Rio_Branco -4:31:12 - LMT 1914
|
||||
-5:00 Brazil -05/-04 1988 Sep 12
|
||||
-5:00 - -05 2008 Jun 24 0:00
|
||||
-4:00 - -04 2013 Nov 10
|
||||
-5:00 - -05
|
||||
-5:00 Brazil %z 1988 Sep 12
|
||||
-5:00 - %z 2008 Jun 24 0:00
|
||||
-4:00 - %z 2013 Nov 10
|
||||
-5:00 - %z
|
||||
|
||||
# Chile
|
||||
|
||||
@ -1382,36 +1382,36 @@ Rule Chile 2023 max - Sep Sun>=2 4:00u 1:00 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Santiago -4:42:45 - LMT 1890
|
||||
-4:42:45 - SMT 1910 Jan 10 # Santiago Mean Time
|
||||
-5:00 - -05 1916 Jul 1
|
||||
-5:00 - %z 1916 Jul 1
|
||||
-4:42:45 - SMT 1918 Sep 10
|
||||
-4:00 - -04 1919 Jul 1
|
||||
-4:00 - %z 1919 Jul 1
|
||||
-4:42:45 - SMT 1927 Sep 1
|
||||
-5:00 Chile -05/-04 1932 Sep 1
|
||||
-4:00 - -04 1942 Jun 1
|
||||
-5:00 - -05 1942 Aug 1
|
||||
-4:00 - -04 1946 Jul 14 24:00
|
||||
-4:00 1:00 -03 1946 Aug 28 24:00 # central CL
|
||||
-5:00 1:00 -04 1947 Mar 31 24:00
|
||||
-5:00 - -05 1947 May 21 23:00
|
||||
-4:00 Chile -04/-03
|
||||
-5:00 Chile %z 1932 Sep 1
|
||||
-4:00 - %z 1942 Jun 1
|
||||
-5:00 - %z 1942 Aug 1
|
||||
-4:00 - %z 1946 Jul 14 24:00
|
||||
-4:00 1:00 %z 1946 Aug 28 24:00 # central CL
|
||||
-5:00 1:00 %z 1947 Mar 31 24:00
|
||||
-5:00 - %z 1947 May 21 23:00
|
||||
-4:00 Chile %z
|
||||
Zone America/Punta_Arenas -4:43:40 - LMT 1890
|
||||
-4:42:45 - SMT 1910 Jan 10
|
||||
-5:00 - -05 1916 Jul 1
|
||||
-5:00 - %z 1916 Jul 1
|
||||
-4:42:45 - SMT 1918 Sep 10
|
||||
-4:00 - -04 1919 Jul 1
|
||||
-4:00 - %z 1919 Jul 1
|
||||
-4:42:45 - SMT 1927 Sep 1
|
||||
-5:00 Chile -05/-04 1932 Sep 1
|
||||
-4:00 - -04 1942 Jun 1
|
||||
-5:00 - -05 1942 Aug 1
|
||||
-4:00 - -04 1946 Aug 28 24:00
|
||||
-5:00 1:00 -04 1947 Mar 31 24:00
|
||||
-5:00 - -05 1947 May 21 23:00
|
||||
-4:00 Chile -04/-03 2016 Dec 4
|
||||
-3:00 - -03
|
||||
-5:00 Chile %z 1932 Sep 1
|
||||
-4:00 - %z 1942 Jun 1
|
||||
-5:00 - %z 1942 Aug 1
|
||||
-4:00 - %z 1946 Aug 28 24:00
|
||||
-5:00 1:00 %z 1947 Mar 31 24:00
|
||||
-5:00 - %z 1947 May 21 23:00
|
||||
-4:00 Chile %z 2016 Dec 4
|
||||
-3:00 - %z
|
||||
Zone Pacific/Easter -7:17:28 - LMT 1890
|
||||
-7:17:28 - EMT 1932 Sep # Easter Mean Time
|
||||
-7:00 Chile -07/-06 1982 Mar 14 3:00u # Easter Time
|
||||
-6:00 Chile -06/-05
|
||||
-7:00 Chile %z 1982 Mar 14 3:00u # Easter Time
|
||||
-6:00 Chile %z
|
||||
#
|
||||
# Salas y Gómez Island is uninhabited.
|
||||
# Other Chilean locations, including Juan Fernández Is, Desventuradas Is,
|
||||
@ -1431,10 +1431,10 @@ Zone Pacific/Easter -7:17:28 - LMT 1890
|
||||
#
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Antarctica/Palmer 0 - -00 1965
|
||||
-4:00 Arg -04/-03 1969 Oct 5
|
||||
-3:00 Arg -03/-02 1982 May
|
||||
-4:00 Chile -04/-03 2016 Dec 4
|
||||
-3:00 - -03
|
||||
-4:00 Arg %z 1969 Oct 5
|
||||
-3:00 Arg %z 1982 May
|
||||
-4:00 Chile %z 2016 Dec 4
|
||||
-3:00 - %z
|
||||
|
||||
# Colombia
|
||||
|
||||
@ -1453,7 +1453,7 @@ Rule CO 1993 only - Feb 6 24:00 0 -
|
||||
#STDOFF -4:56:16.4
|
||||
Zone America/Bogota -4:56:16 - LMT 1884 Mar 13
|
||||
-4:56:16 - BMT 1914 Nov 23 # Bogotá Mean Time
|
||||
-5:00 CO -05/-04
|
||||
-5:00 CO %z
|
||||
# Malpelo, Providencia, San Andres
|
||||
# no information; probably like America/Bogota
|
||||
|
||||
@ -1484,10 +1484,10 @@ Rule Ecuador 1993 only - Feb 5 0:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Guayaquil -5:19:20 - LMT 1890
|
||||
-5:14:00 - QMT 1931 # Quito Mean Time
|
||||
-5:00 Ecuador -05/-04
|
||||
-5:00 Ecuador %z
|
||||
Zone Pacific/Galapagos -5:58:24 - LMT 1931 # Puerto Baquerizo Moreno
|
||||
-5:00 - -05 1986
|
||||
-6:00 Ecuador -06/-05
|
||||
-5:00 - %z 1986
|
||||
-6:00 Ecuador %z
|
||||
|
||||
# Falklands
|
||||
|
||||
@ -1587,10 +1587,10 @@ Rule Falk 2001 2010 - Sep Sun>=1 2:00 1:00 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Atlantic/Stanley -3:51:24 - LMT 1890
|
||||
-3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time
|
||||
-4:00 Falk -04/-03 1983 May
|
||||
-3:00 Falk -03/-02 1985 Sep 15
|
||||
-4:00 Falk -04/-03 2010 Sep 5 2:00
|
||||
-3:00 - -03
|
||||
-4:00 Falk %z 1983 May
|
||||
-3:00 Falk %z 1985 Sep 15
|
||||
-4:00 Falk %z 2010 Sep 5 2:00
|
||||
-3:00 - %z
|
||||
|
||||
# French Guiana
|
||||
# For the 1911/1912 establishment of standard time in French possessions, see:
|
||||
@ -1598,8 +1598,8 @@ Zone Atlantic/Stanley -3:51:24 - LMT 1890
|
||||
# page 752, 18b.
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1
|
||||
-4:00 - -04 1967 Oct
|
||||
-3:00 - -03
|
||||
-4:00 - %z 1967 Oct
|
||||
-3:00 - %z
|
||||
|
||||
# Guyana
|
||||
|
||||
@ -1633,10 +1633,10 @@ Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1
|
||||
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Guyana -3:52:39 - LMT 1911 Aug 1 # Georgetown
|
||||
-4:00 - -04 1915 Mar 1
|
||||
-3:45 - -0345 1975 Aug 1
|
||||
-3:00 - -03 1992 Mar 29 1:00
|
||||
-4:00 - -04
|
||||
-4:00 - %z 1915 Mar 1
|
||||
-3:45 - %z 1975 Aug 1
|
||||
-3:00 - %z 1992 Mar 29 1:00
|
||||
-4:00 - %z
|
||||
|
||||
# Paraguay
|
||||
#
|
||||
@ -1734,9 +1734,9 @@ Rule Para 2013 max - Mar Sun>=22 0:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Asuncion -3:50:40 - LMT 1890
|
||||
-3:50:40 - AMT 1931 Oct 10 # Asunción Mean Time
|
||||
-4:00 - -04 1972 Oct
|
||||
-3:00 - -03 1974 Apr
|
||||
-4:00 Para -04/-03
|
||||
-4:00 - %z 1972 Oct
|
||||
-3:00 - %z 1974 Apr
|
||||
-4:00 Para %z
|
||||
|
||||
# Peru
|
||||
#
|
||||
@ -1763,12 +1763,12 @@ Rule Peru 1994 only - Apr 1 0:00 0 -
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Lima -5:08:12 - LMT 1890
|
||||
-5:08:36 - LMT 1908 Jul 28 # Lima Mean Time?
|
||||
-5:00 Peru -05/-04
|
||||
-5:00 Peru %z
|
||||
|
||||
# South Georgia
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken
|
||||
-2:00 - -02
|
||||
-2:00 - %z
|
||||
|
||||
# South Sandwich Is
|
||||
# uninhabited; scientific personnel have wintered
|
||||
@ -1778,8 +1778,8 @@ Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken
|
||||
Zone America/Paramaribo -3:40:40 - LMT 1911
|
||||
-3:40:52 - PMT 1935 # Paramaribo Mean Time
|
||||
-3:40:36 - PMT 1945 Oct # The capital moved?
|
||||
-3:30 - -0330 1984 Oct
|
||||
-3:00 - -03
|
||||
-3:30 - %z 1984 Oct
|
||||
-3:00 - %z
|
||||
|
||||
# Uruguay
|
||||
# From Paul Eggert (1993-11-18):
|
||||
@ -1994,15 +1994,15 @@ Rule Uruguay 2006 2014 - Oct Sun>=1 2:00 1:00 -
|
||||
# This Zone can be simplified once we assume zic %z.
|
||||
Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
|
||||
-3:44:51 - MMT 1920 May 1 # Montevideo MT
|
||||
-4:00 - -04 1923 Oct 1
|
||||
-3:30 Uruguay -0330/-03 1942 Dec 14
|
||||
-3:00 Uruguay -03/-0230 1960
|
||||
-3:00 Uruguay -03/-02 1968
|
||||
-3:00 Uruguay -03/-0230 1970
|
||||
-3:00 Uruguay -03/-02 1974
|
||||
-3:00 Uruguay -03/-0130 1974 Mar 10
|
||||
-3:00 Uruguay -03/-0230 1974 Dec 22
|
||||
-3:00 Uruguay -03/-02
|
||||
-4:00 - %z 1923 Oct 1
|
||||
-3:30 Uruguay %z 1942 Dec 14
|
||||
-3:00 Uruguay %z 1960
|
||||
-3:00 Uruguay %z 1968
|
||||
-3:00 Uruguay %z 1970
|
||||
-3:00 Uruguay %z 1974
|
||||
-3:00 Uruguay %z 1974 Mar 10
|
||||
-3:00 Uruguay %z 1974 Dec 22
|
||||
-3:00 Uruguay %z
|
||||
|
||||
# Venezuela
|
||||
#
|
||||
@ -2036,7 +2036,7 @@ Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
|
||||
# Zone NAME STDOFF RULES FORMAT [UNTIL]
|
||||
Zone America/Caracas -4:27:44 - LMT 1890
|
||||
-4:27:40 - CMT 1912 Feb 12 # Caracas Mean Time?
|
||||
-4:30 - -0430 1965 Jan 1 0:00
|
||||
-4:00 - -04 2007 Dec 9 3:00
|
||||
-4:30 - -0430 2016 May 1 2:30
|
||||
-4:00 - -04
|
||||
-4:30 - %z 1965 Jan 1 0:00
|
||||
-4:00 - %z 2007 Dec 9 3:00
|
||||
-4:30 - %z 2016 May 1 2:30
|
||||
-4:00 - %z
|
||||
|
||||
@ -287,8 +287,7 @@ MK +4159+02126 Europe/Skopje
|
||||
ML +1239-00800 Africa/Bamako
|
||||
MM +1647+09610 Asia/Yangon
|
||||
MN +4755+10653 Asia/Ulaanbaatar most of Mongolia
|
||||
MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
|
||||
MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar
|
||||
MN +4801+09139 Asia/Hovd Bayan-Olgii, Hovd, Uvs
|
||||
MO +221150+1133230 Asia/Macau
|
||||
MP +1512+14545 Pacific/Saipan
|
||||
MQ +1436-06105 America/Martinique
|
||||
|
||||
@ -528,7 +528,7 @@ jint unix_getChildren(JNIEnv *env, jlong jpid, jlongArray jarray,
|
||||
* position integer as a filename.
|
||||
*/
|
||||
if ((dir = opendir("/proc")) == NULL) {
|
||||
JNU_ThrowByNameWithLastError(env,
|
||||
JNU_ThrowByNameWithMessageAndLastError(env,
|
||||
"java/lang/RuntimeException", "Unable to open /proc");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -60,35 +60,33 @@ import static sun.awt.screencast.ScreencastHelper.SCREENCAST_DEBUG;
|
||||
* The restore token allows the ScreenCast session to be restored
|
||||
* with previously granted screen access permissions.
|
||||
*/
|
||||
@SuppressWarnings("removal")
|
||||
final class TokenStorage {
|
||||
|
||||
private TokenStorage() {}
|
||||
|
||||
private static final String REL_NAME =
|
||||
".java/robot/screencast-tokens.properties";
|
||||
private static final String REL_NAME_SECONDARY =
|
||||
".awt/robot/screencast-tokens.properties";
|
||||
|
||||
private static final Properties PROPS = new Properties();
|
||||
private static final Path PROPS_PATH;
|
||||
private static final Path PROP_FILENAME;
|
||||
|
||||
@SuppressWarnings("removal")
|
||||
private static void doPrivilegedRunnable(Runnable runnable) {
|
||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||
@Override
|
||||
public Void run() {
|
||||
runnable.run();
|
||||
return null;
|
||||
}
|
||||
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
|
||||
runnable.run();
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
static {
|
||||
PROPS_PATH = AccessController.doPrivileged(new PrivilegedAction<Path>() {
|
||||
@Override
|
||||
public Path run() {
|
||||
return setupPath();
|
||||
}
|
||||
});
|
||||
@SuppressWarnings("removal")
|
||||
Path propsPath = AccessController
|
||||
.doPrivileged((PrivilegedAction<Path>) () -> setupPath());
|
||||
|
||||
PROPS_PATH = propsPath;
|
||||
|
||||
if (PROPS_PATH != null) {
|
||||
PROP_FILENAME = PROPS_PATH.getFileName();
|
||||
@ -110,27 +108,34 @@ final class TokenStorage {
|
||||
}
|
||||
|
||||
Path path = Path.of(userHome, REL_NAME);
|
||||
Path secondaryPath = Path.of(userHome, REL_NAME_SECONDARY);
|
||||
|
||||
boolean copyFromSecondary = !Files.isWritable(path)
|
||||
&& Files.isWritable(secondaryPath);
|
||||
|
||||
Path workdir = path.getParent();
|
||||
|
||||
if (!Files.exists(workdir)) {
|
||||
try {
|
||||
Files.createDirectories(workdir);
|
||||
} catch (Exception e) {
|
||||
if (!Files.isWritable(path)) {
|
||||
if (!Files.exists(workdir)) {
|
||||
try {
|
||||
Files.createDirectories(workdir);
|
||||
} catch (Exception e) {
|
||||
if (SCREENCAST_DEBUG) {
|
||||
System.err.printf("Token storage: cannot create" +
|
||||
" directory %s %s\n", workdir, e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Files.isWritable(workdir)) {
|
||||
if (SCREENCAST_DEBUG) {
|
||||
System.err.printf("Token storage: cannot create" +
|
||||
" directory %s %s\n", workdir, e);
|
||||
System.err.printf("Token storage: %s is not writable\n", workdir);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Files.isWritable(workdir)) {
|
||||
if (SCREENCAST_DEBUG) {
|
||||
System.err.printf("Token storage: %s is not writable\n", workdir);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
Files.setPosixFilePermissions(
|
||||
workdir,
|
||||
@ -145,7 +150,17 @@ final class TokenStorage {
|
||||
}
|
||||
}
|
||||
|
||||
if (Files.exists(path)) {
|
||||
if (copyFromSecondary) {
|
||||
if (SCREENCAST_DEBUG) {
|
||||
System.out.println("Token storage: copying from the secondary location "
|
||||
+ secondaryPath);
|
||||
}
|
||||
synchronized (PROPS) {
|
||||
if (readTokens(secondaryPath)) {
|
||||
store(path, "copy from the secondary location");
|
||||
}
|
||||
}
|
||||
} else if (Files.exists(path)) {
|
||||
if (!setFilePermission(path)) {
|
||||
return null;
|
||||
}
|
||||
@ -302,7 +317,7 @@ final class TokenStorage {
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
doPrivilegedRunnable(() -> store("save tokens"));
|
||||
doPrivilegedRunnable(() -> store(PROPS_PATH, "save tokens"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -315,7 +330,7 @@ final class TokenStorage {
|
||||
PROPS.clear();
|
||||
PROPS.load(reader);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
} catch (IOException | IllegalArgumentException e) {
|
||||
if (SCREENCAST_DEBUG) {
|
||||
System.err.printf("""
|
||||
Token storage: failed to load property file %s
|
||||
@ -410,7 +425,7 @@ final class TokenStorage {
|
||||
}
|
||||
|
||||
private static void removeMalformedRecords(Set<String> malformedRecords) {
|
||||
if (!isWritable()
|
||||
if (!isWritable(PROPS_PATH)
|
||||
|| malformedRecords == null
|
||||
|| malformedRecords.isEmpty()) {
|
||||
return;
|
||||
@ -424,17 +439,17 @@ final class TokenStorage {
|
||||
}
|
||||
}
|
||||
|
||||
store("remove malformed records");
|
||||
store(PROPS_PATH, "remove malformed records");
|
||||
}
|
||||
}
|
||||
|
||||
private static void store(String failMsg) {
|
||||
if (!isWritable()) {
|
||||
private static void store(Path path, String failMsg) {
|
||||
if (!isWritable(path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (PROPS) {
|
||||
try (BufferedWriter writer = Files.newBufferedWriter(PROPS_PATH)) {
|
||||
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
|
||||
PROPS.store(writer, null);
|
||||
} catch (IOException e) {
|
||||
if (SCREENCAST_DEBUG) {
|
||||
@ -445,13 +460,13 @@ final class TokenStorage {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isWritable() {
|
||||
if (PROPS_PATH == null
|
||||
|| (Files.exists(PROPS_PATH) && !Files.isWritable(PROPS_PATH))) {
|
||||
private static boolean isWritable(Path path) {
|
||||
if (path == null
|
||||
|| (Files.exists(path) && !Files.isWritable(path))) {
|
||||
|
||||
if (SCREENCAST_DEBUG) {
|
||||
System.err.printf(
|
||||
"Token storage: %s is not writable\n", PROPS_PATH);
|
||||
"Token storage: %s is not writable\n", path);
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -55,13 +55,11 @@ typedef enum
|
||||
} GParamFlags;
|
||||
|
||||
/* We define all structure pointers to be void* */
|
||||
typedef void GMainContext;
|
||||
typedef void GVfs;
|
||||
|
||||
typedef void GdkColormap;
|
||||
typedef void GdkDrawable;
|
||||
typedef void GdkGC;
|
||||
typedef void GdkPixbuf;
|
||||
typedef void GdkPixmap;
|
||||
|
||||
typedef void GtkFixed;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -180,8 +180,6 @@ typedef enum _cairo_status {
|
||||
} cairo_status_t;
|
||||
|
||||
/* We define all structure pointers to be void* */
|
||||
typedef void GdkPixbuf;
|
||||
typedef void GMainContext;
|
||||
typedef void GVfs;
|
||||
|
||||
typedef void GdkColormap;
|
||||
|
||||
@ -62,6 +62,7 @@ import com.sun.tools.javac.file.PathFileObject;
|
||||
import com.sun.tools.javac.jvm.ClassFile.Version;
|
||||
import com.sun.tools.javac.jvm.PoolConstant.NameAndType;
|
||||
import com.sun.tools.javac.main.Option;
|
||||
import com.sun.tools.javac.resources.CompilerProperties.Errors;
|
||||
import com.sun.tools.javac.resources.CompilerProperties.Fragments;
|
||||
import com.sun.tools.javac.resources.CompilerProperties.Warnings;
|
||||
import com.sun.tools.javac.util.*;
|
||||
@ -2311,9 +2312,17 @@ public class ClassReader {
|
||||
* 4.7.20-A target_type to locate the correct type to rewrite, and then interpreting the JVMS
|
||||
* 4.7.20.2 type_path to associate the annotation with the correct contained type.
|
||||
*/
|
||||
private static void addTypeAnnotationsToSymbol(
|
||||
Symbol s, List<Attribute.TypeCompound> attributes) {
|
||||
new TypeAnnotationSymbolVisitor(attributes).visit(s, null);
|
||||
private void addTypeAnnotationsToSymbol(Symbol s, List<Attribute.TypeCompound> attributes) {
|
||||
try {
|
||||
new TypeAnnotationSymbolVisitor(attributes).visit(s, null);
|
||||
} catch (CompletionFailure ex) {
|
||||
JavaFileObject prev = log.useSource(currentClassFile);
|
||||
try {
|
||||
log.error(Errors.CantAttachTypeAnnotations(attributes, s.owner, s.name, ex.getDetailValue()));
|
||||
} finally {
|
||||
log.useSource(prev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class TypeAnnotationSymbolVisitor
|
||||
|
||||
@ -2345,6 +2345,11 @@ compiler.warn.annotation.method.not.found=\
|
||||
compiler.warn.annotation.method.not.found.reason=\
|
||||
Cannot find annotation method ''{1}()'' in type ''{0}'': {2}
|
||||
|
||||
# 0: list of annotation, 1: symbol, 2: name, 3: message segment
|
||||
compiler.err.cant.attach.type.annotations=\
|
||||
Cannot attach type annotations {0} to {1}.{2}:\n\
|
||||
{3}
|
||||
|
||||
# 0: file object, 1: symbol, 2: name
|
||||
compiler.warn.unknown.enum.constant=\
|
||||
unknown enum constant {1}.{2}
|
||||
|
||||
@ -104,12 +104,15 @@ final class HotSpotJVMCICompilerConfig {
|
||||
}
|
||||
}
|
||||
if (factory == null) {
|
||||
String reason;
|
||||
if (Services.IS_IN_NATIVE_IMAGE) {
|
||||
throw runtime.exitHotSpotWithMessage(1, "JVMCI compiler '%s' not found in JVMCI native library.%n" +
|
||||
reason = String.format("JVMCI compiler '%s' not found in JVMCI native library.%n" +
|
||||
"Use -XX:-UseJVMCINativeLibrary when specifying a JVMCI compiler available on a class path with %s.%n",
|
||||
compilerName, compPropertyName);
|
||||
} else {
|
||||
reason = String.format("JVMCI compiler '%s' specified by %s not found%n", compilerName, compPropertyName);
|
||||
}
|
||||
throw runtime.exitHotSpotWithMessage(1, "JVMCI compiler '%s' specified by %s not found%n", compilerName, compPropertyName);
|
||||
factory = new DummyCompilerFactory(reason, runtime);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
* @test
|
||||
* @library /test/lib /
|
||||
* @requires vm.flagless
|
||||
* @requires ! vm.opt.final.UnlockExperimentalVMOptions
|
||||
* @requires vm.compMode != "Xint"
|
||||
* @run driver compiler.blackhole.BlackholeExperimentalUnlockTest
|
||||
*/
|
||||
|
||||
@ -26,8 +26,8 @@
|
||||
* @bug 8251093
|
||||
* @summary Sanity check the flag TraceLinearScanLevel with the highest level in a silent HelloWorld program.
|
||||
*
|
||||
* @requires vm.debug == true & vm.compiler1.enabled
|
||||
* @run main/othervm -XX:TraceLinearScanLevel=4 compiler.c1.TestTraceLinearScanLevel
|
||||
* @requires vm.debug == true & vm.compiler1.enabled & vm.compMode != "Xcomp"
|
||||
* @run main/othervm -Xbatch -XX:TraceLinearScanLevel=4 compiler.c1.TestTraceLinearScanLevel
|
||||
*/
|
||||
package compiler.c1;
|
||||
|
||||
|
||||
@ -0,0 +1,170 @@
|
||||
/*
|
||||
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8333791
|
||||
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
|
||||
* @requires vm.gc.Parallel
|
||||
* @requires vm.compiler2.enabled
|
||||
* @summary Check stable field folding and barriers
|
||||
* @modules java.base/jdk.internal.vm.annotation
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.irTests.stable.StablePrimArrayTest
|
||||
*/
|
||||
|
||||
package compiler.c2.irTests.stable;
|
||||
|
||||
import compiler.lib.ir_framework.*;
|
||||
import jdk.test.lib.Asserts;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
public class StablePrimArrayTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestFramework tf = new TestFramework();
|
||||
tf.addTestClassesToBootClassPath();
|
||||
tf.addFlags(
|
||||
"-XX:+UnlockExperimentalVMOptions",
|
||||
"-XX:CompileThreshold=100",
|
||||
"-XX:-TieredCompilation",
|
||||
"-XX:+UseParallelGC"
|
||||
);
|
||||
tf.start();
|
||||
}
|
||||
|
||||
static final int[] EMPTY_INTEGER = new int[] { 0 };
|
||||
static final int[] FULL_INTEGER = new int[] { 42 };
|
||||
|
||||
static class Carrier {
|
||||
@Stable
|
||||
int[] field;
|
||||
|
||||
@ForceInline
|
||||
public Carrier(int initLevel) {
|
||||
switch (initLevel) {
|
||||
case 0:
|
||||
// Do nothing.
|
||||
break;
|
||||
case 1:
|
||||
field = EMPTY_INTEGER;
|
||||
break;
|
||||
case 2:
|
||||
field = FULL_INTEGER;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Unknown level");
|
||||
}
|
||||
}
|
||||
|
||||
@ForceInline
|
||||
public void initEmpty() {
|
||||
field = EMPTY_INTEGER;
|
||||
}
|
||||
|
||||
@ForceInline
|
||||
public void initFull() {
|
||||
field = FULL_INTEGER;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static final Carrier BLANK_CARRIER = new Carrier(0);
|
||||
static final Carrier INIT_EMPTY_CARRIER = new Carrier(1);
|
||||
static final Carrier INIT_FULL_CARRIER = new Carrier(2);
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, ">0" })
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static int testNoFold() {
|
||||
// Access should not be folded.
|
||||
// No barriers expected for plain fields.
|
||||
int[] is = BLANK_CARRIER.field;
|
||||
if (is != null) {
|
||||
return is[0];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, ">0" })
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static int testPartialFold() {
|
||||
// Access should not be folded.
|
||||
// No barriers expected for plain fields.
|
||||
int[] is = INIT_EMPTY_CARRIER.field;
|
||||
if (is != null) {
|
||||
return is[0];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
|
||||
static int testFold() {
|
||||
// Access should be completely folded.
|
||||
int[] is = INIT_FULL_CARRIER.field;
|
||||
if (is != null) {
|
||||
return is[0];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorBlankInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorEmptyInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorFullInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static void testMethodEmptyInit() {
|
||||
// Reference inits do not have membars.
|
||||
INIT_EMPTY_CARRIER.initEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static void testMethodFullInit() {
|
||||
// Reference inits do not have membars.
|
||||
INIT_FULL_CARRIER.initFull();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8333791
|
||||
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
|
||||
* @requires vm.gc.Parallel
|
||||
* @requires vm.compiler2.enabled
|
||||
* @summary Check stable field folding and barriers
|
||||
* @modules java.base/jdk.internal.vm.annotation
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.irTests.stable.StablePrimFinalTest
|
||||
*/
|
||||
|
||||
package compiler.c2.irTests.stable;
|
||||
|
||||
import compiler.lib.ir_framework.*;
|
||||
import jdk.test.lib.Asserts;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
public class StablePrimFinalTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestFramework tf = new TestFramework();
|
||||
tf.addTestClassesToBootClassPath();
|
||||
tf.addFlags(
|
||||
"-XX:+UnlockExperimentalVMOptions",
|
||||
"-XX:CompileThreshold=100",
|
||||
"-XX:-TieredCompilation",
|
||||
"-XX:+UseParallelGC"
|
||||
);
|
||||
tf.start();
|
||||
}
|
||||
|
||||
static class Carrier {
|
||||
@Stable
|
||||
final int field;
|
||||
|
||||
@ForceInline
|
||||
public Carrier(boolean init) {
|
||||
field = init ? 42 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
static final Carrier BLANK_CARRIER = new Carrier(false);
|
||||
static final Carrier INIT_CARRIER = new Carrier(true);
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, "1" })
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static int testNoFold() {
|
||||
// Access should not be folded.
|
||||
// No barriers expected for final fields.
|
||||
return BLANK_CARRIER.field;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
|
||||
static int testFold() {
|
||||
// Access should be completely folded.
|
||||
return INIT_CARRIER.field;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorBlankInit() {
|
||||
// Single header+final barrier.
|
||||
return new Carrier(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorFullInit() {
|
||||
// Single header+final barrier.
|
||||
return new Carrier(true);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,114 @@
|
||||
/*
|
||||
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8333791
|
||||
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
|
||||
* @requires vm.gc.Parallel
|
||||
* @requires vm.compiler2.enabled
|
||||
* @summary Check stable field folding and barriers
|
||||
* @modules java.base/jdk.internal.vm.annotation
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.irTests.stable.StablePrimPlainTest
|
||||
*/
|
||||
|
||||
package compiler.c2.irTests.stable;
|
||||
|
||||
import compiler.lib.ir_framework.*;
|
||||
import jdk.test.lib.Asserts;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
public class StablePrimPlainTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestFramework tf = new TestFramework();
|
||||
tf.addTestClassesToBootClassPath();
|
||||
tf.addFlags(
|
||||
"-XX:+UnlockExperimentalVMOptions",
|
||||
"-XX:CompileThreshold=100",
|
||||
"-XX:-TieredCompilation",
|
||||
"-XX:+UseParallelGC"
|
||||
);
|
||||
tf.start();
|
||||
}
|
||||
|
||||
static class Carrier {
|
||||
@Stable
|
||||
int field;
|
||||
|
||||
@ForceInline
|
||||
public Carrier(boolean init) {
|
||||
if (init) {
|
||||
field = 42;
|
||||
}
|
||||
}
|
||||
|
||||
@ForceInline
|
||||
public void init() {
|
||||
field = 42;
|
||||
}
|
||||
}
|
||||
|
||||
static final Carrier BLANK_CARRIER = new Carrier(false);
|
||||
static final Carrier INIT_CARRIER = new Carrier(true);
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, "1" })
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static int testNoFold() {
|
||||
// Access should not be folded.
|
||||
// No barriers expected for plain fields.
|
||||
return BLANK_CARRIER.field;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
|
||||
static int testFold() {
|
||||
// Access should be completely folded.
|
||||
return INIT_CARRIER.field;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorBlankInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorFullInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static void testMethodInit() {
|
||||
// Primitive inits have no membars.
|
||||
INIT_CARRIER.init();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,114 @@
|
||||
/*
|
||||
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8333791
|
||||
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
|
||||
* @requires vm.gc.Parallel
|
||||
* @requires vm.compiler2.enabled
|
||||
* @summary Check stable field folding and barriers
|
||||
* @modules java.base/jdk.internal.vm.annotation
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.irTests.stable.StablePrimVolatileTest
|
||||
*/
|
||||
|
||||
package compiler.c2.irTests.stable;
|
||||
|
||||
import compiler.lib.ir_framework.*;
|
||||
import jdk.test.lib.Asserts;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
public class StablePrimVolatileTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestFramework tf = new TestFramework();
|
||||
tf.addTestClassesToBootClassPath();
|
||||
tf.addFlags(
|
||||
"-XX:+UnlockExperimentalVMOptions",
|
||||
"-XX:CompileThreshold=100",
|
||||
"-XX:-TieredCompilation",
|
||||
"-XX:+UseParallelGC"
|
||||
);
|
||||
tf.start();
|
||||
}
|
||||
|
||||
static class Carrier {
|
||||
@Stable
|
||||
volatile int field;
|
||||
|
||||
@ForceInline
|
||||
public Carrier(boolean init) {
|
||||
if (init) {
|
||||
field = 42;
|
||||
}
|
||||
}
|
||||
|
||||
@ForceInline
|
||||
public void init() {
|
||||
field = 42;
|
||||
}
|
||||
}
|
||||
|
||||
static final Carrier BLANK_CARRIER = new Carrier(false);
|
||||
static final Carrier INIT_CARRIER = new Carrier(true);
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, "1" })
|
||||
@IR(counts = { IRNode.MEMBAR, ">0" })
|
||||
static int testNoFold() {
|
||||
// Access should not be folded.
|
||||
// Barriers expected for volatile fields.
|
||||
return BLANK_CARRIER.field;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
|
||||
static int testFold() {
|
||||
// Access should be completely folded.
|
||||
return INIT_CARRIER.field;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorBlankInit() {
|
||||
// Expect only the header barrier.
|
||||
return new Carrier(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR, ">0" })
|
||||
static Carrier testConstructorFullInit() {
|
||||
// Volatile barriers expected.
|
||||
return new Carrier(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR, ">0" })
|
||||
static void testMethodInit() {
|
||||
// Volatile barriers expected.
|
||||
INIT_CARRIER.init();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,179 @@
|
||||
/*
|
||||
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8333791
|
||||
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
|
||||
* @requires vm.gc.Parallel
|
||||
* @requires vm.compiler2.enabled
|
||||
* @summary Check stable field folding and barriers
|
||||
* @modules java.base/jdk.internal.vm.annotation
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.irTests.stable.StableRefArrayTest
|
||||
*/
|
||||
|
||||
package compiler.c2.irTests.stable;
|
||||
|
||||
import compiler.lib.ir_framework.*;
|
||||
import jdk.test.lib.Asserts;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
public class StableRefArrayTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestFramework tf = new TestFramework();
|
||||
tf.addTestClassesToBootClassPath();
|
||||
tf.addFlags(
|
||||
"-XX:+UnlockExperimentalVMOptions",
|
||||
"-XX:CompileThreshold=100",
|
||||
"-XX:-TieredCompilation",
|
||||
"-XX:+UseParallelGC"
|
||||
);
|
||||
tf.start();
|
||||
}
|
||||
|
||||
static final Integer[] EMPTY_INTEGER = new Integer[] { null };
|
||||
static final Integer[] FULL_INTEGER = new Integer[] { 42 };
|
||||
|
||||
static class Carrier {
|
||||
@Stable
|
||||
Integer[] field;
|
||||
|
||||
@ForceInline
|
||||
public Carrier(int initLevel) {
|
||||
switch (initLevel) {
|
||||
case 0:
|
||||
// Do nothing.
|
||||
break;
|
||||
case 1:
|
||||
field = EMPTY_INTEGER;
|
||||
break;
|
||||
case 2:
|
||||
field = FULL_INTEGER;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Unknown level");
|
||||
}
|
||||
}
|
||||
|
||||
@ForceInline
|
||||
public void initEmpty() {
|
||||
field = EMPTY_INTEGER;
|
||||
}
|
||||
|
||||
@ForceInline
|
||||
public void initFull() {
|
||||
field = FULL_INTEGER;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static final Carrier BLANK_CARRIER = new Carrier(0);
|
||||
static final Carrier INIT_EMPTY_CARRIER = new Carrier(1);
|
||||
static final Carrier INIT_FULL_CARRIER = new Carrier(2);
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, ">0" })
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static int testNoFold() {
|
||||
// Access should not be folded.
|
||||
// No barriers expected for plain fields.
|
||||
Integer[] is = BLANK_CARRIER.field;
|
||||
if (is != null) {
|
||||
Integer i = is[0];
|
||||
if (i != null) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, ">0" })
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static int testPartialFold() {
|
||||
// Access should not be folded.
|
||||
// No barriers expected for plain fields.
|
||||
Integer[] is = INIT_EMPTY_CARRIER.field;
|
||||
if (is != null) {
|
||||
Integer i = is[0];
|
||||
if (i != null) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
|
||||
static int testFold() {
|
||||
// Access should be completely folded.
|
||||
Integer[] is = INIT_FULL_CARRIER.field;
|
||||
if (is != null) {
|
||||
Integer i = is[0];
|
||||
if (i != null) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorBlankInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorEmptyInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorFullInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static void testMethodEmptyInit() {
|
||||
// Reference inits do not have membars.
|
||||
INIT_EMPTY_CARRIER.initEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static void testMethodFullInit() {
|
||||
// Reference inits do not have membars.
|
||||
INIT_FULL_CARRIER.initFull();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8333791
|
||||
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
|
||||
* @requires vm.gc.Parallel
|
||||
* @requires vm.compiler2.enabled
|
||||
* @summary Check stable field folding and barriers
|
||||
* @modules java.base/jdk.internal.vm.annotation
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.irTests.stable.StableRefFinalTest
|
||||
*/
|
||||
|
||||
package compiler.c2.irTests.stable;
|
||||
|
||||
import compiler.lib.ir_framework.*;
|
||||
import jdk.test.lib.Asserts;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
public class StableRefFinalTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestFramework tf = new TestFramework();
|
||||
tf.addTestClassesToBootClassPath();
|
||||
tf.addFlags(
|
||||
"-XX:+UnlockExperimentalVMOptions",
|
||||
"-XX:CompileThreshold=100",
|
||||
"-XX:-TieredCompilation",
|
||||
"-XX:+UseParallelGC"
|
||||
);
|
||||
tf.start();
|
||||
}
|
||||
|
||||
static final Integer INTEGER = 42;
|
||||
|
||||
static class Carrier {
|
||||
@Stable
|
||||
final Integer field;
|
||||
|
||||
@ForceInline
|
||||
public Carrier(boolean init) {
|
||||
field = init ? INTEGER : null;
|
||||
}
|
||||
}
|
||||
|
||||
static final Carrier BLANK_CARRIER = new Carrier(false);
|
||||
static final Carrier INIT_CARRIER = new Carrier(true);
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, ">0" })
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static int testNoFold() {
|
||||
// Access should not be folded.
|
||||
// No barriers expected for plain fields.
|
||||
Integer i = BLANK_CARRIER.field;
|
||||
return i != null ? i : 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
|
||||
static int testFold() {
|
||||
// Access should be completely folded.
|
||||
Integer i = INIT_CARRIER.field;
|
||||
return i != null ? i : 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorInit() {
|
||||
// Only the header+final barrier.
|
||||
return new Carrier(true);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8333791
|
||||
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
|
||||
* @requires vm.gc.Parallel
|
||||
* @requires vm.compiler2.enabled
|
||||
* @summary Check stable field folding and barriers
|
||||
* @modules java.base/jdk.internal.vm.annotation
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.irTests.stable.StableRefPlainTest
|
||||
*/
|
||||
|
||||
package compiler.c2.irTests.stable;
|
||||
|
||||
import compiler.lib.ir_framework.*;
|
||||
import jdk.test.lib.Asserts;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
public class StableRefPlainTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestFramework tf = new TestFramework();
|
||||
tf.addTestClassesToBootClassPath();
|
||||
tf.addFlags(
|
||||
"-XX:+UnlockExperimentalVMOptions",
|
||||
"-XX:CompileThreshold=100",
|
||||
"-XX:-TieredCompilation",
|
||||
"-XX:+UseParallelGC"
|
||||
);
|
||||
tf.start();
|
||||
}
|
||||
|
||||
static final Integer INTEGER = 42;
|
||||
|
||||
static class Carrier {
|
||||
@Stable
|
||||
Integer field;
|
||||
|
||||
@ForceInline
|
||||
public Carrier(boolean init) {
|
||||
if (init) {
|
||||
field = INTEGER;
|
||||
}
|
||||
}
|
||||
|
||||
@ForceInline
|
||||
public void init() {
|
||||
field = INTEGER;
|
||||
}
|
||||
}
|
||||
|
||||
static final Carrier BLANK_CARRIER = new Carrier(false);
|
||||
static final Carrier INIT_CARRIER = new Carrier(true);
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, ">0" })
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static int testNoFold() {
|
||||
// Access should not be folded.
|
||||
// No barriers expected for plain fields.
|
||||
Integer i = BLANK_CARRIER.field;
|
||||
return i != null ? i : 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
|
||||
static int testFold() {
|
||||
// Access should be completely folded.
|
||||
Integer i = INIT_CARRIER.field;
|
||||
return i != null ? i : 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorBlankInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorFullInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.MEMBAR })
|
||||
static void testMethodInit() {
|
||||
// Reference inits do not have membars.
|
||||
INIT_CARRIER.init();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8333791
|
||||
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
|
||||
* @requires vm.gc.Parallel
|
||||
* @requires vm.compiler2.enabled
|
||||
* @summary Check stable field folding and barriers
|
||||
* @modules java.base/jdk.internal.vm.annotation
|
||||
* @library /test/lib /
|
||||
* @run driver compiler.c2.irTests.stable.StableRefVolatileTest
|
||||
*/
|
||||
|
||||
package compiler.c2.irTests.stable;
|
||||
|
||||
import compiler.lib.ir_framework.*;
|
||||
import jdk.test.lib.Asserts;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
public class StableRefVolatileTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
TestFramework tf = new TestFramework();
|
||||
tf.addTestClassesToBootClassPath();
|
||||
tf.addFlags(
|
||||
"-XX:+UnlockExperimentalVMOptions",
|
||||
"-XX:CompileThreshold=100",
|
||||
"-XX:-TieredCompilation",
|
||||
"-XX:+UseParallelGC"
|
||||
);
|
||||
tf.start();
|
||||
}
|
||||
|
||||
static final Integer INTEGER = 42;
|
||||
|
||||
static class Carrier {
|
||||
@Stable
|
||||
volatile Integer field;
|
||||
|
||||
@ForceInline
|
||||
public Carrier(boolean init) {
|
||||
if (init) {
|
||||
field = INTEGER;
|
||||
}
|
||||
}
|
||||
|
||||
@ForceInline
|
||||
public void init() {
|
||||
field = INTEGER;
|
||||
}
|
||||
}
|
||||
|
||||
static final Carrier BLANK_CARRIER = new Carrier(false);
|
||||
static final Carrier INIT_CARRIER = new Carrier(true);
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.LOAD, ">0" })
|
||||
@IR(counts = { IRNode.MEMBAR, ">0" })
|
||||
static int testNoFold() {
|
||||
// Access should not be folded.
|
||||
// Barriers are expected for volatile field.
|
||||
Integer i = BLANK_CARRIER.field;
|
||||
return i != null ? i : 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
|
||||
static int testFold() {
|
||||
// Access should be completely folded.
|
||||
Integer i = INIT_CARRIER.field;
|
||||
return i != null ? i : 0;
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
|
||||
static Carrier testConstructorBlankInit() {
|
||||
// Only the header barrier.
|
||||
return new Carrier(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR, ">0" })
|
||||
static Carrier testConstructorFullInit() {
|
||||
// Volatile writes, expect more barriers.
|
||||
return new Carrier(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@IR(counts = { IRNode.MEMBAR, ">0" })
|
||||
static void testMethodInit() {
|
||||
// Barriers are expected for volatile fields.
|
||||
INIT_CARRIER.init();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8337066
|
||||
* @summary Test that MergeMem is skipped when looking for stores
|
||||
* @run main/othervm -Xbatch -XX:-TieredCompilation
|
||||
* -XX:CompileCommand=compileonly,java.lang.StringUTF16::reverse
|
||||
* compiler.controldependency.TestAntiDependencyForPinnedLoads
|
||||
*/
|
||||
|
||||
package compiler.controldependency;
|
||||
|
||||
public class TestAntiDependencyForPinnedLoads {
|
||||
public static void main(String[] args) {
|
||||
for(int i = 0; i < 50_000; i++) {
|
||||
String str = "YYYY年MM月DD日";
|
||||
StringBuffer strBuffer = new StringBuffer(str);
|
||||
String revStr = strBuffer.reverse().toString();
|
||||
if (!revStr.equals("日DD月MM年YYYY")) throw new InternalError("FAIL");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8335709
|
||||
* @summary C2: assert(!loop->is_member(get_loop(useblock))) failed: must be outside loop
|
||||
* @library /test/lib
|
||||
* @run main/othervm -Xcomp -XX:CompileCommand=compileonly,InfiniteLoopBadControlNeverBranch::* InfiniteLoopBadControlNeverBranch
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
import jdk.test.lib.Utils;
|
||||
|
||||
public class InfiniteLoopBadControlNeverBranch {
|
||||
static int b;
|
||||
static short c;
|
||||
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
Thread thread = new Thread(() -> test());
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
Thread.sleep(Utils.adjustTimeout(4000));
|
||||
}
|
||||
|
||||
static void test() {
|
||||
int i = 0;
|
||||
while (true) {
|
||||
if (i > 1) {
|
||||
b = 0;
|
||||
}
|
||||
c = (short) (b * 7);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Copyright (c) 2024, Red Hat, Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8340214
|
||||
* @summary C2 compilation asserts with "no node with a side effect" in PhaseIdealLoop::try_sink_out_of_loop
|
||||
*
|
||||
* @run main/othervm -XX:-BackgroundCompilation TestBadMemSliceWithInterfaces
|
||||
*
|
||||
*/
|
||||
|
||||
public class TestBadMemSliceWithInterfaces {
|
||||
public static void main(String[] args) {
|
||||
B b = new B();
|
||||
C c = new C();
|
||||
for (int i = 0; i < 20_000; i++) {
|
||||
test1(b, c, true);
|
||||
test1(b, c, false);
|
||||
b.field = 0;
|
||||
c.field = 0;
|
||||
int res = test2(b, c, true);
|
||||
if (res != 42) {
|
||||
throw new RuntimeException("incorrect result " + res);
|
||||
}
|
||||
res = test2(b, c, false);
|
||||
if (res != 42) {
|
||||
throw new RuntimeException("incorrect result " + res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void test1(B b, C c, boolean flag) {
|
||||
A a;
|
||||
if (flag) {
|
||||
a = b;
|
||||
} else {
|
||||
a = c;
|
||||
}
|
||||
for (int i = 0; i < 1000; i++) {
|
||||
a.field = 42;
|
||||
}
|
||||
}
|
||||
|
||||
private static int test2(B b, C c, boolean flag) {
|
||||
A a;
|
||||
if (flag) {
|
||||
a = b;
|
||||
} else {
|
||||
a = c;
|
||||
}
|
||||
int v = 0;
|
||||
for (int i = 0; i < 2; i++) {
|
||||
v += a.field;
|
||||
a.field = 42;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
interface I {
|
||||
void m();
|
||||
}
|
||||
|
||||
static class A {
|
||||
int field;
|
||||
}
|
||||
|
||||
static class B extends A implements I {
|
||||
@Override
|
||||
public void m() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static class C extends A implements I {
|
||||
@Override
|
||||
public void m() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -27,6 +27,7 @@ package gc.arguments;
|
||||
* @test TestParallelGCErgo
|
||||
* @bug 8272364
|
||||
* @requires vm.gc.Parallel
|
||||
* @requires vm.opt.UseLargePages == null | !vm.opt.UseLargePages
|
||||
* @summary Verify ParallelGC minimum young and old ergonomics are setup correctly
|
||||
* @modules java.base/jdk.internal.misc
|
||||
* @library /test/lib
|
||||
|
||||
@ -22,14 +22,37 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @test VMOptionWarningExperimental
|
||||
* @bug 8027314
|
||||
* @summary Warn if diagnostic or experimental vm option is used and -XX:+UnlockDiagnosticVMOptions or -XX:+UnlockExperimentalVMOptions, respectively, isn't specified. Warn if develop vm option is used with product version of VM.
|
||||
* @summary Warn if experimental vm option is used and -XX:+UnlockExperimentalVMOptions isn't specified.
|
||||
* @requires vm.flagless
|
||||
* @requires ! vm.opt.final.UnlockExperimentalVMOptions
|
||||
* @library /test/lib
|
||||
* @modules java.base/jdk.internal.misc
|
||||
* java.management
|
||||
* @run driver VMOptionWarning
|
||||
* @run driver VMOptionWarning Experimental
|
||||
*/
|
||||
|
||||
/* @test VMOptionWarningDiagnostic
|
||||
* @bug 8027314
|
||||
* @summary Warn if diagnostic vm option is used and -XX:+UnlockDiagnosticVMOptions isn't specified.
|
||||
* @requires vm.flagless
|
||||
* @requires ! vm.debug
|
||||
* @library /test/lib
|
||||
* @modules java.base/jdk.internal.misc
|
||||
* java.management
|
||||
* @run driver VMOptionWarning Diagnostic
|
||||
*/
|
||||
|
||||
/* @test VMOptionWarningDevelop
|
||||
* @bug 8027314
|
||||
* @summary Warn if develop vm option is used with product version of VM.
|
||||
* @requires vm.flagless
|
||||
* @requires ! vm.debug
|
||||
* @library /test/lib
|
||||
* @modules java.base/jdk.internal.misc
|
||||
* java.management
|
||||
* @run driver VMOptionWarning Develop
|
||||
*/
|
||||
|
||||
import jdk.test.lib.process.ProcessTools;
|
||||
@ -38,24 +61,37 @@ import jdk.test.lib.Platform;
|
||||
|
||||
public class VMOptionWarning {
|
||||
public static void main(String[] args) throws Exception {
|
||||
ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+AlwaysSafeConstructors", "-version");
|
||||
OutputAnalyzer output = new OutputAnalyzer(pb.start());
|
||||
output.shouldNotHaveExitValue(0);
|
||||
output.shouldContain("Error: VM option 'AlwaysSafeConstructors' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions.");
|
||||
|
||||
if (Platform.isDebugBuild()) {
|
||||
System.out.println("Skip the rest of the tests on debug builds since diagnostic, and develop options are available on debug builds.");
|
||||
return;
|
||||
if (args.length != 1) {
|
||||
throw new RuntimeException("wrong number of args: " + args.length);
|
||||
}
|
||||
|
||||
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+PrintInlining", "-version");
|
||||
output = new OutputAnalyzer(pb.start());
|
||||
output.shouldNotHaveExitValue(0);
|
||||
output.shouldContain("Error: VM option 'PrintInlining' is diagnostic and must be enabled via -XX:+UnlockDiagnosticVMOptions.");
|
||||
|
||||
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+VerifyStack", "-version");
|
||||
output = new OutputAnalyzer(pb.start());
|
||||
output.shouldNotHaveExitValue(0);
|
||||
output.shouldContain("Error: VM option 'VerifyStack' is develop and is available only in debug version of VM.");
|
||||
ProcessBuilder pb;
|
||||
OutputAnalyzer output;
|
||||
switch (args[0]) {
|
||||
case "Experimental": {
|
||||
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+AlwaysSafeConstructors", "-version");
|
||||
output = new OutputAnalyzer(pb.start());
|
||||
output.shouldNotHaveExitValue(0);
|
||||
output.shouldContain("Error: VM option 'AlwaysSafeConstructors' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions.");
|
||||
break;
|
||||
}
|
||||
case "Diagnostic": {
|
||||
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+PrintInlining", "-version");
|
||||
output = new OutputAnalyzer(pb.start());
|
||||
output.shouldNotHaveExitValue(0);
|
||||
output.shouldContain("Error: VM option 'PrintInlining' is diagnostic and must be enabled via -XX:+UnlockDiagnosticVMOptions.");
|
||||
break;
|
||||
}
|
||||
case "Develop": {
|
||||
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+VerifyStack", "-version");
|
||||
output = new OutputAnalyzer(pb.start());
|
||||
output.shouldNotHaveExitValue(0);
|
||||
output.shouldContain("Error: VM option 'VerifyStack' is develop and is available only in debug version of VM.");
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
throw new RuntimeException("Invalid argument: " + args[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,6 +31,7 @@
|
||||
* java.management
|
||||
* @compile C.java
|
||||
* @run driver Bad_NCDFE_Msg
|
||||
*/
|
||||
|
||||
import java.io.File;
|
||||
import jdk.test.lib.process.ProcessTools;
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8337622
|
||||
* @summary (reflect) java.lang.Class componentType field not found.
|
||||
* @library /test/lib
|
||||
* @modules java.base/java.lang:open
|
||||
* @run main ComponentTypeFieldTest
|
||||
*/
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import static jdk.test.lib.Asserts.*;
|
||||
|
||||
public class ComponentTypeFieldTest {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
Field f = Class.class.getDeclaredField("componentType");
|
||||
f.setAccessible(true);
|
||||
Object val = f.get(Runnable.class);
|
||||
assertTrue(val == null);
|
||||
System.out.println("val is " + val);
|
||||
|
||||
Object arrayVal = f.get(Integer[].class);
|
||||
System.out.println("val is " + arrayVal);
|
||||
String arrayValString = arrayVal.toString();
|
||||
assertTrue(arrayValString.equals("class java.lang.Integer"));
|
||||
}
|
||||
}
|
||||
@ -375,7 +375,7 @@ java/awt/Modal/MultipleDialogs/MultipleDialogs3Test.java 8198665 macosx-all
|
||||
java/awt/Modal/MultipleDialogs/MultipleDialogs4Test.java 8198665 macosx-all
|
||||
java/awt/Modal/MultipleDialogs/MultipleDialogs5Test.java 8198665 macosx-all
|
||||
java/awt/Mouse/EnterExitEvents/DragWindowOutOfFrameTest.java 8177326 macosx-all
|
||||
java/awt/Mouse/EnterExitEvents/ResizingFrameTest.java 8005021 macosx-all
|
||||
java/awt/Mouse/EnterExitEvents/ResizingFrameTest.java 8005021,8332158 macosx-all,linux-x64
|
||||
java/awt/Mouse/EnterExitEvents/FullscreenEnterEventTest.java 8051455 macosx-all
|
||||
java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Standard.java 7124407,8302787 macosx-all,windows-all
|
||||
java/awt/Mouse/RemovedComponentMouseListener/RemovedComponentMouseListener.java 8157170 macosx-all
|
||||
@ -470,6 +470,11 @@ sun/java2d/DirectX/OnScreenRenderingResizeTest/OnScreenRenderingResizeTest.java
|
||||
java/awt/Window/8159168/SetShapeTest.java 8274106 macosx-aarch64
|
||||
java/awt/image/multiresolution/MultiResolutionJOptionPaneIconTest.java 8274106 macosx-aarch64
|
||||
|
||||
# Wayland related
|
||||
|
||||
java/awt/FullScreen/FullscreenWindowProps/FullscreenWindowProps.java 8280991 linux-x64
|
||||
java/awt/FullScreen/SetFullScreenTest.java 8332155 linux-x64
|
||||
|
||||
############################################################################
|
||||
|
||||
# jdk_beans
|
||||
@ -611,7 +616,7 @@ com/sun/security/sasl/gsskerb/NoSecurityLayer.java 8039280 generic-
|
||||
sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.java 8039280 generic-all
|
||||
sun/security/provider/PolicyParser/PrincipalExpansionError.java 8039280 generic-all
|
||||
|
||||
sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183,8333317 generic-all
|
||||
sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183 linux-ppc64le
|
||||
|
||||
############################################################################
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@ import java.util.zip.ZipInputStream;
|
||||
* @bug 8226346
|
||||
* @summary Check all output files for absolute path fragments
|
||||
* @requires !vm.debug
|
||||
* @run main AbsPathsInImage
|
||||
* @run main/othervm -Xmx900m AbsPathsInImage
|
||||
*/
|
||||
public class AbsPathsInImage {
|
||||
|
||||
|
||||
@ -101,8 +101,10 @@ class InterruptHangTarg {
|
||||
for (int ii = 0; ii < INTERRUPTS_EXPECTED; ii++) {
|
||||
boolean wasInterrupted = false;
|
||||
try {
|
||||
// Give other thread a chance to interrupt
|
||||
Thread.sleep(100);
|
||||
// Give other thread a chance to interrupt. Normally only a very short
|
||||
// sleep is needed, but we need to account for unexpected delays in
|
||||
// the interrupt due to machine and network hiccups.
|
||||
Thread.sleep(10*1000);
|
||||
} catch (InterruptedException ee) {
|
||||
answer++;
|
||||
wasInterrupted = true;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,36 +25,36 @@
|
||||
* @test
|
||||
* @bug 8251496
|
||||
* @summary Tests for methods in Authenticator
|
||||
* @run testng/othervm AuthenticatorTest
|
||||
* @run junit AuthenticatorTest
|
||||
*/
|
||||
|
||||
import com.sun.net.httpserver.Authenticator;
|
||||
import com.sun.net.httpserver.BasicAuthenticator;
|
||||
import com.sun.net.httpserver.HttpPrincipal;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
|
||||
public class AuthenticatorTest {
|
||||
@Test
|
||||
public void testFailure() {
|
||||
var failureResult = new Authenticator.Failure(666);
|
||||
assertEquals(failureResult.getResponseCode(), 666);
|
||||
assertEquals(666, failureResult.getResponseCode());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRetry() {
|
||||
var retryResult = new Authenticator.Retry(333);
|
||||
assertEquals(retryResult.getResponseCode(), 333);
|
||||
assertEquals(333, retryResult.getResponseCode());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void TestSuccess() {
|
||||
public void testSuccess() {
|
||||
var principal = new HttpPrincipal("test", "123");
|
||||
var successResult = new Authenticator.Success(principal);
|
||||
assertEquals(successResult.getPrincipal(), principal);
|
||||
assertEquals("test", principal.getName());
|
||||
assertEquals(principal, successResult.getPrincipal());
|
||||
assertEquals("test", principal.getUsername());
|
||||
assertEquals("123", principal.getRealm());
|
||||
}
|
||||
}
|
||||
@ -50,7 +50,7 @@ import jtreg.SkippedException;
|
||||
|
||||
public class MaximizeUndecoratedTest {
|
||||
private static final int SIZE = 300;
|
||||
private static final int OFFSET = 2;
|
||||
private static final int OFFSET = 5;
|
||||
|
||||
private static Frame frame;
|
||||
private static Robot robot;
|
||||
|
||||
@ -24,6 +24,7 @@
|
||||
import java.awt.AWTException;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Font;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.GraphicsDevice;
|
||||
@ -44,6 +45,7 @@ import java.awt.image.RenderedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
@ -69,6 +71,7 @@ import javax.swing.JScrollPane;
|
||||
import javax.swing.JSplitPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.Timer;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.text.JTextComponent;
|
||||
import javax.swing.text.html.HTMLEditorKit;
|
||||
import javax.swing.text.html.StyleSheet;
|
||||
@ -79,15 +82,77 @@ import static javax.swing.SwingUtilities.invokeAndWait;
|
||||
import static javax.swing.SwingUtilities.isEventDispatchThread;
|
||||
|
||||
/**
|
||||
* Provides a framework for manual tests to display test instructions and
|
||||
* Pass/Fail buttons.
|
||||
* A framework for manual tests to display test instructions and
|
||||
* <i>Pass</i> / <i>Fail</i> buttons. The framework automatically
|
||||
* creates a frame to display the instructions, provides buttons
|
||||
* to select the test result, and handles test timeout.
|
||||
*
|
||||
* <p id="timeOutTimer">
|
||||
* The instruction UI frame displays a timer at the top which indicates
|
||||
* how much time is left. The timer can be paused using the <i>Pause</i>
|
||||
* button to the right of the time; the title of the button changes to
|
||||
* <i>Resume</i>. To resume the timer, use the <i>Resume</i> button.
|
||||
*
|
||||
* <p id="instructionText">
|
||||
* In the center, the instruction UI frame displays instructions for the
|
||||
* tester. The instructions can be either plain text or HTML. If the
|
||||
* text of the instructions starts with {@code "<html>"}, the
|
||||
* instructions are displayed as HTML, as supported by Swing, which
|
||||
* provides richer formatting options.
|
||||
* <p>
|
||||
* Instructions for the user can be either plain text or HTML as supported
|
||||
* by Swing. If the instructions start with {@code <html>}, the
|
||||
* instructions are displayed as HTML.
|
||||
* The instructions are displayed in a text component with word-wrapping
|
||||
* so that there's no horizontal scroll bar. If the text doesn't fit, a
|
||||
* vertical scroll bar is shown. Use {@code rows} and {@code columns}
|
||||
* parameters to change the size of this text component.
|
||||
* If possible, choose the number of rows and columns so that
|
||||
* the instructions fit and no scroll bars are shown.
|
||||
*
|
||||
* <p id="passFailButtons">
|
||||
* At the bottom, the instruction UI frame displays the
|
||||
* <i>Pass</i> and <i>Fail</i> buttons. The tester clicks either <i>Pass</i>
|
||||
* or <i>Fail</i> button to finish the test. When the tester clicks the
|
||||
* <i>Fail</i> button, the framework displays a dialog box prompting for
|
||||
* a reason why the test fails. The tester enters the reason and clicks
|
||||
* <i>OK</i> to close the dialog and fail the test,
|
||||
* or simply closes the dialog to fail the test without providing any reason.
|
||||
*
|
||||
* <p id="screenCapture">
|
||||
* If you enable the screenshot feature, a <i>Screenshot</i> button is
|
||||
* added to the right of the <i>Fail</i> button. The tester can choose either
|
||||
* <i>Capture Full Screen</i> (default) or <i>Capture Frames</i> and click the
|
||||
* <i>Screenshot</i> button to take a screenshot.
|
||||
* If there are multiple screens, screenshots of each screen are created.
|
||||
* If the tester selects the <i>Capture Frames</i> mode, screenshots of all
|
||||
* the windows or frames registered in the {@code PassFailJFrame} framework
|
||||
* are created.
|
||||
*
|
||||
* <p id="logArea">
|
||||
* If you enable a log area, the instruction UI frame adds a text component
|
||||
* to display log messages below the buttons.
|
||||
* Use {@link #log(String) log}, {@link #logSet(String) logSet}
|
||||
* and {@link #logClear() logClear} static methods of {@code PassFailJFrame}
|
||||
* to add or clear messages from the log area.
|
||||
*
|
||||
* <p id="awaitTestResult">
|
||||
* After you create an instance of {@code PassFailJFrame}, call the
|
||||
* {@link #awaitAndCheck() awaitAndCheck} method to stop the current thread
|
||||
* (usually the main thread) and wait until the tester clicks
|
||||
* either <i>Pass</i> or <i>Fail</i> button,
|
||||
* or until the test times out.
|
||||
* <p>
|
||||
* The call to the {@code awaitAndCheck} method is usually the last
|
||||
* statement in the {@code main} method of your test.
|
||||
* If the test fails, an exception is thrown to signal the failure to jtreg.
|
||||
* The test fails if the tester clicks the <i>Fail</i> button,
|
||||
* if the timeout occurs,
|
||||
* or if any window or frame is closed.
|
||||
* <p>
|
||||
* Before returning from {@code awaitAndCheck}, the framework disposes of
|
||||
* all the windows and frames.
|
||||
*
|
||||
* <h2 id="sampleManualTest">Sample Manual Test</h2>
|
||||
* A simple test would look like this:
|
||||
* <pre>{@code
|
||||
* {@snippet id='sampleManualTestCode' lang='java':
|
||||
* public class SampleManualTest {
|
||||
* private static final String INSTRUCTIONS =
|
||||
* "Click Pass, or click Fail if the test failed.";
|
||||
@ -95,7 +160,7 @@ import static javax.swing.SwingUtilities.isEventDispatchThread;
|
||||
* public static void main(String[] args) throws Exception {
|
||||
* PassFailJFrame.builder()
|
||||
* .instructions(INSTRUCTIONS)
|
||||
* .testUI(() -> createTestUI())
|
||||
* .testUI(SampleManualTest::createTestUI)
|
||||
* .build()
|
||||
* .awaitAndCheck();
|
||||
* }
|
||||
@ -106,39 +171,87 @@ import static javax.swing.SwingUtilities.isEventDispatchThread;
|
||||
* return testUI;
|
||||
* }
|
||||
* }
|
||||
* }</pre>
|
||||
* }
|
||||
* <p>
|
||||
* The above example uses the {@link Builder Builder} to set the parameters of
|
||||
* the instruction frame. It is the recommended way.
|
||||
* The above example uses the {@link Builder Builder} class to set
|
||||
* the parameters of the instruction frame.
|
||||
* It is <em>the recommended way</em>.
|
||||
*
|
||||
* <p>
|
||||
* The framework will create instruction UI, it will call
|
||||
* the provided {@code createTestUI} on the Event Dispatch Thread (EDT),
|
||||
* and it will automatically position the test UI and make it visible.
|
||||
* The framework will create an instruction UI frame, it will call
|
||||
* the provided {@code createTestUI} on the Event Dispatch Thread (<dfn>EDT</dfn>),
|
||||
* and it will automatically position the test UI frame and make it visible.
|
||||
*
|
||||
* <p id="jtregTagsForTest">
|
||||
* Add the following jtreg tags before the test class declaration
|
||||
* {@snippet :
|
||||
* /*
|
||||
* * @test
|
||||
* * @summary Sample manual test
|
||||
* * @library /java/awt/regtesthelpers
|
||||
* * @build PassFailJFrame
|
||||
* * @run main/manual SampleManualTest
|
||||
* }
|
||||
* and the closing comment tag <code>*/</code>.
|
||||
* <p>
|
||||
* The {@code @library} tag points to the location of the
|
||||
* {@code PassFailJFrame} class in the source code;
|
||||
* the {@code @build} tag makes jtreg compile the {@code PassFailJFrame} class,
|
||||
* and finally the {@code @run} tag specifies it is a manual
|
||||
* test and the class to run.
|
||||
*
|
||||
* <h2 id="usingBuilder">Using {@code Builder}</h2>
|
||||
* Use methods of the {@link Builder Builder} class to set or change
|
||||
* parameters of {@code PassFailJFrame} and its instruction UI:
|
||||
* <ul>
|
||||
* <li>{@link Builder#title(String) title} sets
|
||||
* the title of the instruction UI
|
||||
* (the default is {@value #TITLE});</li>
|
||||
* <li>{@link Builder#testTimeOut(long) testTimeOut} sets
|
||||
* the timeout of the test
|
||||
* (the default is {@value #TEST_TIMEOUT});</li>
|
||||
* <li>{@link Builder#rows(int) rows} and
|
||||
* {@link Builder#columns(int) columns} control the size
|
||||
* the text component which displays the instructions
|
||||
* (the default number of rows is the number of lines in the text
|
||||
* of the instructions,
|
||||
* the default number of columns is {@value #COLUMNS});</li>
|
||||
* <li>{@link Builder#logArea() logArea} adds a log area;</li>
|
||||
* <li>{@link Builder#screenCapture() screenCapture}
|
||||
* enables screenshots.</li>
|
||||
* </ul>
|
||||
*
|
||||
* <h3 id="builderTestUI">Using {@code testUI} and {@code splitUI}</h3>
|
||||
* The {@code Builder.testUI} methods accept interfaces which create one window
|
||||
* or a list of windows if the test needs multiple windows,
|
||||
* or directly a single window, an array of windows or a list of windows.
|
||||
* <p>
|
||||
* For simple test UI, use {@code Builder.splitUI}, or explicitly
|
||||
* {@code Builder.splitUIRight} or {@code Builder.splitUIBottom} with
|
||||
* a {@code PanelCreator}. The framework will call the provided
|
||||
* {@code createUIPanel} to create the component with test UI and
|
||||
* For simple test UI, use {@link Builder#splitUI(PanelCreator) splitUI},
|
||||
* or explicitly
|
||||
* {@link Builder#splitUIRight(PanelCreator) splitUIRight} or
|
||||
* {@link Builder#splitUIBottom(PanelCreator) splitUIBottom} with
|
||||
* a {@link PanelCreator PanelCreator}.
|
||||
* The framework will call the provided
|
||||
* {@code createUIPanel} method to create the component with test UI and
|
||||
* will place it as the right or bottom component in a split pane
|
||||
* along with instruction UI.
|
||||
* <p>
|
||||
* Note: <em>support for multiple windows is incomplete</em>.
|
||||
*
|
||||
* <h2 id="obsoleteSampleTest">Obsolete Sample Test</h2>
|
||||
* Alternatively, use one of the {@code PassFailJFrame} constructors to
|
||||
* create an object, then create secondary test UI, register it
|
||||
* with {@code PassFailJFrame}, position it and make it visible.
|
||||
* The following sample demonstrates it:
|
||||
* <pre>{@code
|
||||
* public class SampleOldManualTest {
|
||||
* {@snippet id='obsoleteSampleTestCode' lang='java':
|
||||
* public class ObsoleteManualTest {
|
||||
* private static final String INSTRUCTIONS =
|
||||
* "Click Pass, or click Fail if the test failed.";
|
||||
*
|
||||
* public static void main(String[] args) throws Exception {
|
||||
* PassFailJFrame passFail = new PassFailJFrame(INSTRUCTIONS);
|
||||
*
|
||||
* SwingUtilities.invokeAndWait(() -> createTestUI());
|
||||
* SwingUtilities.invokeAndWait(ObsoleteManualTest::createTestUI);
|
||||
*
|
||||
* passFail.awaitAndCheck();
|
||||
* }
|
||||
@ -151,31 +264,54 @@ import static javax.swing.SwingUtilities.isEventDispatchThread;
|
||||
* testUI.setVisible(true);
|
||||
* }
|
||||
* }
|
||||
* }</pre>
|
||||
* }
|
||||
* <p>
|
||||
* Use methods of the {@code Builder} class or constructors of the
|
||||
* {@code PassFailJFrame} class to control other parameters:
|
||||
* <ul>
|
||||
* <li>the title of the instruction UI,</li>
|
||||
* <li>the timeout of the test,</li>
|
||||
* <li>the size of the instruction UI via rows and columns, and</li>
|
||||
* <li>to add a log area</li>,
|
||||
* <li>to enable screenshots.</li>
|
||||
* </ul>
|
||||
* This sample uses {@link #PassFailJFrame(String) a constructor} of
|
||||
* {@code PassFailJFrame} to create its instance,
|
||||
* there are several overloads provided which allow changing other parameters.
|
||||
* <p>
|
||||
* When you use the constructors, you have to explicitly create
|
||||
* your test UI window on EDT. After you create the window,
|
||||
* you need to register it with the framework using
|
||||
* {@link #addTestWindow(Window) addTestWindow}
|
||||
* to ensure the window is disposed of when the test completes.
|
||||
* Before showing the window, you have to call
|
||||
* {@link #positionTestWindow(Window, Position) positionTestWindow}
|
||||
* to position the test window near the instruction UI frame provided
|
||||
* by the framework. And finally you have to explicitly show the test UI
|
||||
* window by calling {@code setVisible(true)}.
|
||||
* <p>
|
||||
* To avoid the complexity, use the {@link Builder Builder} class
|
||||
* which provides a streamlined way to configure and create an
|
||||
* instance of {@code PassFailJFrame}.
|
||||
* <p>
|
||||
* Consider updating tests which use {@code PassFailJFrame} constructors to
|
||||
* use the builder pattern.
|
||||
*/
|
||||
public final class PassFailJFrame {
|
||||
|
||||
private static final String TITLE = "Test Instruction Frame";
|
||||
/** A default title for the instruction frame. */
|
||||
private static final String TITLE = "Test Instructions";
|
||||
|
||||
/** A default test timeout. */
|
||||
private static final long TEST_TIMEOUT = 5;
|
||||
|
||||
/** A default number of rows for displaying the test instructions. */
|
||||
private static final int ROWS = 10;
|
||||
/** A default number of columns for displaying the test instructions. */
|
||||
private static final int COLUMNS = 40;
|
||||
|
||||
/**
|
||||
* A gap between windows.
|
||||
*/
|
||||
public static final int WINDOW_GAP = 8;
|
||||
|
||||
/**
|
||||
* Prefix for the user-provided failure reason.
|
||||
*/
|
||||
private static final String FAILURE_REASON = "Failure Reason:\n";
|
||||
/**
|
||||
* The failure reason message when the user didn't provide one.
|
||||
* The failure reason message when the user doesn't provide one.
|
||||
*/
|
||||
private static final String EMPTY_REASON = "(no reason provided)";
|
||||
|
||||
@ -213,90 +349,172 @@ public final class PassFailJFrame {
|
||||
|
||||
public enum Position {HORIZONTAL, VERTICAL, TOP_LEFT_CORNER}
|
||||
|
||||
public PassFailJFrame(String instructions) throws InterruptedException,
|
||||
InvocationTargetException {
|
||||
/**
|
||||
* Constructs a frame which displays test instructions and
|
||||
* the <i>Pass</i> / <i>Fail</i> buttons with the given instructions, and
|
||||
* the default timeout of {@value #TEST_TIMEOUT} minutes,
|
||||
* the default title of {@value #TITLE} and
|
||||
* the default values of {@value #ROWS} and {@value #COLUMNS}
|
||||
* for rows and columns.
|
||||
* <p>
|
||||
* See {@link #PassFailJFrame(String,String,long,int,int,boolean)} for
|
||||
* more details.
|
||||
*
|
||||
* @param instructions the instructions for the tester
|
||||
*
|
||||
* @throws InterruptedException if the current thread is interrupted
|
||||
* while waiting for EDT to finish creating UI components
|
||||
* @throws InvocationTargetException if an exception is thrown while
|
||||
* creating UI components on EDT
|
||||
*/
|
||||
public PassFailJFrame(String instructions)
|
||||
throws InterruptedException, InvocationTargetException {
|
||||
this(instructions, TEST_TIMEOUT);
|
||||
}
|
||||
|
||||
public PassFailJFrame(String instructions, long testTimeOut) throws
|
||||
InterruptedException, InvocationTargetException {
|
||||
/**
|
||||
* Constructs a frame which displays test instructions and
|
||||
* the <i>Pass</i> / <i>Fail</i> buttons
|
||||
* with the given instructions and timeout as well as
|
||||
* the default title of {@value #TITLE}
|
||||
* and the default values of {@value #ROWS} and {@value #COLUMNS}
|
||||
* for rows and columns.
|
||||
* <p>
|
||||
* See {@link #PassFailJFrame(String,String,long,int,int,boolean)} for
|
||||
* more details.
|
||||
*
|
||||
* @param instructions the instructions for the tester
|
||||
* @param testTimeOut the test timeout in minutes
|
||||
*
|
||||
* @throws InterruptedException if the current thread is interrupted
|
||||
* while waiting for EDT to finish creating UI components
|
||||
* @throws InvocationTargetException if an exception is thrown while
|
||||
* creating UI components on EDT
|
||||
*/
|
||||
public PassFailJFrame(String instructions, long testTimeOut)
|
||||
throws InterruptedException, InvocationTargetException {
|
||||
this(TITLE, instructions, testTimeOut);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a frame which displays test instructions and
|
||||
* the <i>Pass</i> / <i>Fail</i> buttons
|
||||
* with the given title, instructions and timeout as well as
|
||||
* the default values of {@value #ROWS} and {@value #COLUMNS}
|
||||
* for rows and columns.
|
||||
* The screenshot feature is not enabled, if you use this constructor.
|
||||
* <p>
|
||||
* See {@link #PassFailJFrame(String,String,long,int,int,boolean)} for
|
||||
* more details.
|
||||
*
|
||||
* @param title the title of the instruction frame
|
||||
* @param instructions the instructions for the tester
|
||||
* @param testTimeOut the test timeout in minutes
|
||||
*
|
||||
* @throws InterruptedException if the current thread is interrupted
|
||||
* while waiting for EDT to finish creating UI components
|
||||
* @throws InvocationTargetException if an exception is thrown while
|
||||
* creating UI components on EDT
|
||||
*/
|
||||
public PassFailJFrame(String title, String instructions,
|
||||
long testTimeOut) throws InterruptedException,
|
||||
InvocationTargetException {
|
||||
long testTimeOut)
|
||||
throws InterruptedException, InvocationTargetException {
|
||||
this(title, instructions, testTimeOut, ROWS, COLUMNS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a JFrame with a given title & serves as test instructional
|
||||
* frame where the user follows the specified test instruction in order
|
||||
* to test the test case & mark the test pass or fail. If the expected
|
||||
* result is seen then the user click on the 'Pass' button else click
|
||||
* on the 'Fail' button and the reason for the failure should be
|
||||
* specified in the JDialog JTextArea.
|
||||
* Constructs a frame which displays test instructions and
|
||||
* the <i>Pass</i> / <i>Fail</i> buttons
|
||||
* with the given title, instructions, timeout, number of rows and columns.
|
||||
* The screenshot feature is not enabled, if you use this constructor.
|
||||
* <p>
|
||||
* See {@link #PassFailJFrame(String,String,long,int,int,boolean)} for
|
||||
* more details.
|
||||
*
|
||||
* @param title title of the Frame.
|
||||
* @param instructions the instruction for the tester on how to test
|
||||
* and what is expected (pass) and what is not
|
||||
* expected (fail).
|
||||
* @param testTimeOut test timeout where time is specified in minutes.
|
||||
* @param rows number of visible rows of the JTextArea where the
|
||||
* instruction is show.
|
||||
* @param columns Number of columns of the instructional
|
||||
* JTextArea
|
||||
* @throws InterruptedException exception thrown when thread is
|
||||
* interrupted
|
||||
* @param title the title of the instruction frame
|
||||
* @param instructions the instructions for the tester
|
||||
* @param testTimeOut the test timeout in minutes
|
||||
* @param rows the number of rows for the text component
|
||||
* which displays test instructions
|
||||
* @param columns the number of columns for the text component
|
||||
* which displays test instructions
|
||||
*
|
||||
* @throws InterruptedException if the current thread is interrupted
|
||||
* while waiting for EDT to finish creating UI components
|
||||
* @throws InvocationTargetException if an exception is thrown while
|
||||
* creating the test instruction frame on
|
||||
* EDT
|
||||
* creating UI components on EDT
|
||||
*/
|
||||
public PassFailJFrame(String title, String instructions, long testTimeOut,
|
||||
int rows, int columns) throws InterruptedException,
|
||||
InvocationTargetException {
|
||||
public PassFailJFrame(String title, String instructions,
|
||||
long testTimeOut,
|
||||
int rows, int columns)
|
||||
throws InterruptedException, InvocationTargetException {
|
||||
this(title, instructions, testTimeOut, rows, columns, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a JFrame with a given title & serves as test instructional
|
||||
* frame where the user follows the specified test instruction in order
|
||||
* to test the test case & mark the test pass or fail. If the expected
|
||||
* result is seen then the user click on the 'Pass' button else click
|
||||
* on the 'Fail' button and the reason for the failure should be
|
||||
* specified in the JDialog JTextArea.
|
||||
* Constructs a frame which displays test instructions and
|
||||
* the <i>Pass</i> / <i>Fail</i> buttons
|
||||
* as well as supporting UI components with the given title, instructions,
|
||||
* timeout, number of rows and columns,
|
||||
* and screen capture functionality.
|
||||
* All the UI components are created on the EDT, so it is safe to call
|
||||
* the constructor on the main thread.
|
||||
* <p>
|
||||
* The test instruction frame also provides a way for the tester to take
|
||||
* a screenshot (full screen or individual frame) if this feature
|
||||
* is enabled by passing {@code true} as {@code enableScreenCapture}
|
||||
* parameter.
|
||||
* After you create a test UI window, register the window using
|
||||
* {@link #addTestWindow(Window) addTestWindow} for disposal, and
|
||||
* position it close to the instruction frame using
|
||||
* {@link #positionTestWindow(Window, Position) positionTestWindow}.
|
||||
* As the last step, make your test UI window visible.
|
||||
* <p>
|
||||
* Call the {@link #awaitAndCheck() awaitAndCheck} method on the instance
|
||||
* of {@code PassFailJFrame} when you set up the testing environment.
|
||||
* <p>
|
||||
* If the tester clicks the <i>Fail</i> button, a dialog prompting for
|
||||
* a description of the problem is displayed, and then an exception
|
||||
* is thrown which fails the test.
|
||||
* If the tester clicks the <i>Pass</i> button, the test completes
|
||||
* successfully.
|
||||
* If the timeout occurs or the instruction frame is closed,
|
||||
* the test fails.
|
||||
* <p>
|
||||
* The {@code rows} and {@code columns} parameters control
|
||||
* the size of a text component which displays the instructions.
|
||||
* The preferred size of the instructions is calculated by
|
||||
* creating {@code new JTextArea(rows, columns)}.
|
||||
* <p>
|
||||
* If you enable screenshots by setting the {@code screenCapture}
|
||||
* parameter to {@code true}, a <i>Screenshot</i> button is added.
|
||||
* Clicking the <i>Screenshot</i> button takes screenshots of
|
||||
* all the monitors or all the windows registered with
|
||||
* {@code PassFailJFrame}.
|
||||
*
|
||||
* @param title title of the Frame.
|
||||
* @param instructions the instruction for the tester on how to test
|
||||
* and what is expected (pass) and what is not
|
||||
* expected (fail).
|
||||
* @param testTimeOut test timeout where time is specified in minutes.
|
||||
* @param rows number of visible rows of the JTextArea where the
|
||||
* instruction is show.
|
||||
* @param columns Number of columns of the instructional
|
||||
* JTextArea
|
||||
* @param enableScreenCapture if set to true, 'Capture Screen' button & its
|
||||
* associated UIs are added to test instruction
|
||||
* frame
|
||||
* @throws InterruptedException exception thrown when thread is
|
||||
* interrupted
|
||||
* @param title the title of the instruction frame
|
||||
* @param instructions the instructions for the tester
|
||||
* @param testTimeOut the test timeout in minutes
|
||||
* @param rows the number of rows for the text component
|
||||
* which displays test instructions
|
||||
* @param columns the number of columns for the text component
|
||||
* which displays test instructions
|
||||
* @param screenCapture if set to {@code true}, enables screen capture
|
||||
* functionality
|
||||
*
|
||||
* @throws InterruptedException if the current thread is interrupted
|
||||
* while waiting for EDT to finish creating UI components
|
||||
* @throws InvocationTargetException if an exception is thrown while
|
||||
* creating the test instruction frame on
|
||||
* EDT
|
||||
* creating UI components on EDT
|
||||
*
|
||||
* @see JTextArea#JTextArea(int,int) JTextArea(int rows, int columns)
|
||||
* @see Builder Builder
|
||||
*/
|
||||
public PassFailJFrame(String title, String instructions, long testTimeOut,
|
||||
public PassFailJFrame(String title, String instructions,
|
||||
long testTimeOut,
|
||||
int rows, int columns,
|
||||
boolean enableScreenCapture)
|
||||
boolean screenCapture)
|
||||
throws InterruptedException, InvocationTargetException {
|
||||
invokeOnEDT(() -> createUI(title, instructions,
|
||||
testTimeOut,
|
||||
rows, columns,
|
||||
enableScreenCapture));
|
||||
screenCapture));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -349,11 +567,9 @@ public final class PassFailJFrame {
|
||||
builder.positionWindows
|
||||
.positionTestWindows(unmodifiableList(builder.testWindows),
|
||||
builder.instructionUIHandler));
|
||||
} else if (builder.testWindows.size() == 1) {
|
||||
} else {
|
||||
Window window = builder.testWindows.get(0);
|
||||
positionTestWindow(window, builder.position);
|
||||
} else {
|
||||
positionTestWindow(null, builder.position);
|
||||
}
|
||||
}
|
||||
showAllWindows();
|
||||
@ -448,6 +664,8 @@ public final class PassFailJFrame {
|
||||
boolean addLogArea,
|
||||
int logAreaRows) {
|
||||
JPanel main = new JPanel(new BorderLayout());
|
||||
main.setBorder(createFrameBorder());
|
||||
|
||||
timeoutHandlerPanel = new TimeoutHandlerPanel(testTimeOut);
|
||||
main.add(timeoutHandlerPanel, BorderLayout.NORTH);
|
||||
|
||||
@ -456,7 +674,11 @@ public final class PassFailJFrame {
|
||||
: configurePlainText(instructions, rows, columns);
|
||||
text.setEditable(false);
|
||||
|
||||
main.add(new JScrollPane(text), BorderLayout.CENTER);
|
||||
JPanel textPanel = new JPanel(new BorderLayout());
|
||||
textPanel.setBorder(createEmptyBorder(GAP, 0, GAP, 0));
|
||||
textPanel.add(new JScrollPane(text), BorderLayout.CENTER);
|
||||
|
||||
main.add(textPanel, BorderLayout.CENTER);
|
||||
|
||||
JButton btnPass = new JButton("Pass");
|
||||
btnPass.addActionListener((e) -> {
|
||||
@ -470,7 +692,8 @@ public final class PassFailJFrame {
|
||||
timeoutHandlerPanel.stop();
|
||||
});
|
||||
|
||||
JPanel buttonsPanel = new JPanel();
|
||||
JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,
|
||||
GAP, 0));
|
||||
buttonsPanel.add(btnPass);
|
||||
buttonsPanel.add(btnFail);
|
||||
|
||||
@ -481,10 +704,12 @@ public final class PassFailJFrame {
|
||||
if (addLogArea) {
|
||||
logArea = new JTextArea(logAreaRows, columns);
|
||||
logArea.setEditable(false);
|
||||
logArea.setBorder(createTextBorder());
|
||||
|
||||
Box buttonsLogPanel = Box.createVerticalBox();
|
||||
|
||||
buttonsLogPanel.add(buttonsPanel);
|
||||
buttonsLogPanel.add(Box.createVerticalStrut(GAP));
|
||||
buttonsLogPanel.add(new JScrollPane(logArea));
|
||||
|
||||
main.add(buttonsLogPanel, BorderLayout.SOUTH);
|
||||
@ -502,7 +727,7 @@ public final class PassFailJFrame {
|
||||
JTextArea text = new JTextArea(instructions, rows, columns);
|
||||
text.setLineWrap(true);
|
||||
text.setWrapStyleWord(true);
|
||||
text.setBorder(createEmptyBorder(4, 4, 4, 4));
|
||||
text.setBorder(createTextBorder());
|
||||
return text;
|
||||
}
|
||||
|
||||
@ -524,6 +749,29 @@ public final class PassFailJFrame {
|
||||
return text;
|
||||
}
|
||||
|
||||
/** A default gap between components. */
|
||||
private static final int GAP = 4;
|
||||
|
||||
/**
|
||||
* Creates a default border for frames or dialogs.
|
||||
* It uses the default gap of {@value GAP}.
|
||||
*
|
||||
* @return the border for frames and dialogs
|
||||
*/
|
||||
private static Border createFrameBorder() {
|
||||
return createEmptyBorder(GAP, GAP, GAP, GAP);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a border set to text area.
|
||||
* It uses the default gap of {@value GAP}.
|
||||
*
|
||||
* @return the border for text area
|
||||
*/
|
||||
private static Border createTextBorder() {
|
||||
return createEmptyBorder(GAP, GAP, GAP, GAP);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a test UI window.
|
||||
@ -589,7 +837,7 @@ public final class PassFailJFrame {
|
||||
* @param testWindows the list of test windows
|
||||
* @param instructionUI information about the instruction frame
|
||||
*/
|
||||
void positionTestWindows(List<? extends Window> testWindows,
|
||||
void positionTestWindows(List<Window> testWindows,
|
||||
InstructionUI instructionUI);
|
||||
}
|
||||
|
||||
@ -737,7 +985,7 @@ public final class PassFailJFrame {
|
||||
private static JComponent createCapturePanel() {
|
||||
JComboBox<CaptureType> screenShortType = new JComboBox<>(CaptureType.values());
|
||||
|
||||
JButton capture = new JButton("ScreenShot");
|
||||
JButton capture = new JButton("Screenshot");
|
||||
capture.addActionListener((e) ->
|
||||
captureScreen((CaptureType) screenShortType.getSelectedItem()));
|
||||
|
||||
@ -749,7 +997,7 @@ public final class PassFailJFrame {
|
||||
|
||||
private enum CaptureType {
|
||||
FULL_SCREEN("Capture Full Screen"),
|
||||
WINDOWS("Capture Individual Frame");
|
||||
WINDOWS("Capture Frames");
|
||||
|
||||
private final String type;
|
||||
CaptureType(String type) {
|
||||
@ -875,26 +1123,30 @@ public final class PassFailJFrame {
|
||||
* Requests the description of the test failure reason from the tester.
|
||||
*/
|
||||
private static void requestFailureReason() {
|
||||
final JDialog dialog = new JDialog(frame, "Test Failure ", true);
|
||||
dialog.setTitle("Failure reason");
|
||||
JPanel jPanel = new JPanel(new BorderLayout());
|
||||
JTextArea jTextArea = new JTextArea(5, 20);
|
||||
final JDialog dialog = new JDialog(frame, "Failure reason", true);
|
||||
|
||||
JTextArea reason = new JTextArea(5, 20);
|
||||
reason.setBorder(createTextBorder());
|
||||
|
||||
JButton okButton = new JButton("OK");
|
||||
okButton.addActionListener((ae) -> {
|
||||
String text = jTextArea.getText();
|
||||
String text = reason.getText();
|
||||
setFailureReason(FAILURE_REASON
|
||||
+ (!text.isEmpty() ? text : EMPTY_REASON));
|
||||
dialog.setVisible(false);
|
||||
});
|
||||
|
||||
jPanel.add(new JScrollPane(jTextArea), BorderLayout.CENTER);
|
||||
|
||||
JPanel okayBtnPanel = new JPanel();
|
||||
JPanel okayBtnPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,
|
||||
GAP, 0));
|
||||
okayBtnPanel.setBorder(createEmptyBorder(GAP, 0, 0, 0));
|
||||
okayBtnPanel.add(okButton);
|
||||
|
||||
jPanel.add(okayBtnPanel, BorderLayout.SOUTH);
|
||||
dialog.add(jPanel);
|
||||
JPanel main = new JPanel(new BorderLayout());
|
||||
main.setBorder(createFrameBorder());
|
||||
main.add(new JScrollPane(reason), BorderLayout.CENTER);
|
||||
main.add(okayBtnPanel, BorderLayout.SOUTH);
|
||||
|
||||
dialog.add(main);
|
||||
dialog.setLocationRelativeTo(frame);
|
||||
dialog.pack();
|
||||
dialog.setVisible(true);
|
||||
@ -927,13 +1179,13 @@ public final class PassFailJFrame {
|
||||
|
||||
switch (position) {
|
||||
case HORIZONTAL:
|
||||
int newX = ((screenSize.width / 2) - frame.getWidth());
|
||||
int newX = (((screenSize.width + WINDOW_GAP) / 2) - frame.getWidth());
|
||||
frame.setLocation((newX + screenInsets.left),
|
||||
(frame.getY() + screenInsets.top));
|
||||
break;
|
||||
|
||||
case VERTICAL:
|
||||
int newY = ((screenSize.height / 2) - frame.getHeight());
|
||||
int newY = (((screenSize.height + WINDOW_GAP) / 2) - frame.getHeight());
|
||||
frame.setLocation((frame.getX() + screenInsets.left),
|
||||
(newY + screenInsets.top));
|
||||
break;
|
||||
@ -981,13 +1233,13 @@ public final class PassFailJFrame {
|
||||
switch (position) {
|
||||
case HORIZONTAL:
|
||||
case TOP_LEFT_CORNER:
|
||||
testWindow.setLocation((frame.getX() + frame.getWidth() + 5),
|
||||
testWindow.setLocation((frame.getX() + frame.getWidth() + WINDOW_GAP),
|
||||
frame.getY());
|
||||
break;
|
||||
|
||||
case VERTICAL:
|
||||
testWindow.setLocation(frame.getX(),
|
||||
(frame.getY() + frame.getHeight() + 5));
|
||||
(frame.getY() + frame.getHeight() + WINDOW_GAP));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1113,9 +1365,10 @@ public final class PassFailJFrame {
|
||||
|
||||
/**
|
||||
* Adds a {@code message} to the log area, if enabled by
|
||||
* {@link Builder#logArea()} or {@link Builder#logArea(int)}.
|
||||
* {@link Builder#logArea() logArea()} or
|
||||
* {@link Builder#logArea(int) logArea(int)}.
|
||||
*
|
||||
* @param message to log
|
||||
* @param message the message to log
|
||||
*/
|
||||
public static void log(String message) {
|
||||
System.out.println("PassFailJFrame: " + message);
|
||||
@ -1124,7 +1377,8 @@ public final class PassFailJFrame {
|
||||
|
||||
/**
|
||||
* Clears the log area, if enabled by
|
||||
* {@link Builder#logArea()} or {@link Builder#logArea(int)}.
|
||||
* {@link Builder#logArea() logArea()} or
|
||||
* {@link Builder#logArea(int) logArea(int)}.
|
||||
*/
|
||||
public static void logClear() {
|
||||
System.out.println("\nPassFailJFrame: log cleared\n");
|
||||
@ -1133,7 +1387,9 @@ public final class PassFailJFrame {
|
||||
|
||||
/**
|
||||
* Replaces the log area content with provided {@code text}, if enabled by
|
||||
* {@link Builder#logArea()} or {@link Builder#logArea(int)}.
|
||||
* {@link Builder#logArea() logArea()} or
|
||||
* {@link Builder#logArea(int) logArea(int)}.
|
||||
*
|
||||
* @param text new text for the log area
|
||||
*/
|
||||
public static void logSet(String text) {
|
||||
@ -1286,6 +1542,7 @@ public final class PassFailJFrame {
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds an implementation of {@link PositionWindows PositionWindows}
|
||||
* which the framework will use to position multiple test UI windows.
|
||||
@ -1309,6 +1566,77 @@ public final class PassFailJFrame {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Positions the test UI windows in a row to the right of
|
||||
* the instruction frame. The top of the windows is aligned to
|
||||
* that of the instruction frame.
|
||||
*
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder positionTestUIRightRow() {
|
||||
return position(Position.HORIZONTAL)
|
||||
.positionTestUI(WindowLayouts::rightOneRow);
|
||||
}
|
||||
|
||||
/**
|
||||
* Positions the test UI windows in a column to the right of
|
||||
* the instruction frame. The top of the first window is aligned to
|
||||
* that of the instruction frame.
|
||||
*
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder positionTestUIRightColumn() {
|
||||
return position(Position.HORIZONTAL)
|
||||
.positionTestUI(WindowLayouts::rightOneColumn);
|
||||
}
|
||||
|
||||
/**
|
||||
* Positions the test UI windows in a column to the right of
|
||||
* the instruction frame centering the stack of the windows.
|
||||
*
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder positionTestUIRightColumnCentered() {
|
||||
return position(Position.HORIZONTAL)
|
||||
.positionTestUI(WindowLayouts::rightOneColumnCentered);
|
||||
}
|
||||
|
||||
/**
|
||||
* Positions the test UI windows in a row to the bottom of
|
||||
* the instruction frame. The left of the first window is aligned to
|
||||
* that of the instruction frame.
|
||||
*
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder positionTestUIBottomRow() {
|
||||
return position(Position.VERTICAL)
|
||||
.positionTestUI(WindowLayouts::bottomOneRow);
|
||||
}
|
||||
|
||||
/**
|
||||
* Positions the test UI windows in a row to the bottom of
|
||||
* the instruction frame centering the row of the windows.
|
||||
*
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder positionTestUIBottomRowCentered() {
|
||||
return position(Position.VERTICAL)
|
||||
.positionTestUI(WindowLayouts::bottomOneRowCentered);
|
||||
}
|
||||
|
||||
/**
|
||||
* Positions the test UI windows in a column to the bottom of
|
||||
* the instruction frame. The left of the first window is aligned to
|
||||
* that of the instruction frame.
|
||||
*
|
||||
* @return this builder
|
||||
*/
|
||||
public Builder positionTestUIBottomColumn() {
|
||||
return position(Position.VERTICAL)
|
||||
.positionTestUI(WindowLayouts::bottomOneColumn);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a {@code WindowListCreator} which the framework will use
|
||||
* to create a list of test UI windows.
|
||||
@ -1411,6 +1739,7 @@ public final class PassFailJFrame {
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a {@code PanelCreator} which the framework will use
|
||||
* to create a component with test UI and display it in a split pane.
|
||||
@ -1502,9 +1831,41 @@ public final class PassFailJFrame {
|
||||
return new PassFailJFrame(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the file name of the test, if the {@code test.file} property
|
||||
* is defined, concatenated with {@code " - "} which serves as a prefix
|
||||
* to the default instruction frame title;
|
||||
* or an empty string if the {@code test.file} property is not defined.
|
||||
*
|
||||
* @return the prefix to the default title:
|
||||
* either the file name of the test or an empty string
|
||||
*
|
||||
* @see <a href="https://openjdk.org/jtreg/tag-spec.html#testvars">jtreg
|
||||
* test-specific system properties and environment variables</a>
|
||||
*/
|
||||
private static String getTestFileNamePrefix() {
|
||||
String testFile = System.getProperty("test.file");
|
||||
if (testFile == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return Paths.get(testFile).getFileName().toString()
|
||||
+ " - ";
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the state of the builder and
|
||||
* expands parameters that have no assigned values
|
||||
* to their default values.
|
||||
*
|
||||
* @throws IllegalStateException if no instructions are provided,
|
||||
* or if {@code PositionWindows} implementation is
|
||||
* provided but neither window creator nor
|
||||
* test window list are set
|
||||
*/
|
||||
private void validate() {
|
||||
if (title == null) {
|
||||
title = TITLE;
|
||||
title = getTestFileNamePrefix() + TITLE;
|
||||
}
|
||||
|
||||
if (instructions == null || instructions.isEmpty()) {
|
||||
|
||||
237
test/jdk/java/awt/regtesthelpers/WindowLayouts.java
Normal file
237
test/jdk/java/awt/regtesthelpers/WindowLayouts.java
Normal file
@ -0,0 +1,237 @@
|
||||
/*
|
||||
* Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.Insets;
|
||||
import java.awt.Point;
|
||||
import java.awt.Window;
|
||||
import java.util.List;
|
||||
|
||||
import static java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment;
|
||||
import static java.awt.Toolkit.getDefaultToolkit;
|
||||
|
||||
/**
|
||||
* A utility class which provides standard window layouts for multi-window
|
||||
* manual tests using the {@link PassFailJFrame} framework.
|
||||
* The layout methods {@code right-} and {@code bottom-} implement the
|
||||
* {@link PassFailJFrame.PositionWindows PositionWindows} interface and
|
||||
* can be used directly or via builder methods.
|
||||
* <p>
|
||||
* There are several helper methods, such as
|
||||
* {@link #getScreenCenter() getScreenCenter}, which could help you
|
||||
* implement customized windows layouts.
|
||||
*/
|
||||
public final class WindowLayouts {
|
||||
|
||||
/** Private constructor to prevent instantiating the utility class. */
|
||||
private WindowLayouts() {
|
||||
}
|
||||
|
||||
/** A gap between windows. (Local copy makes expressions shorter.) */
|
||||
private static final int WINDOW_GAP = PassFailJFrame.WINDOW_GAP;
|
||||
|
||||
/**
|
||||
* Lays out the window list in one row to the right of
|
||||
* the instruction frame. The top of the windows is aligned to
|
||||
* that of the instruction frame.
|
||||
*
|
||||
* @param windows the list of windows to lay out
|
||||
* @param instructionUI information about the instruction frame
|
||||
*/
|
||||
public static void rightOneRow(final List<Window> windows,
|
||||
final PassFailJFrame.InstructionUI instructionUI) {
|
||||
layoutRow(instructionUI.getLocation().x
|
||||
+ instructionUI.getSize().width
|
||||
+ WINDOW_GAP,
|
||||
instructionUI.getLocation().y,
|
||||
windows);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lays out the window list in one column to the right of
|
||||
* the instruction frame. The top of the first window is aligned to
|
||||
* that of the instruction frame.
|
||||
*
|
||||
* @param windows the list of windows to lay out
|
||||
* @param instructionUI information about the instruction frame
|
||||
*/
|
||||
public static void rightOneColumn(final List<Window> windows,
|
||||
final PassFailJFrame.InstructionUI instructionUI) {
|
||||
layoutColumn(instructionUI.getLocation().x
|
||||
+ instructionUI.getSize().width
|
||||
+ WINDOW_GAP,
|
||||
instructionUI.getLocation().y,
|
||||
windows);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lays out the window list in one column to the right of
|
||||
* the instruction frame centering the stack of the windows.
|
||||
*
|
||||
* @param windows the list of windows to lay out
|
||||
* @param instructionUI information about the instruction frame
|
||||
*/
|
||||
public static void rightOneColumnCentered(final List<Window> windows,
|
||||
final PassFailJFrame.InstructionUI instructionUI) {
|
||||
layoutColumn(instructionUI.getLocation().x
|
||||
+ instructionUI.getSize().width
|
||||
+ WINDOW_GAP,
|
||||
getScreenCenter().y
|
||||
- getWindowListHeight(windows) / 2,
|
||||
windows);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Lays out the window list in one row to the bottom of
|
||||
* the instruction frame. The left of the first window is aligned to
|
||||
* that of the instruction frame.
|
||||
*
|
||||
* @param windows the list of windows to lay out
|
||||
* @param instructionUI information about the instruction frame
|
||||
*/
|
||||
public static void bottomOneRow(final List<Window> windows,
|
||||
final PassFailJFrame.InstructionUI instructionUI) {
|
||||
layoutRow(instructionUI.getLocation().x,
|
||||
instructionUI.getLocation().y
|
||||
+ instructionUI.getSize().height
|
||||
+ WINDOW_GAP,
|
||||
windows);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lays out the window list in one row to the bottom of
|
||||
* the instruction frame centering the row of the windows.
|
||||
*
|
||||
* @param windows the list of windows to lay out
|
||||
* @param instructionUI information about the instruction frame
|
||||
*/
|
||||
public static void bottomOneRowCentered(final List<Window> windows,
|
||||
final PassFailJFrame.InstructionUI instructionUI) {
|
||||
layoutRow(getScreenCenter().x
|
||||
- getWindowListWidth(windows) / 2,
|
||||
instructionUI.getLocation().y
|
||||
+ instructionUI.getSize().height
|
||||
+ WINDOW_GAP,
|
||||
windows);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lays out the window list in one column to the bottom of
|
||||
* the instruction frame. The left of the first window is aligned to
|
||||
* that of the instruction frame.
|
||||
*
|
||||
* @param windows the list of windows to lay out
|
||||
* @param instructionUI information about the instruction frame
|
||||
*/
|
||||
public static void bottomOneColumn(final List<Window> windows,
|
||||
final PassFailJFrame.InstructionUI instructionUI) {
|
||||
layoutColumn(instructionUI.getLocation().x,
|
||||
instructionUI.getLocation().y
|
||||
+ instructionUI.getSize().height
|
||||
+ WINDOW_GAP,
|
||||
windows);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Lays out the window list in one row starting at
|
||||
* ({@code x0}, {@code y}).
|
||||
*
|
||||
* @param x0 the starting <var>x</var> coordinate of the windows
|
||||
* @param y the <var>y</var> coordinate of the windows
|
||||
* @param windows the list of windows to lay out
|
||||
*/
|
||||
public static void layoutRow(final int x0,
|
||||
final int y,
|
||||
final List<Window> windows) {
|
||||
int x = x0;
|
||||
for (Window w : windows) {
|
||||
w.setLocation(x, y);
|
||||
x += w.getWidth() + WINDOW_GAP;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Lays out the window list in one column starting at
|
||||
* ({@code x}, {@code y0}).
|
||||
*
|
||||
* @param x the <var>x</var> coordinate of the windows
|
||||
* @param y0 the starting <var>y</var> coordinate of the windows
|
||||
* @param windows the list of windows to lay out
|
||||
*/
|
||||
public static void layoutColumn(final int x,
|
||||
final int y0,
|
||||
final List<Window> windows) {
|
||||
int y = y0;
|
||||
for (Window w : windows) {
|
||||
w.setLocation(x, y);
|
||||
y += w.getHeight() + WINDOW_GAP;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@return the center point of the main screen}
|
||||
*/
|
||||
public static Point getScreenCenter() {
|
||||
GraphicsConfiguration gc = getLocalGraphicsEnvironment()
|
||||
.getDefaultScreenDevice()
|
||||
.getDefaultConfiguration();
|
||||
Dimension size = gc.getBounds()
|
||||
.getSize();
|
||||
Insets insets = getDefaultToolkit()
|
||||
.getScreenInsets(gc);
|
||||
|
||||
return new Point((size.width - insets.left - insets.right) / 2,
|
||||
(size.height - insets.top - insets.bottom) / 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return width of the windows in the list, taking into account
|
||||
* the gap between windows}
|
||||
*
|
||||
* @param windows the list of windows to get the width of
|
||||
*/
|
||||
public static int getWindowListWidth(final List<Window> windows) {
|
||||
return windows.stream()
|
||||
.mapToInt(Component::getWidth)
|
||||
.sum()
|
||||
+ WINDOW_GAP * (windows.size() - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return height of the windows in the list, taking into account
|
||||
* the gap between windows}
|
||||
*
|
||||
* @param windows the list of windows to get the height of
|
||||
*/
|
||||
public static int getWindowListHeight(final List<Window> windows) {
|
||||
return windows.stream()
|
||||
.mapToInt(Component::getHeight)
|
||||
.sum()
|
||||
+ WINDOW_GAP * (windows.size() - 1);
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -45,7 +45,7 @@ public class ReadXBytes {
|
||||
private static final Random RND = RandomFactory.getRandom();
|
||||
|
||||
public static void main(String args[]) throws IOException {
|
||||
File dir = new File(System.getProperty("test.src", "."));
|
||||
File dir = new File(".");
|
||||
dir.deleteOnExit();
|
||||
|
||||
File empty = File.createTempFile("foo", "bar", dir);
|
||||
|
||||
70
test/jdk/java/lang/invoke/TestLambdaFormCustomization.java
Normal file
70
test/jdk/java/lang/invoke/TestLambdaFormCustomization.java
Normal file
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.VarHandle;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8340812
|
||||
* @summary Verify that LambdaForm customization via MethodHandle::updateForm is thread safe.
|
||||
* @run main TestLambdaFormCustomization
|
||||
* @run main/othervm -Djava.lang.invoke.MethodHandle.CUSTOMIZE_THRESHOLD=0 TestLambdaFormCustomization
|
||||
*/
|
||||
public class TestLambdaFormCustomization {
|
||||
|
||||
String str = "test";
|
||||
static final String value = "test" + 42;
|
||||
|
||||
// Trigger concurrent LambdaForm customization for VarHandle invokers
|
||||
void test() throws NoSuchFieldException, IllegalAccessException {
|
||||
VarHandle varHandle = MethodHandles.lookup().in(getClass()).findVarHandle(getClass(), "str", String.class);
|
||||
|
||||
ArrayList<Thread> threads = new ArrayList<>();
|
||||
for (int threadIdx = 0; threadIdx < 10; threadIdx++) {
|
||||
threads.add(new Thread(() -> {
|
||||
for (int i = 0; i < 1000; i++) {
|
||||
varHandle.compareAndExchange(this, value, value);
|
||||
varHandle.compareAndExchange(this, value, value);
|
||||
varHandle.compareAndExchange(this, value, value);
|
||||
}
|
||||
}));
|
||||
}
|
||||
threads.forEach(Thread::start);
|
||||
threads.forEach(t -> {
|
||||
try {
|
||||
t.join();
|
||||
} catch (Throwable e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
TestLambdaFormCustomization t = new TestLambdaFormCustomization();
|
||||
for (int i = 0; i < 4000; ++i) {
|
||||
t.test();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -114,6 +114,9 @@ public class Lookup {
|
||||
// Now check that a reverse lookup will succeed with the dual stack.
|
||||
InetAddress ia = InetAddress.getByName(addr);
|
||||
String name = ia.getHostName();
|
||||
// output details of dual stack lookup by address
|
||||
System.out.println("dual stack lookup for addr " + addr + " returned IP address " + ia);
|
||||
System.out.println(" with hostname " + name);
|
||||
|
||||
System.out.println("(default) " + addr + "--> " + name
|
||||
+ " (reversed IPv4: " + ipv4Reversed + ")");
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -123,7 +123,8 @@ public class Tests {
|
||||
}
|
||||
|
||||
dprintln ("dest2 = " + dest2);
|
||||
|
||||
dprintln ("sender endpoint = " + s1.getLocalSocketAddress());
|
||||
dprintln ("echo endpoint = " + s2.getLocalSocketAddress());
|
||||
|
||||
DatagramPacket r1 = new DatagramPacket (new byte[256], 256);
|
||||
DatagramPacket r2 = new DatagramPacket (new byte[256], 256);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -40,7 +40,7 @@ public class ForceException {
|
||||
int numberOfBlocks = 200;
|
||||
int fileLength = numberOfBlocks * blockSize;
|
||||
|
||||
File file = new File(System.getProperty("test.src", "."), "test.dat");
|
||||
File file = new File(".", "test.dat");
|
||||
file.deleteOnExit();
|
||||
try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) {
|
||||
raf.setLength(fileLength);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -51,7 +51,7 @@ public class ForceViews {
|
||||
|
||||
@BeforeTest(alwaysRun=true)
|
||||
public void openChannel() throws IOException {
|
||||
Path file = Path.of(System.getProperty("test.src", "."), "junk");
|
||||
Path file = Path.of(".", "junk");
|
||||
fc = FileChannel.open(file, CREATE_NEW, READ, WRITE, DELETE_ON_CLOSE);
|
||||
ByteBuffer buf = ByteBuffer.wrap(new byte[1024]);
|
||||
fc.write(buf);
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2024 Alibaba Group Holding Limited. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,18 +26,18 @@
|
||||
* @bug 8011536 8151430 8316304 8334339
|
||||
* @summary Basic test for creationTime attribute on platforms/file systems
|
||||
* that support it, tests using /tmp directory.
|
||||
* @library ../.. /test/lib
|
||||
* @build jdk.test.lib.Platform
|
||||
* @run main CreationTime
|
||||
* @library ../.. /test/lib /java/foreign
|
||||
* @build jdk.test.lib.Platform NativeTestHelper
|
||||
* @run main/othervm/native --enable-native-access=ALL-UNNAMED CreationTime
|
||||
*/
|
||||
|
||||
/* @test id=cwd
|
||||
* @summary Basic test for creationTime attribute on platforms/file systems
|
||||
* that support it, tests using the test scratch directory, the test
|
||||
* scratch directory maybe at diff disk partition to /tmp on linux.
|
||||
* @library ../.. /test/lib
|
||||
* @build jdk.test.lib.Platform
|
||||
* @run main CreationTime .
|
||||
* @library ../.. /test/lib /java/foreign
|
||||
* @build jdk.test.lib.Platform NativeTestHelper
|
||||
* @run main/othervm/native --enable-native-access=ALL-UNNAMED CreationTime .
|
||||
*/
|
||||
|
||||
import java.lang.foreign.Linker;
|
||||
@ -51,8 +52,6 @@ import jtreg.SkippedException;
|
||||
|
||||
public class CreationTime {
|
||||
|
||||
private static final java.io.PrintStream err = System.err;
|
||||
|
||||
/**
|
||||
* Reads the creationTime attribute
|
||||
*/
|
||||
@ -78,14 +77,9 @@ public class CreationTime {
|
||||
FileTime creationTime = creationTime(file);
|
||||
Instant now = Instant.now();
|
||||
if (Math.abs(creationTime.toMillis()-now.toEpochMilli()) > 10000L) {
|
||||
System.out.println("creationTime.toMillis() == " + creationTime.toMillis());
|
||||
// If the file system doesn't support birth time, then skip this test
|
||||
if (creationTime.toMillis() == 0) {
|
||||
throw new SkippedException("birth time not support for: " + file);
|
||||
} else {
|
||||
err.println("File creation time reported as: " + creationTime);
|
||||
throw new RuntimeException("Expected to be close to: " + now);
|
||||
}
|
||||
System.err.println("creationTime.toMillis() == " + creationTime.toMillis());
|
||||
System.err.println("File creation time reported as: " + creationTime);
|
||||
throw new RuntimeException("Expected to be close to: " + now);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -107,7 +101,12 @@ public class CreationTime {
|
||||
}
|
||||
} else if (Platform.isLinux()) {
|
||||
// Creation time read depends on statx system call support
|
||||
supportsCreationTimeRead = Linker.nativeLinker().defaultLookup().find("statx").isPresent();
|
||||
try {
|
||||
supportsCreationTimeRead = CreationTimeHelper.
|
||||
linuxIsCreationTimeSupported(file.toAbsolutePath().toString());
|
||||
} catch (Throwable e) {
|
||||
supportsCreationTimeRead = false;
|
||||
}
|
||||
// Creation time updates are not supported on Linux
|
||||
supportsCreationTimeWrite = false;
|
||||
}
|
||||
@ -122,8 +121,11 @@ public class CreationTime {
|
||||
Instant plusHour = Instant.now().plusSeconds(60L * 60L);
|
||||
Files.setLastModifiedTime(file, FileTime.from(plusHour));
|
||||
FileTime current = creationTime(file);
|
||||
if (!current.equals(creationTime))
|
||||
if (!current.equals(creationTime)) {
|
||||
System.err.println("current = " + current);
|
||||
System.err.println("creationTime = " + creationTime);
|
||||
throw new RuntimeException("Creation time should not have changed");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (c) 2024 Alibaba Group Holding Limited. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.lang.foreign.Arena;
|
||||
import java.lang.foreign.FunctionDescriptor;
|
||||
import java.lang.foreign.Linker;
|
||||
import java.lang.foreign.MemorySegment;
|
||||
import java.lang.foreign.SymbolLookup;
|
||||
import java.lang.foreign.ValueLayout;
|
||||
import java.lang.invoke.MethodHandle;
|
||||
|
||||
public class CreationTimeHelper extends NativeTestHelper {
|
||||
|
||||
static {
|
||||
System.loadLibrary("CreationTimeHelper");
|
||||
}
|
||||
|
||||
final static Linker abi = Linker.nativeLinker();
|
||||
static final SymbolLookup lookup = SymbolLookup.loaderLookup();
|
||||
final static MethodHandle methodHandle = abi.
|
||||
downcallHandle(lookup.findOrThrow("linuxIsCreationTimeSupported"),
|
||||
FunctionDescriptor.of(C_BOOL, C_POINTER));
|
||||
|
||||
// Helper so as to determine birth time support or not on Linux.
|
||||
// Support is determined in a two-step process:
|
||||
// 1. Determine if `statx` system call is available. If available proceed,
|
||||
// otherwise return false.
|
||||
// 2. Perform an actual `statx` call on the given file and check for birth
|
||||
// time support in the mask returned from the call. This is needed,
|
||||
// since some file systems, like nfs/tmpfs etc., don't support birth
|
||||
// time even though the `statx` system call is available.
|
||||
static boolean linuxIsCreationTimeSupported(String file) throws Throwable {
|
||||
if (!abi.defaultLookup().find("statx").isPresent()) {
|
||||
return false;
|
||||
}
|
||||
try (var arena = Arena.ofConfined()) {
|
||||
MemorySegment s = arena.allocateFrom(file);
|
||||
return (boolean)methodHandle.invokeExact(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,129 @@
|
||||
/*
|
||||
* Copyright (c) 2024 Alibaba Group Holding Limited. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
#include "export.h"
|
||||
#include <stdbool.h>
|
||||
#if defined(__linux__)
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <dlfcn.h>
|
||||
#ifndef STATX_BASIC_STATS
|
||||
#define STATX_BASIC_STATS 0x000007ffU
|
||||
#endif
|
||||
#ifndef STATX_BTIME
|
||||
#define STATX_BTIME 0x00000800U
|
||||
#endif
|
||||
#ifndef RTLD_DEFAULT
|
||||
#define RTLD_DEFAULT RTLD_LOCAL
|
||||
#endif
|
||||
#ifndef AT_SYMLINK_NOFOLLOW
|
||||
#define AT_SYMLINK_NOFOLLOW 0x100
|
||||
#endif
|
||||
#ifndef AT_FDCWD
|
||||
#define AT_FDCWD -100
|
||||
#endif
|
||||
|
||||
#ifndef __GLIBC__
|
||||
// Alpine doesn't know these types, define them
|
||||
typedef unsigned int __uint32_t;
|
||||
typedef unsigned short __uint16_t;
|
||||
typedef unsigned long int __uint64_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Timestamp structure for the timestamps in struct statx.
|
||||
*/
|
||||
struct my_statx_timestamp {
|
||||
int64_t tv_sec;
|
||||
__uint32_t tv_nsec;
|
||||
int32_t __reserved;
|
||||
};
|
||||
|
||||
/*
|
||||
* struct statx used by statx system call on >= glibc 2.28
|
||||
* systems
|
||||
*/
|
||||
struct my_statx
|
||||
{
|
||||
__uint32_t stx_mask;
|
||||
__uint32_t stx_blksize;
|
||||
__uint64_t stx_attributes;
|
||||
__uint32_t stx_nlink;
|
||||
__uint32_t stx_uid;
|
||||
__uint32_t stx_gid;
|
||||
__uint16_t stx_mode;
|
||||
__uint16_t __statx_pad1[1];
|
||||
__uint64_t stx_ino;
|
||||
__uint64_t stx_size;
|
||||
__uint64_t stx_blocks;
|
||||
__uint64_t stx_attributes_mask;
|
||||
struct my_statx_timestamp stx_atime;
|
||||
struct my_statx_timestamp stx_btime;
|
||||
struct my_statx_timestamp stx_ctime;
|
||||
struct my_statx_timestamp stx_mtime;
|
||||
__uint32_t stx_rdev_major;
|
||||
__uint32_t stx_rdev_minor;
|
||||
__uint32_t stx_dev_major;
|
||||
__uint32_t stx_dev_minor;
|
||||
__uint64_t __statx_pad2[14];
|
||||
};
|
||||
|
||||
typedef int statx_func(int dirfd, const char *restrict pathname, int flags,
|
||||
unsigned int mask, struct my_statx *restrict statxbuf);
|
||||
|
||||
static statx_func* my_statx_func = NULL;
|
||||
#endif //#defined(__linux__)
|
||||
|
||||
// static boolean linuxIsCreationTimeSupported(char* file)
|
||||
EXPORT bool linuxIsCreationTimeSupported(char* file) {
|
||||
#if defined(__linux__)
|
||||
struct my_statx stx = {0};
|
||||
int ret, atflag = AT_SYMLINK_NOFOLLOW;
|
||||
unsigned int mask = STATX_BASIC_STATS | STATX_BTIME;
|
||||
|
||||
my_statx_func = (statx_func*) dlsym(RTLD_DEFAULT, "statx");
|
||||
if (my_statx_func == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (file == NULL) {
|
||||
printf("input file error!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
ret = my_statx_func(AT_FDCWD, file, atflag, mask, &stx);
|
||||
if (ret != 0) {
|
||||
return false;
|
||||
}
|
||||
// On some systems where statx is available but birth time might still not
|
||||
// be supported as it's file system specific. The only reliable way to
|
||||
// check for supported or not is looking at the filled in STATX_BTIME bit
|
||||
// in the returned statx buffer mask.
|
||||
if ((stx.stx_mask & STATX_BTIME) != 0)
|
||||
return true;
|
||||
return false;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
@ -75,7 +75,7 @@ public class TimeZoneNameTest
|
||||
"N", "GMT", "GMT", "Greenwich Mean Time", "GMT", "Greenwich Mean Time",
|
||||
"N", "Europe/London", "GMT", "Greenwich Mean Time", "BST", "British Summer Time",
|
||||
"N", "Europe/Paris", "CET", "Central European Standard Time", "CEST", "Central European Summer Time",
|
||||
"N", "WET", "WET", "GMT", "WEST", "GMT+01:00",
|
||||
"N", "WET", "WET", "Western European Standard Time", "WEST", "Western European Summer Time",
|
||||
"N", "Europe/Berlin", "CET", "Central European Standard Time", "CEST", "Central European Summer Time",
|
||||
"N", "Asia/Jerusalem", "IST", "Israel Standard Time", "IDT", "Israel Daylight Time",
|
||||
"N", "Europe/Helsinki", "EET", "Eastern European Standard Time", "EEST", "Eastern European Summer Time",
|
||||
|
||||
@ -31,7 +31,7 @@
|
||||
* java.base/sun.util.resources
|
||||
* @build com.foobar.Utils
|
||||
* com.foo.*
|
||||
* @run main/othervm -Djava.locale.providers=CLDR,SPI DateFormatProviderTest
|
||||
* @run main/othervm/timeout=300 -Djava.locale.providers=CLDR,SPI DateFormatProviderTest
|
||||
*/
|
||||
|
||||
import java.text.DateFormat;
|
||||
|
||||
@ -1 +1 @@
|
||||
tzdata2024a
|
||||
tzdata2024b
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user