Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:81556 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 71249 invoked from network); 2 Feb 2015 07:41:03 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 2 Feb 2015 07:41:03 -0000 Authentication-Results: pb1.pair.com header.from=laruence@php.net; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=xinchen.h@zend.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 209.85.215.43 as permitted sender) X-PHP-List-Original-Sender: xinchen.h@zend.com X-Host-Fingerprint: 209.85.215.43 mail-la0-f43.google.com Received: from [209.85.215.43] ([209.85.215.43:36334] helo=mail-la0-f43.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id FD/A0-02376-50A2FC45 for ; Mon, 02 Feb 2015 02:40:54 -0500 Received: by mail-la0-f43.google.com with SMTP id q1so37956495lam.2 for ; Sun, 01 Feb 2015 23:40:50 -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=NcwVB0JDZPy9ejDjFd7J8BIgh56iYqhFcovsP5ai5HU=; b=S4TAheekbog7Uf4nGcuFIrUUxwwvUPJQVVpopM/HHcmso9Hu5ymSsFOcsm3M3QfqnL D9BaRAKl115Rt0i4A24kS6IGqtFkIcGTwSwUthSQ/AAApxbk5esD9iBIf2SNMaP+1i9e YTAjSjroMirUN1S+dgCAsfkiwh2K5NgYPbA2uSbda47eG7dv6QnrmAFwLKBXoY6RLx65 Rhqo6TJH/ac+Zjl9o2EsmlEH40PGhOnpIlIfoa3Oqqjkzp3kL45HzVsavENgyDi7zzsx 03TszfaNrvahBBaeDyyZ5AJHqZEJDQ8ZilsHABfGVjoE7zrJTQRy72ZzB+FASEdOYwca ExVg== X-Gm-Message-State: ALoCoQkRjIN/goQRD0RawTavyPqMSqRcm6f/uttL1q9Img32FsDExy0EB0cNoOLV5PvG6K7Bg3PZfaDcqW4zAEXtXcXFxbyzwrZnTgtYrZ4W2KTsFzPnxtsiNnOK8GBZBjgUIjf9ZATsRDg7lPULcDDp06/MHru/sQ== X-Received: by 10.152.10.65 with SMTP id g1mr5993586lab.84.1422862850624; Sun, 01 Feb 2015 23:40:50 -0800 (PST) Received: from mail-la0-f54.google.com (mail-la0-f54.google.com. [209.85.215.54]) by mx.google.com with ESMTPSA id p5sm4213811laj.0.2015.02.01.23.40.49 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 01 Feb 2015 23:40:49 -0800 (PST) Received: by mail-la0-f54.google.com with SMTP id hv19so37749040lab.13 for ; Sun, 01 Feb 2015 23:40:48 -0800 (PST) X-Received: by 10.152.37.106 with SMTP id x10mr18586729laj.52.1422862848743; Sun, 01 Feb 2015 23:40:48 -0800 (PST) MIME-Version: 1.0 Received: by 10.114.28.193 with HTTP; Sun, 1 Feb 2015 23:40:28 -0800 (PST) In-Reply-To: References: <004e01d03eb4$a4dd8240$ee9886c0$@tekwire.net> Date: Mon, 2 Feb 2015 15:40:28 +0800 Message-ID: To: Anatol Belski Cc: francois , 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 3:35 PM, Anatol Belski wrote= : > Hi, > > On Mon, February 2, 2015 08:11, Xinchen Hui wrote: >> 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_resource 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 accepted 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; co= nst >> 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 what >> 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 >>> types. It could probably be restricted to 2 possible types as, >>> generally, it is the maximum (one for non-persistent, one for >>> persistent). But I am not sure the overhead of passing arg on the stack >>> justifies a change. Remember that id is searched in an array, which >>> takes probably much more time that pushing/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, cons= t >>>> 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 ? >>> Or do you mean you don't register them any more ? But registering them >>> is mandatory if we want them to be freed when request ends. >>> >>>> furthermore, I'd like to discuss remove the handle in zend_resource >>>> struct.. >>>> >>>> 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 >>> this way (see >>> http://devzone.zend.com/446/extension-writing-part-iii-resources/). 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 >> >> > I was writing about it last year as well > http://marc.info/?l=3Dphp-internals&m=3D142006455308305&w=3D2 , slightly > different idea. Annd there is also a short piece of code to illustrate: > https://gist.github.com/weltling/9367db5e242ef7e60042 ... > > The integer resource looks like is needed at some places, so my suggestio= n > was to split zend_fetch_resource function like illustrated in the patch. > At 99% of places that integer link is just passed as -1, so then having i= t > be present always in the signature is just a waste of "resources" :) for now, we still keep the handle which could be accessed by Z_RES_HANDLE_P I just talked about remove it later maybe. thanks > > Regards > > Anatol > --=20 Xinchen Hui @Laruence http://www.laruence.com/