Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:81552 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 64811 invoked from network); 2 Feb 2015 07:11:41 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 2 Feb 2015 07:11:41 -0000 Authentication-Results: pb1.pair.com smtp.mail=xinchen.h@zend.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=laruence@php.net; sender-id=unknown Received-SPF: pass (pb1.pair.com: domain zend.com designates 209.85.215.51 as permitted sender) X-PHP-List-Original-Sender: xinchen.h@zend.com X-Host-Fingerprint: 209.85.215.51 mail-la0-f51.google.com Received: from [209.85.215.51] ([209.85.215.51:41613] helo=mail-la0-f51.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id EE/21-58765-8232FC45 for ; Mon, 02 Feb 2015 02:11:36 -0500 Received: by mail-la0-f51.google.com with SMTP id ge10so37845303lab.10 for ; Sun, 01 Feb 2015 23:11:33 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type:content-transfer-encoding; bh=P/1CNGMbH0HiUbrWZl4SAZ8pyh+Xbd/1PGqgq7nfJk4=; b=dFV9cgnDDkxQ4nXBwkZP6Mw//91Rc7W1TS530oBynCHlaxvor9jZVPmilisngBP4TZ wzxkTCxDEYHjFUL8feae1SoKVXTb5+Z/auPKaWuIOxazwjAUlImbnlrbmXWeHfY+6noc os3wG72S4eW77Z9Jq6p8UDdSZDB9o5lmLPSUjnnG5iqssCo5qCl5GT9NZjlGk8DqR13N psBwKEoTfJUBPfUr4O55rhp7JWq8rO0fYqlGclWLca+3acMlF5EHsV1xGAV/DyhuVwTl 2DTM7zeD9JL5D4BBcIVtdjwGK3iVKtsffjiWw3RNbWzftvW27yE63G2Pa6vH+9HwzxUw qSdQ== X-Gm-Message-State: ALoCoQlg6n0dVBDujkHFkHdUZOGpNU4hlobRfcaLNsak2AwNj47iPyjWfmtFNWxF+GFN7/NH89tVHD4DT+nHbnTUqSPf4PRyMTgZKOEvMvP/fq+FEt4PwSNCRb18CJ5LxsiO3NYBujcERak16dxtVQmE2DEbE5IC5w== X-Received: by 10.152.42.198 with SMTP id q6mr17424612lal.48.1422861093393; Sun, 01 Feb 2015 23:11:33 -0800 (PST) Received: from mail-la0-f44.google.com (mail-la0-f44.google.com. [209.85.215.44]) by mx.google.com with ESMTPSA id eb8sm4205412lbb.28.2015.02.01.23.11.32 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 01 Feb 2015 23:11:32 -0800 (PST) Received: by mail-la0-f44.google.com with SMTP id s18so37859518lam.3 for ; Sun, 01 Feb 2015 23:11:31 -0800 (PST) X-Received: by 10.152.37.106 with SMTP id x10mr18493697laj.52.1422861091492; Sun, 01 Feb 2015 23:11:31 -0800 (PST) MIME-Version: 1.0 Received: by 10.114.28.193 with HTTP; Sun, 1 Feb 2015 23:11:11 -0800 (PST) In-Reply-To: <004e01d03eb4$a4dd8240$ee9886c0$@tekwire.net> References: <004e01d03eb4$a4dd8240$ee9886c0$@tekwire.net> Date: Mon, 2 Feb 2015 15:11:11 +0800 Message-ID: To: francois@tekwire.net Cc: PHP Internals , Dmitry Stogov Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [PHP-DEV] [DICUSS]Cleanup resource handling APIs From: laruence@php.net (Xinchen Hui) Hey: On Mon, Feb 2, 2015 at 2:51 PM, Fran=C3=A7ois Laupretre wrote: >> De : Xinchen Hui [mailto:laruence@php.net] >> we used to use lval of zval as a handle to access resource type.. >> >> but now, we introduced a new type IS_RESOURCE, which make the >> handle(id) sort of redundant . > > Wrong. The IS_RESOURCE type has nothing to do with PHP 7. Only zend_resou= rce is new. And handle is not redundant. of course it's a typo. I meant zend_resource > >> further more, the common usage when handling resource is like: >> >> if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &result, >> &offset) =3D=3D FAILURE) { >> return; >> } >> ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL >> result", le_result); >> >> as you can see, we use "r" to receive a IS_RESOURCE type, that >> means, check the type in ZEND_FETCH_RESOURCE is overhead.. > > There's no overhead here. Zend_parse_parameters checks that received arg = is IS_RESOURCE. Fetch then checks that received resource is one of the acce= pted resource types. Sorry to say that, but are you sure you understand the= difference between zval types and resource types ? ..... do you really read the FETCH_RESOURCE? ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id, const char *resource_type_name, int *found_resource_type, int num_resource_types, ...) { int actual_resource_type; // void *resource; va_list resource_types; int i; zend_resource *res; const char *space; const char *class_name; if (default_id=3D=3D-1) { /* use id */ if (!passed_id) { if (resource_type_name) { class_name =3D get_active_class_name(&space); zend_error(E_WARNING, "%s%s%s(): no %s resource supplied", class_name, space, get_active_function_name(), resource_type_name); } return NULL; } else if (Z_TYPE_P(passed_id) !=3D IS_RESOURCE) { // < =3D=3D=3D w= hat are this? if (resource_type_name) { class_name =3D get_active_class_name(&space); zend_error(E_WARNING, "%s%s%s(): supplied argument is not a valid %s resource", class_name, space, get_active_function_name(), resource_type_name); } return NULL; } > >> ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id, >> const char *resource_type_name, int *found_resource_type, int >> num_resource_types, ...) >> >> we use va_args to passing resource type, that means, the rescue >> type arguments can not be passed by register but by stack.. which is a >> little low effiicient . > > What do you mean with 'rescue' type ? expected resource_type > > Fetch is supposed to check for a variable number of possible resource typ= es. It could probably be restricted to 2 possible types as, generally, it i= s the maximum (one for non-persistent, one for persistent). But I am not su= re the overhead of passing arg on the stack justifies a change. Remember th= at id is searched in an array, which takes probably much more time that pus= hing/popping one or two arguments. > >> so, I'd like propose a zend_resource handling API cleanup.. >> >> 1. DROP ZEND_REGISTER_RESOURCE/FETCH_RESOURCE. >> >> 2. add : >> >> ZEND_API void *zend_fetch_resource(zend_resource *res, const >> char *resource_type_name, int resource_type); >> ZEND_API void *zend_fetch_resource2(zend_resource *res, const char >> *resource_type_name, int *found_type, int resource_type, int >> resource_type2); >> ZEND_API void *zend_fetch_resource_ex(zval *res, const char >> *resource_type_name, int resource_type); >> ZEND_API void *zend_fetch_resource2_ex(zval *res, const char >> *resource_type_name, int *found_type, int resource_type, int >> resource_type2); > > If you drop ZEND_REGISTER_RESOURCE, how do you register new resources ? O= r do you mean you don't register them any more ? But registering them is ma= ndatory if we want them to be freed when request ends. > >> furthermore, I'd like to discuss remove the handle in zend_resource stru= ct.. >> >> it may breaks some usage (use resource as long/double/string) >> >> case IS_RESOURCE: { >> char buf[sizeof("Resource id #") + MAX_LENGTH_OF_LONG]; >> int len; >> >> len =3D snprintf(buf, sizeof(buf), "Resource id #" >>ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op)); >> return zend_string_init(buf, len, 0); >> } > > OK. You want to remove resource registration. But resources don't work th= is way (see http://devzone.zend.com/446/extension-writing-part-iii-resource= s/). If you remove the handle, you remove the whole zend_list API. > > The zend_resource struct is not a structure you may fill with random data= . Using the handle to store long/double/string is not a legitimate usage. ....I think you don't understand what I am talking about. sorry thanks > > Regards > > Fran=C3=A7ois > > > > --=20 Xinchen Hui @Laruence http://www.laruence.com/