diff --git a/CMakeLists.txt b/CMakeLists.txt index aa4705a1..3c11989e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,13 +24,13 @@ cmake_minimum_required(VERSION 3.0) # XXX using 1.8.90 instead of 1.9.0-DEV -project(nghttp2 VERSION 1.12.90) +project(nghttp2 VERSION 1.13.90) # See versioning rule: # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html -set(LT_CURRENT 22) +set(LT_CURRENT 23) set(LT_REVISION 0) -set(LT_AGE 8) +set(LT_AGE 9) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(Version) diff --git a/README.rst b/README.rst index 4d83a0ac..f41ead9c 100644 --- a/README.rst +++ b/README.rst @@ -179,10 +179,10 @@ To compile the source code, gcc >= 4.8.3 or clang >= 3.4 is required. Notes for building on Windows (MSVC) ------------------------------------ -The easiest way to build native Windows nghttp2 dll is use -[cmake](https://cmake.org/). The free version of [Visual C++ Build -Tools](http://landinghub.visualstudio.com/visual-cpp-build-tools) -works fine. +The easiest way to build native Windows nghttp2 dll is use `cmake +`_. The free version of `Visual C++ Build Tools +`_ works +fine. 1. Install cmake for windows 2. Open "Visual C++ ... Native Build Tool Command Prompt", and inside diff --git a/android-config b/android-config index e3a88179..af259636 100755 --- a/android-config +++ b/android-config @@ -39,9 +39,8 @@ PATH="$TOOLCHAIN"/bin:"$PATH" --without-libxml2 \ --disable-python-bindings \ --disable-examples \ - --enable-werror \ - CC="$TOOLCHAIN"/bin/clang \ - CXX="$TOOLCHAIN"/bin/clang++ \ + CC="$TOOLCHAIN"/bin/arm-linux-androideabi-gcc \ + CXX="$TOOLCHAIN"/bin/arm-linux-androideabi-g++ \ CPPFLAGS="-fPIE -I$PREFIX/include" \ PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \ LDFLAGS="-fPIE -pie -L$PREFIX/lib" diff --git a/configure.ac b/configure.ac index 2eeca1f1..ab9bd2ed 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ dnl Do not change user variables! dnl http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html AC_PREREQ(2.61) -AC_INIT([nghttp2], [1.13.0-DEV], [t-tujikawa@users.sourceforge.net]) +AC_INIT([nghttp2], [1.14.0-DEV], [t-tujikawa@users.sourceforge.net]) AC_CONFIG_AUX_DIR([.]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([config.h]) @@ -44,9 +44,9 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) dnl See versioning rule: dnl http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html -AC_SUBST(LT_CURRENT, 22) +AC_SUBST(LT_CURRENT, 23) AC_SUBST(LT_REVISION, 0) -AC_SUBST(LT_AGE, 8) +AC_SUBST(LT_AGE, 9) major=`echo $PACKAGE_VERSION |cut -d. -f1 | sed -e "s/[^0-9]//g"` minor=`echo $PACKAGE_VERSION |cut -d. -f2 | sed -e "s/[^0-9]//g"` diff --git a/doc/_exts/sphinxcontrib/rubydomain.py b/doc/_exts/sphinxcontrib/rubydomain.py index bba02f5d..79dbf655 100644 --- a/doc/_exts/sphinxcontrib/rubydomain.py +++ b/doc/_exts/sphinxcontrib/rubydomain.py @@ -15,6 +15,7 @@ from docutils import nodes from docutils.parsers.rst import directives from sphinx import addnodes +from sphinx import version_info from sphinx.roles import XRefRole from sphinx.locale import l_, _ from sphinx.domains import Domain, ObjType, Index @@ -231,8 +232,8 @@ class RubyObject(ObjectDescription): indextext = self.get_index_text(modname, name_cls) if indextext: - self.indexnode['entries'].append(('single', indextext, - fullname, fullname)) + self.indexnode['entries'].append( + _make_index('single', indextext, fullname, fullname)) def before_content(self): # needed for automatic qualification of members (reset in subclasses) @@ -415,11 +416,19 @@ class RubyModule(Directive): # modindex currently if not noindex: indextext = _('%s (module)') % modname - inode = addnodes.index(entries=[('single', indextext, - 'module-' + modname, modname)]) + inode = addnodes.index(entries=[_make_index( + 'single', indextext, 'module-' + modname, modname)]) ret.append(inode) return ret +def _make_index(entrytype, entryname, target, ignored, key=None): + # Sphinx 1.4 introduced backward incompatible changes, it now + # requires 5 tuples. Last one is categorization key. See + # http://www.sphinx-doc.org/en/stable/extdev/nodes.html#sphinx.addnodes.index + if version_info >= (1, 4, 0, '', 0): + return (entrytype, entryname, target, ignored, key) + else: + return (entrytype, entryname, target, ignored) class RubyCurrentModule(Directive): """ diff --git a/doc/h2load.1 b/doc/h2load.1 index f116ab28..4b1b81ea 100644 --- a/doc/h2load.1 +++ b/doc/h2load.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "H2LOAD" "1" "June 26, 2016" "1.12.0" "nghttp2" +.TH "H2LOAD" "1" "Jul 21, 2016" "1.13.0" "nghttp2" .SH NAME h2load \- HTTP/2 benchmarking tool . @@ -151,7 +151,7 @@ representing the number of connections to be made per rate period. The maximum number of connections to be made is given in \fI\%\-c\fP option. This rate will be distributed among threads as evenly as possible. For -example, with \fB\-t2\fP and \fB\-r4\fP, each thread gets 2 +example, with \fI\%\-t\fP2 and \fI\%\-r\fP4, each thread gets 2 connections per period. When the rate is 0, the program will run as it normally does, creating connections at whatever variable rate it wants. The default value for @@ -414,7 +414,7 @@ performance. To set smaller flow control window, use \fI\%\-w\fP and window size described in HTTP/2 and SPDY protocol specification. .SH SEE ALSO .sp -\fInghttp(1)\fP, \fInghttpd(1)\fP, \fInghttpx(1)\fP +\fBnghttp(1)\fP, \fBnghttpd(1)\fP, \fBnghttpx(1)\fP .SH AUTHOR Tatsuhiro Tsujikawa .SH COPYRIGHT diff --git a/doc/h2load.1.rst b/doc/h2load.1.rst index 6947f283..d059b81a 100644 --- a/doc/h2load.1.rst +++ b/doc/h2load.1.rst @@ -120,7 +120,7 @@ OPTIONS rate period. The maximum number of connections to be made is given in :option:`-c` option. This rate will be distributed among threads as evenly as possible. For - example, with :option:`-t2` and :option:`\-r4`, each thread gets 2 + example, with :option:`-t`\2 and :option:`-r`\4, each thread gets 2 connections per period. When the rate is 0, the program will run as it normally does, creating connections at whatever variable rate it wants. The default value for diff --git a/doc/nghttp.1 b/doc/nghttp.1 index 75c171f4..e1273080 100644 --- a/doc/nghttp.1 +++ b/doc/nghttp.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "NGHTTP" "1" "June 26, 2016" "1.12.0" "nghttp2" +.TH "NGHTTP" "1" "Jul 21, 2016" "1.13.0" "nghttp2" .SH NAME nghttp \- HTTP/2 client . @@ -300,7 +300,7 @@ stream 11 with the weight 12. The other resources (e.g., icon) depend on stream 11 with the weight 2. .SH SEE ALSO .sp -\fInghttpd(1)\fP, \fInghttpx(1)\fP, \fIh2load(1)\fP +\fBnghttpd(1)\fP, \fBnghttpx(1)\fP, \fBh2load(1)\fP .SH AUTHOR Tatsuhiro Tsujikawa .SH COPYRIGHT diff --git a/doc/nghttp.1.rst b/doc/nghttp.1.rst index b79fe34d..05c0b074 100644 --- a/doc/nghttp.1.rst +++ b/doc/nghttp.1.rst @@ -208,7 +208,9 @@ implementation. When connection is established, nghttp sends 5 PRIORITY frames to idle streams 3, 5, 7, 9 and 11 to create "anchor" nodes in dependency -tree:: +tree: + +.. code-block:: text +-----+ |id=0 | diff --git a/doc/nghttp.h2r b/doc/nghttp.h2r index 92a8fa73..9d2a90ef 100644 --- a/doc/nghttp.h2r +++ b/doc/nghttp.h2r @@ -12,7 +12,9 @@ implementation. When connection is established, nghttp sends 5 PRIORITY frames to idle streams 3, 5, 7, 9 and 11 to create "anchor" nodes in dependency -tree:: +tree: + +.. code-block:: text +-----+ |id=0 | diff --git a/doc/nghttpd.1 b/doc/nghttpd.1 index 789ce9a9..57d30b2a 100644 --- a/doc/nghttpd.1 +++ b/doc/nghttpd.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "NGHTTPD" "1" "June 26, 2016" "1.12.0" "nghttp2" +.TH "NGHTTPD" "1" "Jul 21, 2016" "1.13.0" "nghttp2" .SH NAME nghttpd \- HTTP/2 server . @@ -209,7 +209,7 @@ The argument is an integer and an optional unit (e.g., 10K is 10 * 1024). Units are K, M and G (powers of 1024). .SH SEE ALSO .sp -\fInghttp(1)\fP, \fInghttpx(1)\fP, \fIh2load(1)\fP +\fBnghttp(1)\fP, \fBnghttpx(1)\fP, \fBh2load(1)\fP .SH AUTHOR Tatsuhiro Tsujikawa .SH COPYRIGHT diff --git a/doc/nghttpx.1 b/doc/nghttpx.1 index b2a006c0..394a71ad 100644 --- a/doc/nghttpx.1 +++ b/doc/nghttpx.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "NGHTTPX" "1" "June 26, 2016" "1.12.0" "nghttp2" +.TH "NGHTTPX" "1" "Jul 21, 2016" "1.13.0" "nghttp2" .SH NAME nghttpx \- HTTP/2 proxy . @@ -1792,7 +1792,7 @@ hostname is allowed in command\-line or configuration file is read using \fI\%\-\-conf\fP\&. .SH SEE ALSO .sp -\fInghttp(1)\fP, \fInghttpd(1)\fP, \fIh2load(1)\fP +\fBnghttp(1)\fP, \fBnghttpd(1)\fP, \fBh2load(1)\fP .SH AUTHOR Tatsuhiro Tsujikawa .SH COPYRIGHT diff --git a/doc/nghttpx.1.rst b/doc/nghttpx.1.rst index 0b54924e..b11dda64 100644 --- a/doc/nghttpx.1.rst +++ b/doc/nghttpx.1.rst @@ -1199,7 +1199,7 @@ backend server and extracts URI-reference with parameter and pushes those URIs to the frontend client. Here is a sample Link header field to initiate server push: -.. code-block:: http +.. code-block:: text Link: ; rel=preload Link: ; rel=preload diff --git a/doc/nghttpx.h2r b/doc/nghttpx.h2r index a0621d3f..f8dc305b 100644 --- a/doc/nghttpx.h2r +++ b/doc/nghttpx.h2r @@ -85,7 +85,7 @@ backend server and extracts URI-reference with parameter and pushes those URIs to the frontend client. Here is a sample Link header field to initiate server push: -.. code-block:: http +.. code-block:: text Link: ; rel=preload Link: ; rel=preload diff --git a/doc/sources/building-android-binary.rst b/doc/sources/building-android-binary.rst index 7de375e5..8a859509 100644 --- a/doc/sources/building-android-binary.rst +++ b/doc/sources/building-android-binary.rst @@ -17,19 +17,16 @@ installed in the following way. First, let us introduce under ``$ANDROID_HOME/toolchain``. An user can freely choose the path for ``ANDROID_HOME``. For example, to install toolchain under ``$ANDROID_HOME/toolchain``, do this in the the directory where NDK is -unpacked:: +unpacked: - $ build/tools/make-standalone-toolchain.sh \ - --install-dir=$ANDROID_HOME/toolchain \ - --toolchain=arm-linux-androideabi-4.9 \ - --llvm-version=3.5 \ - --platform=android-16 +.. code-block:: text -The additional flag ``--system=linux-x86_64`` may be required if you -are using x86_64 system. + $ build/tools/make_standalone_toolchain.py \ + --arch arm --api 16 --stl gnustl + --install-dir $ANDROID_HOME/toolchain -The platform level is not important here because we don't use Android -specific C/C++ API. +The API level (``--api``) is not important here because we don't use +Android specific C/C++ API. The dependent libraries, such as OpenSSL and libev should be built with the toolchain and installed under ``$ANDROID_HOME/usr/local``. @@ -45,7 +42,9 @@ spdylay as well. Before running ``android-config`` and ``android-make``, ``ANDROID_HOME`` environment variable must be set to point to the -correct path. Also add ``$ANDROID_HOME/toolchain/bin`` to ``PATH``:: +correct path. Also add ``$ANDROID_HOME/toolchain/bin`` to ``PATH``: + +.. code-block:: text $ export PATH=$PATH:$ANDROID_HOME/toolchain/bin @@ -133,24 +132,24 @@ To configure spdylay, use the following script: #!/bin/sh -e if [ -z "$ANDROID_HOME" ]; then - echo 'No $ANDROID_HOME specified.' - exit 1 + echo 'No $ANDROID_HOME specified.' + exit 1 fi PREFIX=$ANDROID_HOME/usr/local TOOLCHAIN=$ANDROID_HOME/toolchain PATH=$TOOLCHAIN/bin:$PATH ./configure \ - --disable-shared \ - --host=arm-linux-androideabi \ - --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ - --prefix=$PREFIX \ - --without-libxml2 \ - --disable-src \ - --disable-examples \ - CPPFLAGS="-I$PREFIX/include" \ - PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \ - LDFLAGS="-L$PREFIX/lib" + --disable-shared \ + --host=arm-linux-androideabi \ + --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ + --prefix=$PREFIX \ + --without-libxml2 \ + --disable-src \ + --disable-examples \ + CPPFLAGS="-I$PREFIX/include" \ + PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \ + LDFLAGS="-L$PREFIX/lib" And run ``make install`` to build and install. @@ -159,6 +158,8 @@ then ``android-make`` to compile nghttp2 source files. If all went well, application binaries, such as nghttpx, are created under src directory. Strip debugging information from the binary -using the following command:: +using the following command: + +.. code-block:: text $ arm-linux-androideabi-strip src/nghttpx diff --git a/doc/sources/nghttpx-howto.rst b/doc/sources/nghttpx-howto.rst index 109bdb4e..5fa3002e 100644 --- a/doc/sources/nghttpx-howto.rst +++ b/doc/sources/nghttpx-howto.rst @@ -48,12 +48,16 @@ explicitly. The backend is supposed to be Web server. For example, to make nghttpx listen to encrypted HTTP/2 requests at port 8443, and a backend Web server is configured to listen to HTTP request at port -8080 in the same host, run nghttpx command-line like this:: +8080 in the same host, run nghttpx command-line like this: + +.. code-block:: text $ nghttpx -f0.0.0.0,8443 -b127.0.0.1,8080 /path/to/server.key /path/to/server.crt Then HTTP/2 enabled client can access to the nghttpx in HTTP/2. For -example, you can send GET request to the server using nghttp:: +example, you can send GET request to the server using nghttp: + +.. code-block:: text $ nghttp -nv https://localhost:8443/ @@ -89,7 +93,9 @@ connection, use :option:`--backend` option, and specify ``h2`` in For example, to make nghttpx listen to encrypted HTTP/2 requests at port 8443, and a backend HTTP proxy server is configured to listen to HTTP/1 request at port 8080 in the same host, run nghttpx command-line -like this:: +like this: + +.. code-block:: text $ nghttpx -s -f'*,8443' -b127.0.0.1,8080 /path/to/server.key /path/to/server.crt @@ -118,13 +124,17 @@ to proxy.pac file, something like this: file:///path/to/proxy.pac -For Chromium, use following command-line:: +For Chromium, use following command-line: + +.. code-block:: text $ google-chrome --proxy-pac-url=file:///path/to/proxy.pac --use-npn As HTTP/1 proxy server, Squid may work as out-of-box. Traffic server requires to be configured as forward proxy. Here is the minimum -configuration items to edit:: +configuration items to edit: + +.. code-block:: text CONFIG proxy.config.reverse_proxy.enabled INT 0 CONFIG proxy.config.url_remap.remap_required INT 0 @@ -152,9 +162,9 @@ Enable SSL/TLS on memcached connection -------------------------------------- By default, memcached connection is not encrypted. To enable -encryption, use :option:`--tls-ticket-key-memcached-tls` for TLS -ticket key, and use :option:`--tls-session-cache-memcached-tls` for -TLS session cache. +encryption, use ``tls`` keyword in +:option:`--tls-ticket-key-memcached` for TLS ticket key, and +:option:`--tls-session-cache-memcached` for TLS session cache. Specifying additional server certificates ----------------------------------------- diff --git a/doc/sources/python-apiref.rst b/doc/sources/python-apiref.rst index d9d8494c..d0a0b331 100644 --- a/doc/sources/python-apiref.rst +++ b/doc/sources/python-apiref.rst @@ -140,7 +140,9 @@ HTTP/2 servers Python 3.4 or later is required to use these objects. To explicitly configure nghttp2 build to use Python 3.4, specify the ``PYTHON`` variable to the path to Python 3.4 executable when - invoking configure script like this:: + invoking configure script like this: + + .. code-block:: text $ ./configure PYTHON=/usr/bin/python3.4 diff --git a/doc/sources/tutorial-client.rst b/doc/sources/tutorial-client.rst index 67d8b026..2262f675 100644 --- a/doc/sources/tutorial-client.rst +++ b/doc/sources/tutorial-client.rst @@ -7,7 +7,9 @@ the end of this page. It also resides in the examples directory in the archive or repository. This simple client takes a single HTTPS URI and retrieves the resource -at the URI. The synopsis is:: +at the URI. The synopsis is: + +.. code-block:: text $ libevent-client HTTPS_URI diff --git a/doc/sources/tutorial-server.rst b/doc/sources/tutorial-server.rst index e18ef0e8..31428376 100644 --- a/doc/sources/tutorial-server.rst +++ b/doc/sources/tutorial-server.rst @@ -10,7 +10,9 @@ archive or repository. This simple server takes 3 arguments: The port number to listen on, the path to your SSL/TLS private key file, and the path to your -certificate file. The synopsis is:: +certificate file. The synopsis is: + +.. code-block:: text $ libevent-server PORT /path/to/server.key /path/to/server.crt diff --git a/help2rst.py b/help2rst.py index ff160222..7706274a 100755 --- a/help2rst.py +++ b/help2rst.py @@ -166,7 +166,8 @@ def format_text(text): else: text = re.sub(r'\*', r'\*', text) # markup option reference - text = re.sub(r'(^|\s)(-[a-zA-Z0-9-]+)', r'\1:option:`\2`', text) + text = re.sub(r'(^|\s)(-[a-zA-Z0-9]|--[a-zA-Z0-9-]+)', + r'\1:option:`\2`', text) # sphinx does not like markup like ':option:`-f`='. We need # backslash between ` and =. text = re.sub(r'(:option:`.*?`)(\S)', r'\1\\\2', text) diff --git a/lib/includes/nghttp2/nghttp2.h b/lib/includes/nghttp2/nghttp2.h index 41a416ab..0f368c14 100644 --- a/lib/includes/nghttp2/nghttp2.h +++ b/lib/includes/nghttp2/nghttp2.h @@ -2629,14 +2629,20 @@ NGHTTP2_EXTERN void nghttp2_session_del(nghttp2_session *session); * * 6. :type:`nghttp2_before_frame_send_callback` is invoked. * - * 7. :type:`nghttp2_send_callback` is invoked one or more times to + * 7. If :enum:`NGHTTP2_ERR_CANCEL` is returned from + * :type:`nghttp2_before_frame_send_callback`, the current frame + * transmission is canceled, and + * :type:`nghttp2_on_frame_not_send_callback` is invoked. Abort + * the following steps. + * + * 8. :type:`nghttp2_send_callback` is invoked one or more times to * send the frame. * - * 8. :type:`nghttp2_on_frame_send_callback` is invoked. + * 9. :type:`nghttp2_on_frame_send_callback` is invoked. * - * 9. If the transmission of the frame triggers closure of the stream, - * the stream is closed and - * :type:`nghttp2_on_stream_close_callback` is invoked. + * 10. If the transmission of the frame triggers closure of the + * stream, the stream is closed and + * :type:`nghttp2_on_stream_close_callback` is invoked. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -3608,8 +3614,8 @@ nghttp2_submit_response(nghttp2_session *session, int32_t stream_id, * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The application is responsible not to include - * required pseudo-header fields (header field whose name starts with - * ":") in |nva|. + * pseudo-header fields (header field whose name starts with ":") in + * |nva|. * * This function creates copies of all name/value pairs in |nva|. It * also lower-cases all names in |nva|. The order of elements in @@ -3624,20 +3630,20 @@ nghttp2_submit_response(nghttp2_session *session, int32_t stream_id, * :type:`nghttp2_on_frame_not_send_callback` is called. * * For server, trailer fields must follow response HEADERS or response - * DATA with END_STREAM flag set. The library does not enforce this - * requirement, and applications should do this for themselves. If - * `nghttp2_submit_trailer()` is called before any response HEADERS + * DATA without END_STREAM flat set. The library does not enforce + * this requirement, and applications should do this for themselves. + * If `nghttp2_submit_trailer()` is called before any response HEADERS * submission (usually by `nghttp2_submit_response()`), the content of * |nva| will be sent as response headers, which will result in error. * * This function has the same effect with `nghttp2_submit_headers()`, - * with flags = :enum:`NGHTTP2_FLAG_END_HEADERS` and both pri_spec and + * with flags = :enum:`NGHTTP2_FLAG_END_STREAM` and both pri_spec and * stream_user_data to NULL. * * To submit trailer fields after `nghttp2_submit_response()` is * called, the application has to specify - * :type:`nghttp2_data_provider` to `nghttp2_submit_response()`. In - * side :type:`nghttp2_data_source_read_callback`, when setting + * :type:`nghttp2_data_provider` to `nghttp2_submit_response()`. + * Inside of :type:`nghttp2_data_source_read_callback`, when setting * :enum:`NGHTTP2_DATA_FLAG_EOF`, also set * :enum:`NGHTTP2_DATA_FLAG_NO_END_STREAM`. After that, the * application can send trailer fields using @@ -4096,7 +4102,7 @@ nghttp2_session_check_server_session(nghttp2_session *session); * that value as window_size_increment is queued. If the * |window_size_increment| is larger than the received bytes from the * remote endpoint, the local window size is increased by that - * difference. If the sole intention is to increase the local window + * difference. If the sole purpose is to increase the local window * size, consider to use `nghttp2_session_set_local_window_size()`. * * If the |window_size_increment| is negative, the local window size @@ -4105,8 +4111,8 @@ nghttp2_session_check_server_session(nghttp2_session *session); * (`nghttp2_option_set_no_auto_window_update()`), and the library * decided that the WINDOW_UPDATE should be submitted, then * WINDOW_UPDATE is queued with the current received bytes count. If - * the sole intention is to decrease the local window size, consider - * to use `nghttp2_session_set_local_window_size()`. + * the sole purpose is to decrease the local window size, consider to + * use `nghttp2_session_set_local_window_size()`. * * If the |window_size_increment| is 0, the function does nothing and * returns 0.