Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:129383 X-Original-To: internals@lists.php.net Delivered-To: internals@lists.php.net Received: from php-smtp4.php.net (php-smtp4.php.net [45.112.84.5]) by lists.php.net (Postfix) with ESMTPS id 4C60B1A00BC for ; Sat, 22 Nov 2025 04:50:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1763787021; bh=aEV0TsqU+dA0IuVI9tiqIyVT57rFFkXszndzO0LZuAo=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=JMsIbAW8ZktlwUnyGKQQaB0l84c7VHudm28c2cIAJ6LJ5F4g3wf7AQjJzd9Lg44pY aKB75xfZoFe7i2dbl/QD4TUaSLFyNNPdI3WpNtTGMTtTWiDYsbqRLxlG2Jz/qS+t1Q pcP1XZJHItXdB3jaCM5c+C4JYtNjM88bzxApeHPBMVLQk0TUeBZSdTS98NJNam2hXf Fh9BF1AR7X9Oij94UfHd0BWggC2vav5PeCrTwO1sRZRKOTYa3ea8SrTPLW6LWREb4x m6tDEAmtvLWYtsxlENYyPNquCdDBshSbSYqaaexPOclNagAnOE7fVAR/s+hUG9EJIT S055F7/IfEkWw== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id F398E180082 for ; Sat, 22 Nov 2025 04:50:20 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_50, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,DMARC_PASS, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,HTML_MESSAGE, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS autolearn=no autolearn_force=no version=4.0.1 X-Spam-Virus: No X-Envelope-From: Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazolkn19010016.outbound.protection.outlook.com [52.103.33.16]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (secp384r1) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Sat, 22 Nov 2025 04:50:20 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JW3r0FZH9+wL5yTwPN4P0a87LKMzvTgDIAUznTLOejESxeUJEDWaebEioiASRY5N/85TRHhWRR9oSY9sKcxEh0mCLB63cLd9r+NNhbD7PQYXDW91tAhAH94LKDrokRQ3WQw2lEQdgu/fN+wX8BbAdPD1EGFk+bGyhAD2aexZm0e7GLMV0+nDWRyNqoh/06+3BJMni9Dzs5NJmdEEUab8Yoyfk/icqko3+qNQYWEGjq95oTJjcq7XdrPvCWVJk+x+cAEzjNshXXNQC3o7hAdSSitZO4gE33FTMVbZJvPSKUCIczEIQtMIFN4hyO2Fmxz8HLgP88epwm579RqkeeqtBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=3hM2rW7POgS64O6QibZprH0co0DEkPWvvXKH3kJtil0=; b=j14lQbFknuVvhqCZID6/p3ent5U9pCQhs9vixjOKOWbAfluLoiiTjGD6pHfWksINk2bwC2LEy4gmFICb1O6jxCH3ngUqHkJGpfs0oibGdV6qFlHD9uaK5mM5p/HBxFrMbNzbg6/GSUiNKcrJtwmkq3ymTMPV6amh7k3imx9DhQD1AFd+8L2PfDWQgCeUY9Mf/l3Wcz1tiz7fhiItE7sPSGRZu8fGLsiwZgPG9PuTEurae2S/Fr0bJ1UW3ELZqRvcDAmy81c/ryx1Qsn3D+RzRaF8Vj1RWFD77krqgAwDoh5RW7kt9GEk+7PWZaGHyy+Fs+1Hexz0CabsDMfQNYaHyQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3hM2rW7POgS64O6QibZprH0co0DEkPWvvXKH3kJtil0=; b=efdZIs/S0AS6tH/Nhj6z/7WPS0SMAaQ5UMA2AZQlCqnHmNZs1Si5Wn3p1nC5jbdf0W2XX43OQ9ljb+LmUo+I1RIQsgm/ufL8drog9XnporX3ZfmXAW5v3x8sgv3SQ5XPKAvAjr/fx9hOVAj18wF/A4FHPLCwPtRNXRJWmG8ewqI3JaUDhgOi5Y43BTL0d7vLgnx3HiDx5HFTMqXH7u1/3cwTrbBFFUw3KzRkI4J6bUT1muY9bFn0mAnpPr07duTh4iTnsW3WW6N4N831CumkkQnaxuwUmFpuXE6Jh4UWNfRQEECFniulrJpflY8raggWQhBv8dBdWaFhIIau/QoKcg== Received: from AM8P250MB0170.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:321::21) by DU2P250MB0319.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:27c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.14; Sat, 22 Nov 2025 04:50:13 +0000 Received: from AM8P250MB0170.EURP250.PROD.OUTLOOK.COM ([fe80::651e:bbd2:b18a:80ff]) by AM8P250MB0170.EURP250.PROD.OUTLOOK.COM ([fe80::651e:bbd2:b18a:80ff%3]) with mapi id 15.20.9320.013; Sat, 22 Nov 2025 04:50:12 +0000 Content-Type: multipart/alternative; boundary="------------YIXyEIZ5LWIn7fiGhFHcUghb" Message-ID: Date: Sat, 22 Nov 2025 05:50:08 +0100 User-Agent: Mozilla Thunderbird Subject: Re: [PHP-DEV] [VOTE] True Async RFC 1.6 To: Jakub Zelenka , Edmond Dantes Cc: "Rowan Tommins [IMSoP]" , internals@lists.php.net References: Content-Language: en-US In-Reply-To: X-ClientProxiedBy: BN0PR10CA0009.namprd10.prod.outlook.com (2603:10b6:408:143::6) To AM8P250MB0170.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:321::21) X-Microsoft-Original-Message-ID: <439ac53f-f395-4b8b-881b-d0f15035c903@hotmail.com> Precedence: list list-help: list-unsubscribe: list-post: List-Id: x-ms-reactions: disallow MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM8P250MB0170:EE_|DU2P250MB0319:EE_ X-MS-Office365-Filtering-Correlation-Id: d7585d5f-6ea9-4f30-f3f6-08de29829eb3 X-Microsoft-Antispam: BCL:0;ARA:14566002|12121999013|8060799015|15080799012|23021999003|461199028|19110799012|51005399006|5072599009|40105399003|3412199025|440099028|26104999006; X-Microsoft-Antispam-Message-Info: =?utf-8?B?WTR3MnpneHRyZHFhZlpCVmhQMDNEREh2dmhUWDRMQURYY1diQ2xrRlhJSW9u?= =?utf-8?B?QnpOTGF4Z2tyL2N5cHlIRzVmZmpqRXRNMCtYZ2VEazBZVUdtblBZWWY2MEVC?= =?utf-8?B?SWhkcE5mMHJKR1hkR1pDWVdBRzhVMkQzTWdSSWx0YXJyQmhQamVDRGIyTngz?= =?utf-8?B?S21zQ1JreERJbzRrU1J1TVZTS0E0L2Nwb2NsM0QvQ0FXYXBUVktWVzYrVjJL?= =?utf-8?B?UEx2eVNueUQ0b3AwV3MxTjd2OHZGdXhLTlAyZ3NyUGc3ZDJMTUNnQ1lhdVla?= =?utf-8?B?QmlTYTYvQjhDNEE4RmJ4OTB2aDdDQVEzOXM1N01iVGlaZmo4U214YUNYbHBt?= =?utf-8?B?QzhCRWJWSUZ6bFhIYUxtRlF1di8raWFvWUpJSnJEb3ZTOU9kWHFkQnVHTDVP?= =?utf-8?B?ZmhDU21OY2k2UmhSUHJQczBmY2pWR3hTRUFsK0tMZWsvVm1GV0ZHdjNJWlJ1?= =?utf-8?B?MHBhaGE5bW81QzFheHI0MlBNUjdWN1E3WUtEVy9vQTcreitRWkxtcW1RS0NN?= =?utf-8?B?dlMvUUphS1NkSHMrL3dMc3Q0YzVmUEZidjRMUkQ4Q3F0SXVPYjVLRjdRYlpv?= =?utf-8?B?bFFJUThiNW5LWGpEMTYrL2F1L01iN2dFaTN0YlhuOFdqOHQyUkFLMktoSFFB?= =?utf-8?B?TjRIemUrWWRXeDlKaDdrUlhZeDBZZE1UVStkbVRNdFRvVlUzaDdsMWt2MlNa?= =?utf-8?B?NDFnZDN2YTNJODQ0czVJSnF4T01kVnVsV1lZcm9LRHUxNDNYWUw5LzZvSHUz?= =?utf-8?B?cUpYeUZjbXJFZ1YzeUxKU1ZOeXdVQU43OXRHRld5TDk0NUgxTUhyRHI5V1BM?= =?utf-8?B?TE1xeUNOWXhqWjB0ZlMxWkh5VXNVSXdyMHRhYy9ILy9LVEs2WGx0RjFqTXp4?= =?utf-8?B?ODRuNWM5MVpMQ1k0UTdKMkhxeUtNdnM1VHl6b01VeXdoZmNsZXk4R3NzbmJT?= =?utf-8?B?N3lEbURUN1Ayc1dUMEFzNWVZbkZtSlhLSXBHQktnY09TKzVHT1l4VElsbzg2?= =?utf-8?B?dGhhd3VoSksrZUZWTHRSTjJob2Z6dlJoaGJLNDVnNDZpbEMvTEFPM0s1SUlF?= =?utf-8?B?c0kyRm12VU0vQ3p3cTBGRmllbUg3cGMwVlBaV1JYTjhmZGVOQXJRNlc5ZVdt?= =?utf-8?B?YTk4bEYyUjBKaWdoaVM2S0p4enRwR0ovYmhUSjQ5RG1peXBhMVcvZHhUVHF2?= =?utf-8?B?T2RRMy9Ha0FvWnFOcEN6TjcwZ3o1V2xBWGdaTnludUt4UnFwU0FaMWhabzJF?= =?utf-8?B?djFoL1hyY3UxZVlIQksvSlpldExMa2FxVG5Sb0p0QU1YTVBKanVlZ0xodmpB?= =?utf-8?B?NDZZQmhPVy9hdHNjOTRySWR0M2pvMGN5WHFIZmlMT3EvdXNZckZtdEg2cjdh?= =?utf-8?B?aTFGcDdjREZWOTdOSmR5cThVWUVHb29LdUpEdFNMTkhpL3ZjWG9pakVMWHRC?= =?utf-8?B?cWNEcEp3NFE1SENtZDlUMmR0NEt0MmJvbFFKZGZVZG9wT1RlM2k1aFg4bUdR?= =?utf-8?B?UXJJelRMRDVrNWtjQ203UTdvVzMxazU1bzk5VFh6ek05K2VwdlBCNmRSbDFq?= =?utf-8?B?di9HYitCYTA2TjBBQkQwUTVCL3g0d3FpWUg4ZE5SMHpPL05qaWY3ZDZyMFY1?= =?utf-8?B?VlZwdHdVbzJoV2pmUWREdmZIK1ZhRGh3OTFDRkpiNnhBc2tQSUpCV0F6SzQw?= =?utf-8?Q?Faitd5jCZo8R8e7uttGy?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?V3pOaE9pbEJKYmc5SWV6RVJwa0pWdUo2cllZcnI1WFdIWjVoMXJFR3dJdUFB?= =?utf-8?B?alR3ckZWVUh6Y1pLZDJwN0hPL1oyV0QvdmRTK2ExYUdicVBUb1dncUs5bWxW?= =?utf-8?B?UUdYOVQrUmZ1elQ5eE9pbDU3UEVJMEQvQ3FLKzJuMzRrdUJjNk5GMkdoZzB1?= =?utf-8?B?aHBSTEc2Slc0dmJOT2hoK01ueE9lZFdyRVhFVXZUVzdqWTNGRWxqUVR6NnJU?= =?utf-8?B?M2diTGIrcUphL3drTWZoTmNMT0lEaG5CZUVjV0lLN1d2cEZuZC8wL0pjV0p4?= =?utf-8?B?RXFvRDhnY1k2MmV1WG1XN0p2b2NraTlnRDdCTTVCKzVkcktiS3o4V3N4bnZ3?= =?utf-8?B?Mzc4bHY5QnZielc0WGY1WXZhWEZKVkk3S0lsNG9iRDJ2ZnF5OU5PRUIxcDRl?= =?utf-8?B?YXNySytoejZaZ2t4Z1QrdVNUUlNmaUE0SXNIb3pMaXdBRXFHa3BDaUlPSWwv?= =?utf-8?B?dGc0c3dPbkVQQ2VkMlcvM0xIOW1QWnFKN0lqVGFhN3lxWG9ZQ09UZzhyYWtC?= =?utf-8?B?Y3k3SFlkSUs3K3V4QUJVQU40VFFqSXlJeU9Gb2hLbk56b1cwR1drRTM0RUJO?= =?utf-8?B?Z0hFYlg3OERVam9DcHBtdWhLMW9EanFsaU91clpaVGR1TU05bzNvU28rL0Zt?= =?utf-8?B?c2NGT3RUTXdUYU85UkQwK0RSbXdaakEwc2JKU3ZLZDQ1WDlKNzk4STFra1BZ?= =?utf-8?B?WFAzZmxET3YzdVNBWjJNNHMrYkJvOFNKa09iZndUNzcyUlV4TStCR1cybXJo?= =?utf-8?B?UDZmS0tHc2xEK3I3alk1ZXlsdkpUaGpBME41VjNaYmhSaU1VTXNpMzYvUmtR?= =?utf-8?B?MVZSWldHNmg4eUIzdm1uU1V3WWM4T1JPdmZUOTZKWGFYNGdvTE1PcXVIUGc1?= =?utf-8?B?U0xlMzR1YWtFQVYvZUp4QVB0YVh4WmUwSjdOdzBjM1B0S3lvaWlvVFZoNXNI?= =?utf-8?B?S3dqazJ2MFk0bFFtTXZlUTVhTHRxOVRldHl5V0hxYW0zNy9UY05Nb05MOUIx?= =?utf-8?B?ZmNVRVZZdlpNL0JJeFdTajZTTGJjUjJVU1Y4Z2Y2S3FGMWdnSHlQcUZ6d1pY?= =?utf-8?B?czRjbDRKOEZWZDZHaEU4MGRTSzhRMm5pUTREYWMwbzJGZ3JJK3VsN2RSYVhN?= =?utf-8?B?TjBVSlpMcko5YkpkTlZSQVBuUWovWXhzdFdUUGdncGhSMFhmRm5GUWZyNCtP?= =?utf-8?B?Nkt6bEFjaTVVNmd2UldnNzBHaUVlcGNBL0NacEpMOEdvVm5mckN2aFREZWUz?= =?utf-8?B?YUplN3o2dkdVTkZ6dE5Rck10STA2Q0JCMEJyNGZYUzVqVktaNWg3YTRLNHdR?= =?utf-8?B?cEx0ZXd0bmJiS29FL1F5akZvSlN4TVRIRlZJN2tESW1kRzREd2ZIdkx1SHBj?= =?utf-8?B?NUd2YlI1UDQxUkJnSEQ3emdPMHNUZ0srUlZreis0ZEwzczNWUFFzQ3dFS00z?= =?utf-8?B?b2hwUFNEOTlWNFRVTmwvd1VaVEI1Ynh1SG92T3BaNm9hNGczaWtWSGF4VENy?= =?utf-8?B?bUdpUEJsTVgxQXdVSGx3VlJDR05VSzhNTGdtS2JEMitzeVJqV05wZnZjVitz?= =?utf-8?B?a1BPR2Q4VWI1Tkl0dkdyeCt1cmQzVzBjaWRKaTVSYzlNR2crQzR6elZ0bDVq?= =?utf-8?B?QlM5U0FlOWdFV2IzSmVNWWxNRVM5NDVlS3lXNHB1eEgrZitNYUtSRFNsZ1k0?= =?utf-8?B?WlJhZU83dVV1MmQwbjl0TkZMM0tvb2U2K3JpSENrZnhueER3NE9SV0RSd3Vs?= =?utf-8?Q?MUORO08dvhchXZ/pf8=3D?= X-OriginatorOrg: sct-15-20-8534-15-msonline-outlook-5f066.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: d7585d5f-6ea9-4f30-f3f6-08de29829eb3 X-MS-Exchange-CrossTenant-AuthSource: AM8P250MB0170.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Nov 2025 04:50:12.2178 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU2P250MB0319 From: bobwei9@hotmail.com (Bob Weinand) --------------YIXyEIZ5LWIn7fiGhFHcUghb Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hey Jakub, On 21.11.2025 12:29:16, Jakub Zelenka wrote: > Hi, > > I think you seriously underestimate impact of this in the current PHP > code bases where many applications depend on global state. Especially > the legacy ones but even the most popular ones. Just look into > WordPress which use global state extensively. Now imagine that some > popular plugin decides to use async which change some of its globals > (like $post or $wp_query) during the suspension of the main code. I > would assume this could horribly break things. Don't forget that other > code don't have control over the plugin and it might not even know > that async is used there. So I'm not sure if this design is compatible > with WordPress and similar applications where global state is used > extensively. If that's the case, it's of course a problem because > those applications (well WordPress on its own in fact) compose the > majority of PHP users so introducing something that would have > potential to break its code would limit usability of the whole feature > and could even lead to loosing more users that we could gain from > introducing this feature. > > So I think it will need to find some solution that will prevent this > from happening. I guess there might be few options > > 1. Disallow suspension of the main sync code which is effectively some > sort of colouring. > 2. Preventing access to globals from coroutine which I'm not sure is > even fully doable from the engine PoV - it would mean some sort of > different execution mode that could not use globals (e.g. global > keyword and calling some functions that change global state). It would > need channels for communications between coroutines. The advantage of > such model would be possibility to combine it with threads in the > future but I could imagine it could still lead to some subtle issue > for years as there is internal global state as well that can lead to > some surprises. But maybe that would be worth it. I think you seriously misunderstand this. Async does not allow you to introduce some effects from the outside. You have to actively opt-in to running stuff in parallel. The problematic part, is, when you call code inside of coroutines, which is not safe to be run in parallel with other code. I.e. if you start writing code like `await([new Coroutine(fn() => not_safe_to_run_twice()), new Coroutine(fn() => not_safe_to_run_twice())])` (pseudo code). Where not_safe_to_run_twice() shares some context. So, when you write async code, you have to *know* that the called code is allowed to run in parallel with any other code which you explicitly chose to run in parallel with it. E.g. if you'd run two wordpress functions which don't have side-effects (not even to internal state), then you're perfectly fine doing that. If you run wordpress functions in parallel which may jump back to the scheduler during its operation and leave the internal state in some intermittently invalid form, then yes, then you have a problem. But if your goal is to just do a localized parallelized operation which you know is safe to run in parallel - e.g. some image processing and storing some stuff in the database, within your wordpress plugin, that's absolutely fine. It won't break anything. Essentially: Just don't call stuff in parallel which you don't know is safe to be called in parallel and you're golden. Bob --------------YIXyEIZ5LWIn7fiGhFHcUghb Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hey Jakub,

On 21.11.2025 12:29:16, Jakub Zelenka wrote:
Hi,

I think you seriously underestimate impact of this in the current PHP code bases where many applications depend on global state. Especially the legacy ones but even the most popular ones. Just look into WordPress which use global state extensively. Now imagine that some popular plugin decides to use async which change some of its globals (like $post or $wp_query) during the suspension of the main code. I would assume this could horribly break things. Don't forget that other code don't have control over the plugin and it might not even know that async is used there. So I'm not sure if this design is compatible with WordPress and similar applications where global state is used extensively. If that's the case, it's of course a problem because those applications (well WordPress on its own in fact) compose the majority of PHP users so introducing something that would have potential to break its code would limit usability of the whole feature and could even lead to loosing more users that we could gain from introducing this feature.

So I think it will need to find some solution that will prevent this from happening. I guess there might be few options

1. Disallow suspension of the main sync code which is effectively some sort of colouring.
2. Preventing access to globals from coroutine which I'm not sure is even fully doable from the engine PoV - it would mean some sort of different execution mode that could not use globals (e.g. global keyword and calling some functions that change global state). It would need channels for communications between coroutines. The advantage of such model would be possibility to combine it with threads in the future but I could imagine it could still lead to some subtle issue for years as there is internal global state as well that can lead to some surprises. But maybe that would be worth it.

I think you seriously misunderstand this.

Async does not allow you to introduce some effects from the outside. You have to actively opt-in to running stuff in parallel.

The problematic part, is, when you call code inside of coroutines, which is not safe to be run in parallel with other code.

I.e. if you start writing code like `await([new Coroutine(fn() => not_safe_to_run_twice()), new Coroutine(fn() => not_safe_to_run_twice())])` (pseudo code). Where not_safe_to_run_twice() shares some context.

So, when you write async code, you have to *know* that the called code is allowed to run in parallel with any other code which you explicitly chose to run in parallel with it. E.g. if you'd run two wordpress functions which don't have side-effects (not even to internal state), then you're perfectly fine doing that. If you run wordpress functions in parallel which may jump back to the scheduler during its operation and leave the internal state in some intermittently invalid form, then yes, then you have a problem.

But if your goal is to just do a localized parallelized operation which you know is safe to run in parallel - e.g. some image processing and storing some stuff in the database, within your wordpress plugin, that's absolutely fine. It won't break anything.


Essentially: Just don't call stuff in parallel which you don't know is safe to be called in parallel and you're golden.


Bob

--------------YIXyEIZ5LWIn7fiGhFHcUghb--