Release Marshal Buffer Handles ****************************** .. Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. When you fetch a component object or create a new object, you get back a handle to the object location. The handle is either an ``TSMLoc`` for an object location or ``char *`` for a string location. You can manipulate the object through these handles, but when you are finished you need to release the handle to free up system resources. The general guideline is to release all ``TSMLoc`` and string handles you retrieve. The one exception is the string returned by ``TSUrlStringGet``, which must be freed by a call to ``TSfree``. The handle release functions expect three arguments: the marshal buffer containing the data, the location of the parent object, and the location of the object to be released. The parent location is usually clear from the creation of the ``TSMLoc`` or string. For example, if your plugin had the following calls: .. code-block:: c url_loc = TSHttpHdrUrlGet (bufp, hdr_loc); host_string = TSUrlHostGet (bufp, url_loc, &host_length); then your plugin would have to call: .. code-block:: c TSHandleMLocRelease (bufp, hdr_loc, url_loc); If an ``TSMLoc`` is obtained from a transaction, then it does not have a parent ``TSMLoc``. Use the null ``TSMLoc`` constant ``TS_NULL_MLOC`` as its parent. For example, if your plugin calls: .. code-block:: c TSHttpTxnClientReqGet (txnp, &bufp, &hdr_loc); then you must release ``hdr_loc`` with: .. code-block:: c TSHandleMLocRelease (bufp, TS_NULL_MLOC, hdr_loc); You need to use ``TS_NULL_MLOC`` to release any ``TSMLoc`` handles retrieved by the ``TSHttpTxn*Get`` functions. Here's an example using a new ``TSMimeHdrField`` function: .. code-block:: c TSHttpTxnServerRespGet( txnp, &resp_bufp, &resp_hdr_loc ); new_field_loc = TSMimeHdrFieldCreate (resp_bufp, resp_hdr_loc); TSHandleMLocRelease ( resp_bufp, resp_hdr_loc, new_field_loc); TSHandleMLocRelease ( resp_bufp, TS_NULL_MLOC, resp_hdr_loc); See the sample plugins for many more examples. .. tip:: You should release handles before reenabling the HTTP transaction. In other words, call ``TSHandleMLocRelease`` before ``TSHttpTxnReenable``.