Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wPbFc-000shZ-2C for pgsql-hackers@arkaria.postgresql.org; Wed, 20 May 2026 07:21:56 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wPbFZ-006e1N-2O for pgsql-hackers@arkaria.postgresql.org; Wed, 20 May 2026 07:21:54 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wPbFZ-006e1F-1C for pgsql-hackers@lists.postgresql.org; Wed, 20 May 2026 07:21:54 +0000 Received: from mail-pj1-x1032.google.com ([2607:f8b0:4864:20::1032]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wPbFX-00000000Vo2-2zIm for pgsql-hackers@postgresql.org; Wed, 20 May 2026 07:21:53 +0000 Received: by mail-pj1-x1032.google.com with SMTP id 98e67ed59e1d1-36931e4f5e8so3850121a91.2 for ; Wed, 20 May 2026 00:21:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779261709; x=1779866509; darn=postgresql.org; h=to:cc:date:message-id:subject:mime-version:from:from:to:cc:subject :date:message-id:reply-to; bh=pGKpQ+LcdXD9UXpidd8rel3yKCPiXaKk24ftf6ncews=; b=jZ2q6iqjEF2kIuuqlitL+UB/pgOiBGLrjRoxob06zc921JUSJpSdzxEZ3VQTWzMJfX un7BbIQ+h3Fml0bMDTWOaY9m/TE5K/lsK+/1ZRkHR8NZiQM/3fNSTmiGPagYDz3hrFIS YkVMqPX0HaLoQ5XcXgcrCJo2Y8STqMWLEukj/araHoLRE7Kgw8L8YP/3Ru9Ah+rieKuU U8DfsN4Oaw0ZDdWJKOlfbF7EXKKvB+H2i+W4iKkK55yPdjCbrE1aYF+kucxv3KcrG9wX yibaV149SVcLp8ijlxTOglEHvwhZQKOh2ShKRRy6twJpvidWGaTJOGPM1SP+gqAyiLmU LmnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779261709; x=1779866509; h=to:cc:date:message-id:subject:mime-version:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=pGKpQ+LcdXD9UXpidd8rel3yKCPiXaKk24ftf6ncews=; b=hnNdLYWcgyf3VIKc0JeKWq0TWw5X29Y2nyGLqlUhg2US2uk/exRTojvUrBQqUSItHU GjyXihUB9ct8D0Y+EbhZvxCH0nnMcUjlVV9LhBZm3BlChOpaQ2A5197VbAnZWhGiPJ6x Zc+yEnT1a3PCIuDTrJFXN1eEt2zJkmjqjQ43enTV/Stn51NfwMaLoud2G4jE09VeNThZ Tyd1behrURsd2NlpXrCEwlgunik5PRF0K3nUm6J32h3RBx0RJDfCdnqG1sFquW7CdM1F yHBoSjVP74ucxhmGBUVnQqHqQDExhNobyXM3vvsBItHik659Rd3hKVrkjRSqqiUwpQOQ mquQ== X-Gm-Message-State: AOJu0YwDzJ3YX7N4EmGtIqx2DR3K9iE4xTAjEq6sAm02FVks+uxdsj2B 25VSiAY13McXLT78tQqot66JtYEh5aCu4tSmOYVRhs6eThCtVloZlPej2yY18JiYo48= X-Gm-Gg: Acq92OEsHirJB0g9mERWj7fzDFdWqtRgnElY8cPrGcsjOARZWpcG0mElvlvOATLTB7I /ApeMrscn2gzlepcmzl4lXDe+fImOnHvpH/sjKhpk/+UAmOLvrK/dm6fvIAMadwfRNl7zT4V9Ni G2WJjuUsMojha9YmSzLlf7rOURJzjGM0i7gFweRnAn+lG5AlfCI0W2FHvvWnFmbb8zqCzU/QINb 2HUXDH66mQr2YV7u0j4JEEBBf1etru17Ev5ufdWLnBjkrbBeWyuFAnZPu1z2+U5L+3dILNnKpT1 CX70Gx+hsK8eQXmErtap9BuvJ01uT9kLHZP/LHGMsIvCKH0adsTS9KmJiEJmZ2A/42kY2N26h+D aMGm93vbcQHU229EsYvouYFJFj67uGHHOyztKfWdI7wUOkhLgFztDXJfyw30QZOBrTSzHWWmsfu tKknRbsu5SQ+iL7JbVmiNcI3/73b7bKDc= X-Received: by 2002:a17:90a:c2cf:b0:35c:30a8:330 with SMTP id 98e67ed59e1d1-369517517eamr25918068a91.0.1779261709031; Wed, 20 May 2026 00:21:49 -0700 (PDT) Received: from smtpclient.apple ([45.32.121.103]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2bd5bd5fe67sm223713005ad.3.2026.05.20.00.21.46 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 May 2026 00:21:48 -0700 (PDT) From: Chao Li Content-Type: multipart/mixed; boundary="Apple-Mail=_EAFE13DB-AC28-4B7D-9706-C546CAB61ADC" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3864.400.21\)) Subject: Set notice receiver before libpq connection startup Message-Id: Date: Wed, 20 May 2026 15:21:08 +0800 Cc: Fujii Masao , vignesh C To: PostgreSQL-development X-Mailer: Apple Mail (2.3864.400.21) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --Apple-Mail=_EAFE13DB-AC28-4B7D-9706-C546CAB61ADC Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hi, While testing =E2=80=9CLog remote NOTICE, WARNING, and similar messages = using ereport()=E2=80=9D, I noticed that libpqsrv_notice_receiver is = only installed after libpqsrv_connect() finishes. As a result, NOTICE = messages generated during connection establishment are missed by = ereport() and are still printed to stderr. To reproduce the issue, I created a separate database called remotedb = and defined a login trigger that emits a NOTICE message: ``` CREATE DATABASE remotedb; \c remotedb CREATE OR REPLACE FUNCTION repro_login_notice() RETURNS event_trigger LANGUAGE plpgsql AS $$ BEGIN RAISE NOTICE 'startup notice from remotedb login trigger'; END; $$; CREATE EVENT TRIGGER repro_login_notice_trg ON login EXECUTE FUNCTION repro_login_notice(); ALTER EVENT TRIGGER repro_login_notice_trg ENABLE ALWAYS; ``` Then, from another database: ``` evantest=3D# create extension dblink; CREATE EXTENSION evantest=3D# SELECT dblink_connect('host=3D127.0.0.1 port=3D5432 = dbname=3Dremotedb user=3Dchaol sslmode=3Ddisable gssencmode=3Ddisable'); dblink_connect ---------------- OK (1 row) ``` In the system log, the NOTICE message is printed directly: ``` 2026-05-20 13:02:19.350 CST [24909] STATEMENT: SELECT = dblink_connect('host=3D127.0.0.1 port=3D5432 dbname=3Dremotedb = user=3Dchaol sslmode=3Ddisable gssencmode=3Ddisable'); NOTICE: startup notice from remotedb login trigger ``` To fix that, I think we should install libpqsrv_notice_receiver before = libpqsrv_connect_internal(). In the attached patch, I added two helpers: = libpqsrv_connect_with_notice_receiver() and = libpqsrv_connect_params_with_notice_receiver(). With the fix, the NOTICE message now looks like this: ``` 2026-05-20 14:44:49.296 CST [45567] LOG: received message via remote = connection: NOTICE: startup notice from remotedb login trigger 2026-05-20 14:44:49.296 CST [45567] STATEMENT: SELECT = dblink_connect('host=3D127.0.0.1 port=3D5432 dbname=3Dremotedb = user=3Dchaol sslmode=3Ddisable gssencmode=3Ddisable'); ``` Please see the attached patch for details. Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/ --Apple-Mail=_EAFE13DB-AC28-4B7D-9706-C546CAB61ADC Content-Disposition: attachment; filename=v1-0001-Set-notice-receiver-before-libpq-connection-start.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="v1-0001-Set-notice-receiver-before-libpq-connection-start.patch" Content-Transfer-Encoding: quoted-printable =46rom=20db52f5949884e57769b7ba7fc56be64c47ef1fa1=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20"Chao=20Li=20(Evan)"=20=0A= Date:=20Wed,=2020=20May=202026=2014:57:25=20+0800=0ASubject:=20[PATCH=20= v1]=20Set=20notice=20receiver=20before=20libpq=20connection=20startup=0A=0A= Some=20callers=20of=20libpqsrv_connect()=20and=20= libpqsrv_connect_params()=0Ainstall=20libpqsrv_notice_receiver=20after=20= the=20connection=20has=20been=0Aestablished.=20However,=20notices=20may=20= also=20be=20received=20while=0Alibpqsrv_connect_internal()=20is=20still=20= processing=20the=20asynchronous=0Aconnection=20startup.=0A=0AAdd=20= variants=20of=20these=20helpers=20that=20install=20a=20notice=20receiver=20= immediately=0Aafter=20PQconnectStart()=20or=20PQconnectStartParams(),=20= before=20entering=0Alibpqsrv_connect_internal().=20Use=20them=20in=20= dblink,=20postgres_fdw,=20and=0Alibpqwalreceiver,=20so=20notices=20= emitted=20during=20connection=20startup=20are=0Ahandled=20in=20the=20= same=20way=20as=20notices=20received=20after=20the=20connection=20is=0A= established.=0A=0AAuthor:=20Chao=20Li=20=0AReviewed-by:=0A= Discussion:=20https://postgr.es/m/=0A---=0A=20contrib/dblink/dblink.c=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=2015=20= ++++---=0A=20contrib/postgres_fdw/connection.c=20=20=20=20=20=20=20=20=20= =20=20=20=20|=2011=20+++--=0A=20.../libpqwalreceiver/libpqwalreceiver.c=20= =20=20=20=20=20=20|=2011=20+++--=0A=20= src/include/libpq/libpq-be-fe-helpers.h=20=20=20=20=20=20=20|=2042=20= ++++++++++++++-----=0A=204=20files=20changed,=2049=20insertions(+),=2030=20= deletions(-)=0A=0Adiff=20--git=20a/contrib/dblink/dblink.c=20= b/contrib/dblink/dblink.c=0Aindex=20d843eee7e97..2093aef990f=20100644=0A= ---=20a/contrib/dblink/dblink.c=0A+++=20b/contrib/dblink/dblink.c=0A@@=20= -222,7=20+222,10=20@@=20dblink_get_conn(char=20*conname_or_str,=0A=20=09=09= =09dblink_we_get_conn=20=3D=20WaitEventExtensionNew("DblinkGetConnect");=0A= =20=0A=20=09=09/*=20OK=20to=20make=20connection=20*/=0A-=09=09conn=20=3D=20= libpqsrv_connect(connstr,=20dblink_we_get_conn);=0A+=09=09conn=20=3D=20= libpqsrv_connect_with_notice_receiver(connstr,=0A+=09=09=09=09=09=09=09=09= =09=09=09=09=09=20dblink_we_get_conn,=0A+=09=09=09=09=09=09=09=09=09=09=09= =09=09=20libpqsrv_notice_receiver,=0A+=09=09=09=09=09=09=09=09=09=09=09=09= =09=20"received=20message=20via=20remote=20connection");=0A=20=0A=20=09=09= if=20(PQstatus(conn)=20=3D=3D=20CONNECTION_BAD)=0A=20=09=09{=0A@@=20= -235,9=20+238,6=20@@=20dblink_get_conn(char=20*conname_or_str,=0A=20=09=09= =09=09=09=20errdetail_internal("%s",=20msg)));=0A=20=09=09}=0A=20=0A-=09=09= PQsetNoticeReceiver(conn,=20libpqsrv_notice_receiver,=0A-=09=09=09=09=09=09= =09"received=20message=20via=20remote=20connection");=0A-=0A=20=09=09= dblink_security_check(conn,=20NULL,=20connstr);=0A=20=09=09if=20= (PQclientEncoding(conn)=20!=3D=20GetDatabaseEncoding())=0A=20=09=09=09= PQsetClientEncoding(conn,=20GetDatabaseEncodingName());=0A@@=20-321,7=20= +321,9=20@@=20dblink_connect(PG_FUNCTION_ARGS)=0A=20=09}=0A=20=0A=20=09= /*=20OK=20to=20make=20connection=20*/=0A-=09conn=20=3D=20= libpqsrv_connect(connstr,=20dblink_we_connect);=0A+=09conn=20=3D=20= libpqsrv_connect_with_notice_receiver(connstr,=20dblink_we_connect,=0A+=09= =09=09=09=09=09=09=09=09=09=09=09=20libpqsrv_notice_receiver,=0A+=09=09=09= =09=09=09=09=09=09=09=09=09=20"received=20message=20via=20remote=20= connection");=0A=20=0A=20=09if=20(PQstatus(conn)=20=3D=3D=20= CONNECTION_BAD)=0A=20=09{=0A@@=20-336,9=20+338,6=20@@=20= dblink_connect(PG_FUNCTION_ARGS)=0A=20=09=09=09=09=20= errdetail_internal("%s",=20msg)));=0A=20=09}=0A=20=0A-=09= PQsetNoticeReceiver(conn,=20libpqsrv_notice_receiver,=0A-=09=09=09=09=09=09= "received=20message=20via=20remote=20connection");=0A-=0A=20=09/*=20= check=20password=20actually=20used=20if=20not=20superuser=20*/=0A=20=09= dblink_security_check(conn,=20connname,=20connstr);=0A=20=0Adiff=20--git=20= a/contrib/postgres_fdw/connection.c=20= b/contrib/postgres_fdw/connection.c=0Aindex=203d2a8d0519d..0278f4a7cea=20= 100644=0A---=20a/contrib/postgres_fdw/connection.c=0A+++=20= b/contrib/postgres_fdw/connection.c=0A@@=20-646,9=20+646,11=20@@=20= connect_pg_server(ForeignServer=20*server,=20UserMapping=20*user)=0A=20=09= =09=09pgfdw_we_connect=20=3D=20= WaitEventExtensionNew("PostgresFdwConnect");=0A=20=0A=20=09=09/*=20OK=20= to=20make=20connection=20*/=0A-=09=09conn=20=3D=20= libpqsrv_connect_params(keywords,=20values,=0A-=09=09=09=09=09=09=09=09=09= =20=20=20false,=09/*=20expand_dbname=20*/=0A-=09=09=09=09=09=09=09=09=09=20= =20=20pgfdw_we_connect);=0A+=09=09conn=20=3D=20= libpqsrv_connect_params_with_notice_receiver(keywords,=20values,=0A+=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09false,=09/*=20expand_dbname=20*/=0A= +=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09pgfdw_we_connect,=0A+=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09libpqsrv_notice_receiver,=0A+=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09"received=20message=20via=20= remote=20connection");=0A=20=0A=20=09=09if=20(!conn=20||=20= PQstatus(conn)=20!=3D=20CONNECTION_OK)=0A=20=09=09=09ereport(ERROR,=0A@@=20= -657,9=20+659,6=20@@=20connect_pg_server(ForeignServer=20*server,=20= UserMapping=20*user)=0A=20=09=09=09=09=09=09=09server->servername),=0A=20= =09=09=09=09=09=20errdetail_internal("%s",=20= pchomp(PQerrorMessage(conn)))));=0A=20=0A-=09=09= PQsetNoticeReceiver(conn,=20libpqsrv_notice_receiver,=0A-=09=09=09=09=09=09= =09"received=20message=20via=20remote=20connection");=0A-=0A=20=09=09/*=20= Perform=20post-connection=20security=20checks.=20*/=0A=20=09=09= pgfdw_security_check(keywords,=20values,=20user,=20conn);=0A=20=0Adiff=20= --git=20a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c=20= b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c=0Aindex=20= 9f04c9ed25d..cc5f77d53f7=20100644=0A---=20= a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c=0A+++=20= b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c=0A@@=20= -223,9=20+223,11=20@@=20libpqrcv_connect(const=20char=20*conninfo,=20= bool=20replication,=20bool=20logical,=0A=20=0A=20=09conn=20=3D=20= palloc0_object(WalReceiverConn);=0A=20=09conn->streamConn=20=3D=0A-=09=09= libpqsrv_connect_params(keys,=20vals,=0A-=09=09=09=09=09=09=09=09=20/*=20= expand_dbname=20=3D=20*/=20true,=0A-=09=09=09=09=09=09=09=09= WAIT_EVENT_LIBPQWALRECEIVER_CONNECT);=0A+=09=09= libpqsrv_connect_params_with_notice_receiver(keys,=20vals,=0A+=09=09=09=09= =09=09=09=09=09=09=09=09=09=20=20/*=20expand_dbname=20=3D=20*/=20true,=0A= +=09=09=09=09=09=09=09=09=09=09=09=09=09=20= WAIT_EVENT_LIBPQWALRECEIVER_CONNECT,=0A+=09=09=09=09=09=09=09=09=09=09=09= =09=09=20libpqsrv_notice_receiver,=0A+=09=09=09=09=09=09=09=09=09=09=09=09= =09=20"received=20message=20via=20replication");=0A=20=0A=20=09if=20= (options_val=20!=3D=20NULL)=0A=20=09=09pfree(options_val);=0A@@=20-245,9=20= +247,6=20@@=20libpqrcv_connect(const=20char=20*conninfo,=20bool=20= replication,=20bool=20logical,=0A=20=09=09=09=09=20errhint("Target=20= server's=20authentication=20method=20must=20be=20changed,=20or=20set=20= password_required=3Dfalse=20in=20the=20subscription=20parameters.")));=0A= =20=09}=0A=20=0A-=09PQsetNoticeReceiver(conn->streamConn,=20= libpqsrv_notice_receiver,=0A-=09=09=09=09=09=09"received=20message=20via=20= replication");=0A-=0A=20=09/*=0A=20=09=20*=20Set=20always-secure=20= search=20path=20for=20the=20cases=20where=20the=20connection=20is=0A=20=09= =20*=20used=20to=20run=20SQL=20queries,=20so=20malicious=20users=20can't=20= get=20control.=0Adiff=20--git=20= a/src/include/libpq/libpq-be-fe-helpers.h=20= b/src/include/libpq/libpq-be-fe-helpers.h=0Aindex=20= 85d8b63f019..0571bb1fe50=20100644=0A---=20= a/src/include/libpq/libpq-be-fe-helpers.h=0A+++=20= b/src/include/libpq/libpq-be-fe-helpers.h=0A@@=20-43,6=20+43,23=20@@=20= static=20inline=20void=20libpqsrv_connect_internal(PGconn=20*conn,=20= uint32=20wait_event_inf=0A=20static=20inline=20PGresult=20= *libpqsrv_get_result_last(PGconn=20*conn,=20uint32=20wait_event_info);=0A= =20static=20inline=20PGresult=20*libpqsrv_get_result(PGconn=20*conn,=20= uint32=20wait_event_info);=0A=20=0A+static=20inline=20PGconn=20*=0A= +libpqsrv_connect_with_notice_receiver(const=20char=20*conninfo,=0A+=09=09= =09=09=09=09=09=09=09=20=20uint32=20wait_event_info,=0A+=09=09=09=09=09=09= =09=09=09=20=20PQnoticeReceiver=20proc,=20void=20*arg)=0A+{=0A+=09PGconn=09= =20=20=20*conn=20=3D=20NULL;=0A+=0A+=09libpqsrv_connect_prepare();=0A+=0A= +=09conn=20=3D=20PQconnectStart(conninfo);=0A+=09if=20(conn=20!=3D=20= NULL=20&&=20proc=20!=3D=20NULL)=0A+=09=09PQsetNoticeReceiver(conn,=20= proc,=20arg);=0A+=0A+=09libpqsrv_connect_internal(conn,=20= wait_event_info);=0A+=0A+=09return=20conn;=0A+}=0A=20=0A=20/*=0A=20=20*=20= PQconnectdb()=20wrapper=20that=20reserves=20a=20file=20descriptor=20and=20= processes=0A@@=20-54,12=20+71,24=20@@=20static=20inline=20PGresult=20= *libpqsrv_get_result(PGconn=20*conn,=20uint32=20wait_event_info=0A=20=20= */=0A=20static=20inline=20PGconn=20*=0A=20libpqsrv_connect(const=20char=20= *conninfo,=20uint32=20wait_event_info)=0A+{=0A+=09return=20= libpqsrv_connect_with_notice_receiver(conninfo,=20wait_event_info,=20= NULL,=20NULL);=0A+}=0A+=0A+static=20inline=20PGconn=20*=0A= +libpqsrv_connect_params_with_notice_receiver(const=20char=20*const=20= *keywords,=0A+=09=09=09=09=09=09=09=09=09=09=09=20const=20char=20*const=20= *values,=0A+=09=09=09=09=09=09=09=09=09=09=09=20int=20expand_dbname,=0A+=09= =09=09=09=09=09=09=09=09=09=09=20uint32=20wait_event_info,=0A+=09=09=09=09= =09=09=09=09=09=09=09=20PQnoticeReceiver=20proc,=20void=20*arg)=0A=20{=0A= =20=09PGconn=09=20=20=20*conn=20=3D=20NULL;=0A=20=0A=20=09= libpqsrv_connect_prepare();=0A=20=0A-=09conn=20=3D=20= PQconnectStart(conninfo);=0A+=09conn=20=3D=20= PQconnectStartParams(keywords,=20values,=20expand_dbname);=0A+=09if=20= (conn=20!=3D=20NULL=20&&=20proc=20!=3D=20NULL)=0A+=09=09= PQsetNoticeReceiver(conn,=20proc,=20arg);=0A=20=0A=20=09= libpqsrv_connect_internal(conn,=20wait_event_info);=0A=20=0A@@=20-76,15=20= +105,8=20@@=20libpqsrv_connect_params(const=20char=20*const=20*keywords,=0A= =20=09=09=09=09=09=09int=20expand_dbname,=0A=20=09=09=09=09=09=09uint32=20= wait_event_info)=0A=20{=0A-=09PGconn=09=20=20=20*conn=20=3D=20NULL;=0A-=0A= -=09libpqsrv_connect_prepare();=0A-=0A-=09conn=20=3D=20= PQconnectStartParams(keywords,=20values,=20expand_dbname);=0A-=0A-=09= libpqsrv_connect_internal(conn,=20wait_event_info);=0A-=0A-=09return=20= conn;=0A+=09return=20= libpqsrv_connect_params_with_notice_receiver(keywords,=20values,=20= expand_dbname,=0A+=09=09=09=09=09=09=09=09=09=09=09=09=09=09= wait_event_info,=20NULL,=20NULL);=0A=20}=0A=20=0A=20/*=0A--=20=0A2.50.1=20= (Apple=20Git-155)=0A=0A= --Apple-Mail=_EAFE13DB-AC28-4B7D-9706-C546CAB61ADC--