// Copyright 2022 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Flags: --shared-string-table --harmony-struct --allow-natives-syntax "use strict"; if (this.Worker) { (function TestSharedStructPostMessage() { let workerScript = `onmessage = function(struct) { // Non-atomic write that will be made visible once main thread // observes the atomic write below. struct.struct_field.payload = 42; Atomics.store(struct, "string_field", "worker"); }; postMessage("started");`; let worker = new Worker(workerScript, { type: 'string' }); let started = worker.getMessage(); assertEquals("started", started); let OuterStruct = new SharedStructType(['string_field', 'struct_field']); let InnerStruct = new SharedStructType(['payload']); let struct = new OuterStruct(); struct.struct_field = new InnerStruct(); struct.string_field = "main"; assertEquals("main", struct.string_field); assertEquals(undefined, struct.struct_field.payload); worker.postMessage(struct); // Spin until we observe the worker's write of string_field. while (Atomics.load(struct, "string_field") !== "worker") {} // The non-atomic store write must also be visible. assertEquals(42, struct.struct_field.payload); worker.terminate(); })(); }