diff mbox

[2/2] doc: release-guide: add deprecated api section

Message ID 1450202766-30096-3-git-send-email-mike.holmes@linaro.org
State New
Headers show

Commit Message

Mike Holmes Dec. 15, 2015, 6:06 p.m. UTC
Describe how changes to the public api are handled from release to release.

Signed-off-by: Mike Holmes <mike.holmes@linaro.org>
---
 doc/process-guide/release-guide.adoc | 38 ++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

Comments

Bill Fischofer Dec. 15, 2015, 11:42 p.m. UTC | #1
On Tue, Dec 15, 2015 at 12:06 PM, Mike Holmes <mike.holmes@linaro.org>
wrote:

> Describe how changes to the public api are handled from release to release.

>

> Signed-off-by: Mike Holmes <mike.holmes@linaro.org>

> ---

>  doc/process-guide/release-guide.adoc | 38

> ++++++++++++++++++++++++++++++++++++

>  1 file changed, 38 insertions(+)

>

> diff --git a/doc/process-guide/release-guide.adoc

> b/doc/process-guide/release-guide.adoc

> index f5d29d2..d932118 100644

> --- a/doc/process-guide/release-guide.adoc

> +++ b/doc/process-guide/release-guide.adoc

> @@ -134,3 +134,41 @@ made every month if sufficient change has accumulated.

>

>  === Implementation (Impl) ===

>  Platform specific free form text relating to the version.

> +

> +== Deprecated APIs

> +

> +Whenever an API is changed as part of an api-next patch the following

> rules

> +apply to provide a warning to implementers and users.

> +

> +* A patch will be applied to api-next that adds the deprecated indication

> to

> +the old public API in odp/include

> +* A patch will be applied to api-next that adds the new API and removes

> the

> +old, in these cases the implementation and tests must also change at the

> same

> +time to ensure that CI shows no regressions in the api-next branch.

> +* When the Release Manager has scheduled the api change to be released in

> a

> +future version, the initial deprecated patch will be moved to next branch

> and

> +released in the next release cycle.

> +* When at a minim of one release cycle has passed, and possibly longer as

> +specified by the Release Manager the complete change will be merged to

> next and

> +then released in the next cycle.

>


This is good, however we still need to cover the case where the change is
not the removal of an API but a change to its type signature (e.g., the
anticipated change to odp_cls_cos_create() to add a new odp_cls_cos_param_t
parameter to the argument list). In this case it's the old type signature
that is being deprecated rather than the function name. Since we're
handling this via documentation using @deprecated then perhaps just
emphasize that the explanatory text should detail the nature of the
anticipated change.


> +

> +NOTE: Any given release never supports two versions of an API

> +

> +.Marking a deprecated API element

> +[source,c]

> +----

> +/**

> + * Get buffer handle from event

> + *

> + * Converts an ODP_EVENT_BUFFER type event to a buffer.

> + *

> + * @deprecated  This api will be removed for some good reason defined here

> + *

> + * @param ev   Event handle

> + *

> + * @return Buffer handle

> + *

> + * @see odp_event_type()

> + */

> +odp_buffer_t odp_buffer_from_event(odp_event_t ev);

>


It's confusing to use a real ODP API like this.  I'd prefer to see this
covered with an artificial API such as:

/**
 * Create a foo
 *
 * @deprecated This API will be removed since foos are being replaced by
bars. The replacement API will be
 * odp_bar_create();
 *
 * @param name ...
 */
odp_foo_t odp_foo_create(const char *name);

Or in the case of a change in type signature:

 * @deprecated This API's type signature will be changed add an new
parameter to specify the color of the foo to be created. The new call will
be odp_foo_create(const char *name, odp_foo_color_t color);


> +----

> \ No newline at end of file

>


This looks like an error marker inserted by format-patch.  Check and
correct.


> --

> 2.5.0

>

> _______________________________________________

> lng-odp mailing list

> lng-odp@lists.linaro.org

> https://lists.linaro.org/mailman/listinfo/lng-odp

>
Mike Holmes Dec. 16, 2015, 2:55 a.m. UTC | #2
On 15 December 2015 at 18:42, Bill Fischofer <bill.fischofer@linaro.org>
wrote:

>

>

> On Tue, Dec 15, 2015 at 12:06 PM, Mike Holmes <mike.holmes@linaro.org>

> wrote:

>

>> Describe how changes to the public api are handled from release to

>> release.

>>

>> Signed-off-by: Mike Holmes <mike.holmes@linaro.org>

>> ---

>>  doc/process-guide/release-guide.adoc | 38

>> ++++++++++++++++++++++++++++++++++++

>>  1 file changed, 38 insertions(+)

>>

>> diff --git a/doc/process-guide/release-guide.adoc

>> b/doc/process-guide/release-guide.adoc

>> index f5d29d2..d932118 100644

>> --- a/doc/process-guide/release-guide.adoc

>> +++ b/doc/process-guide/release-guide.adoc

>> @@ -134,3 +134,41 @@ made every month if sufficient change has

>> accumulated.

>>

>>  === Implementation (Impl) ===

>>  Platform specific free form text relating to the version.

>> +

>> +== Deprecated APIs

>> +

>> +Whenever an API is changed as part of an api-next patch the following

>> rules

>> +apply to provide a warning to implementers and users.

>> +

>> +* A patch will be applied to api-next that adds the deprecated

>> indication to

>> +the old public API in odp/include

>> +* A patch will be applied to api-next that adds the new API and removes

>> the

>> +old, in these cases the implementation and tests must also change at the

>> same

>> +time to ensure that CI shows no regressions in the api-next branch.

>> +* When the Release Manager has scheduled the api change to be released

>> in a

>> +future version, the initial deprecated patch will be moved to next

>> branch and

>> +released in the next release cycle.

>> +* When at a minim of one release cycle has passed, and possibly longer as

>> +specified by the Release Manager the complete change will be merged to

>> next and

>> +then released in the next cycle.

>>

>

> This is good, however we still need to cover the case where the change is

> not the removal of an API but a change to its type signature (e.g., the

> anticipated change to odp_cls_cos_create() to add a new odp_cls_cos_param_t

> parameter to the argument list). In this case it's the old type signature

> that is being deprecated rather than the function name. Since we're

> handling this via documentation using @deprecated then perhaps just

> emphasize that the explanatory text should detail the nature of the

> anticipated change.

>


How would we do this differently  - I might not be fully  understanding
@deprecated  applies to anything doxygen can comment and the reason for the
change would be listed, we can add a second example for a change in params
to show that you describe the reason for the change that will be coming.


>

>

>> +

>> +NOTE: Any given release never supports two versions of an API

>> +

>> +.Marking a deprecated API element

>> +[source,c]

>> +----

>> +/**

>> + * Get buffer handle from event

>> + *

>> + * Converts an ODP_EVENT_BUFFER type event to a buffer.

>> + *

>> + * @deprecated  This api will be removed for some good reason defined

>> here

>> + *

>> + * @param ev   Event handle

>> + *

>> + * @return Buffer handle

>> + *

>> + * @see odp_event_type()

>> + */

>> +odp_buffer_t odp_buffer_from_event(odp_event_t ev);

>>

>

> It's confusing to use a real ODP API like this.  I'd prefer to see this

> covered with an artificial API such as:

>

> /**

>  * Create a foo

>  *

>  * @deprecated This API will be removed since foos are being replaced by

> bars. The replacement API will be

>  * odp_bar_create();

>  *

>  * @param name ...

>  */

> odp_foo_t odp_foo_create(const char *name);

>

> Or in the case of a change in type signature:

>

>  * @deprecated This API's type signature will be changed add an new

> parameter to specify the color of the foo to be created. The new call will

> be odp_foo_create(const char *name, odp_foo_color_t color);

>

>


Sure, no problem.


> +----

>> \ No newline at end of file

>>

>

> This looks like an error marker inserted by format-patch.  Check and

> correct.

>


I know what this is, editor sometimes thinks it is helping  :)  thanks



>

>

>> --

>> 2.5.0

>>

>> _______________________________________________

>> lng-odp mailing list

>> lng-odp@lists.linaro.org

>> https://lists.linaro.org/mailman/listinfo/lng-odp

>>

>

>



-- 
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
Maxim Uvarov Dec. 16, 2015, 10:50 a.m. UTC | #3
On 12/15/2015 21:06, Mike Holmes wrote:
> Describe how changes to the public api are handled from release to release.
>
> Signed-off-by: Mike Holmes <mike.holmes@linaro.org>
> ---
>   doc/process-guide/release-guide.adoc | 38 ++++++++++++++++++++++++++++++++++++
>   1 file changed, 38 insertions(+)
>
> diff --git a/doc/process-guide/release-guide.adoc b/doc/process-guide/release-guide.adoc
> index f5d29d2..d932118 100644
> --- a/doc/process-guide/release-guide.adoc
> +++ b/doc/process-guide/release-guide.adoc
> @@ -134,3 +134,41 @@ made every month if sufficient change has accumulated.
>   
>   === Implementation (Impl) ===
>   Platform specific free form text relating to the version.
> +
> +== Deprecated APIs
> +
> +Whenever an API is changed as part of an api-next patch the following rules
> +apply to provide a warning to implementers and users.
> +
> +* A patch will be applied to api-next that adds the deprecated indication to
> +the old public API in odp/include
That sentence should never be in product documentation. Plans can be in
Jira cards, bugs, mailing list, but published docs should relay only on work
which is already done.

> +* A patch will be applied to api-next that adds the new API and removes the
> +old, in these cases the implementation and tests must also change at the same
> +time to ensure that CI shows no regressions in the api-next branch.
same here.

> +* When the Release Manager has scheduled the api change to be released in a
> +future version, the initial deprecated patch will be moved to next branch and
> +released in the next release cycle.
> +* When at a minim of one release cycle has passed, and possibly longer as
> +specified by the Release Manager the complete change will be merged to next and
> +then released in the next cycle.
Release Manager scheduled in next release cycle ... It's it too complex
to read and understand when and what will be done. How about be more
community friendly in sentences? Something like:

""
ODP API provides special API to mark function and data types as deprecated.
Marking function as deprecated means that ODP Community will support all
functionality for that function, validation tests and test execution in 
CI system.
Because of support of both new API and deprecated adds additional load and
increase complexity marking functions as deprecated will happen only for
specific reason. That reason should be valuable, discussed in ODP 
community meetings,
recorded in mailing list and corresponding bug entry should be open. 
Also some transition
period for supporting old API should be defined.


> +
> +NOTE: Any given release never supports two versions of an API
> +

That is not what deprecated means. I.e. deprecated means absolutely 
opposite - support old version
and new at the same time.

> +.Marking a deprecated API element
> +[source,c]
> +----
> +/**
> + * Get buffer handle from event
> + *
> + * Converts an ODP_EVENT_BUFFER type event to a buffer.
> + *
> + * @deprecated  This api will be removed for some good reason defined here
doxygen is not enough I think. Also here might be some short description 
and link to bug.

+odp_buffer_t odp_buffer_from_event(odp_event_t ev) ODP_DEPRECATED;
and compile with: -Wno-deprecated-declarations

Maxim.

> + *
> + * @param ev   Event handle
> + *
> + * @return Buffer handle
> + *
> + * @see odp_event_type()
> + */
> +odp_buffer_t odp_buffer_from_event(odp_event_t ev);
> +----
> \ No newline at end of file
Mike Holmes Dec. 16, 2015, 5:22 p.m. UTC | #4
On 16 December 2015 at 05:50, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:

> On 12/15/2015 21:06, Mike Holmes wrote:

>

>> Describe how changes to the public api are handled from release to

>> release.

>>

>> Signed-off-by: Mike Holmes <mike.holmes@linaro.org>

>> ---

>>   doc/process-guide/release-guide.adoc | 38

>> ++++++++++++++++++++++++++++++++++++

>>   1 file changed, 38 insertions(+)

>>

>> diff --git a/doc/process-guide/release-guide.adoc

>> b/doc/process-guide/release-guide.adoc

>> index f5d29d2..d932118 100644

>> --- a/doc/process-guide/release-guide.adoc

>> +++ b/doc/process-guide/release-guide.adoc

>> @@ -134,3 +134,41 @@ made every month if sufficient change has

>> accumulated.

>>     === Implementation (Impl) ===

>>   Platform specific free form text relating to the version.

>> +

>> +== Deprecated APIs

>> +

>> +Whenever an API is changed as part of an api-next patch the following

>> rules

>> +apply to provide a warning to implementers and users.

>> +

>> +* A patch will be applied to api-next that adds the deprecated

>> indication to

>> +the old public API in odp/include

>>

> That sentence should never be in product documentation. Plans can be in

> Jira cards, bugs, mailing list, but published docs should relay only on

> work

> which is already done.



I dont follow the rationale that this is the wrong place,  this is the
document that does describe how we will operate, we dont specify which
patch just how they will be used.


>

>

> +* A patch will be applied to api-next that adds the new API and removes

>> the

>> +old, in these cases the implementation and tests must also change at the

>> same

>> +time to ensure that CI shows no regressions in the api-next branch.

>>

> same here.



describing how we operate is the purpose of this doc


>

>

> +* When the Release Manager has scheduled the api change to be released in

>> a

>> +future version, the initial deprecated patch will be moved to next

>> branch and

>> +released in the next release cycle.

>> +* When at a minim of one release cycle has passed, and possibly longer as

>> +specified by the Release Manager the complete change will be merged to

>> next and

>> +then released in the next cycle.

>>

> Release Manager scheduled in next release cycle ... It's it too complex

> to read and understand when and what will be done. How about be more

> community friendly in sentences? Something like:

>


We can certainly try to make it clearer and put the points on a diagram to
show how they relate in time.


>

> ""

> ODP API provides special API to mark function and data types as deprecated.

>


This is not true, there is no API only a doxygen comment.


> Marking function as deprecated means that ODP Community will support all

> functionality for that function, validation tests and test execution in CI

> system.

>


No, deprecated means literally that you should stop using something. In our
case becasue it will change and you can view the new version in api-next.


> Because of support of both new API and deprecated adds additional load and

> increase complexity marking functions as deprecated will happen only for

> specific reason.



We will mark them deprecated when the current API can be shown to be
deficient and a better alternative has already been proven in api-next.

That reason should be valuable, discussed in ODP community meetings,
> recorded in mailing list and corresponding bug entry should be open.



Yes, that is why we created api-next so that the community can  comment and
give feedback


> Also some transition

> period for supporting old API should be defined.

>

>

The release manager role is the one that ensures that all the process has
been completed and schedules the change to actually occur, at no point will
the old api be supported concurrently unless it is in a long term support
version. The period for which the deprecated element is flagged will vary
and will generally be reached by consensus in api-next discussion.


> +

>> +NOTE: Any given release never supports two versions of an API

>> +

>>

>

> That is not what deprecated means. I.e. deprecated means absolutely

> opposite - support old version

> and new at the same time.



No, "*Deprecation* is an attribute applied to a computer software
<https://en.wikipedia.org/wiki/Computer_software> feature, characteristic,
or practice to indicate that it should be avoided (often because it is
being superseded). "
It says nothing about supporting it in parallel with a new variant.
ODP support during this  period comes in the form that the old api will
still work while the warning is in effect that you should plan on stopping
using it. You don't have to stop using it, you could remain
on that release.


>

>

> +.Marking a deprecated API element

>> +[source,c]

>> +----

>> +/**

>> + * Get buffer handle from event

>> + *

>> + * Converts an ODP_EVENT_BUFFER type event to a buffer.

>> + *

>> + * @deprecated  This api will be removed for some good reason defined

>> here

>>

> doxygen is not enough I think. Also here might be some short description

> and link to bug.

>

> +odp_buffer_t odp_buffer_from_event(odp_event_t ev) ODP_DEPRECATED;

> and compile with: -Wno-deprecated-declarations

>

> Maxim.

>

> + *

>> + * @param ev   Event handle

>> + *

>> + * @return Buffer handle

>> + *

>> + * @see odp_event_type()

>> + */

>> +odp_buffer_t odp_buffer_from_event(odp_event_t ev);

>> +----

>> \ No newline at end of file

>>

>

> _______________________________________________

> lng-odp mailing list

> lng-odp@lists.linaro.org

> https://lists.linaro.org/mailman/listinfo/lng-odp

>




-- 
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
Maxim Uvarov Dec. 16, 2015, 7:36 p.m. UTC | #5
On 12/16/2015 20:22, Mike Holmes wrote:
>
>
> On 16 December 2015 at 05:50, Maxim Uvarov <maxim.uvarov@linaro.org 
> <mailto:maxim.uvarov@linaro.org>> wrote:
>
>     On 12/15/2015 21:06, Mike Holmes wrote:
>
>         Describe how changes to the public api are handled from
>         release to release.
>
>         Signed-off-by: Mike Holmes <mike.holmes@linaro.org
>         <mailto:mike.holmes@linaro.org>>
>         ---
>           doc/process-guide/release-guide.adoc | 38
>         ++++++++++++++++++++++++++++++++++++
>           1 file changed, 38 insertions(+)
>
>         diff --git a/doc/process-guide/release-guide.adoc
>         b/doc/process-guide/release-guide.adoc
>         index f5d29d2..d932118 100644
>         --- a/doc/process-guide/release-guide.adoc
>         +++ b/doc/process-guide/release-guide.adoc
>         @@ -134,3 +134,41 @@ made every month if sufficient change has
>         accumulated.
>             === Implementation (Impl) ===
>           Platform specific free form text relating to the version.
>         +
>         +== Deprecated APIs
>         +
>         +Whenever an API is changed as part of an api-next patch the
>         following rules
>         +apply to provide a warning to implementers and users.
>         +
>         +* A patch will be applied to api-next that adds the
>         deprecated indication to
>         +the old public API in odp/include
>
>     That sentence should never be in product documentation. Plans can
>     be in
>     Jira cards, bugs, mailing list, but published docs should relay
>     only on work
>     which is already done.
>
>
> I dont follow the rationale that this is the wrong place,  this is the 
> document that does describe how we will operate, we dont specify which 
> patch just how they will be used.

Sorry, for first read I thought that want to send patch to api-next to 
mark functions as deprecated. Instead of current one. But you
just defining list of rules for such deprecated patch. It's a little bit 
confusing senescence for me as non native English.
Might be:
1. add ":" after "users". So reader can expect some list.
2. Rephrase sentence to: "Patch which marks existence api (odp/include) 
with deprecated indication should be applied on api-next first. Same way 
as all other api changes patches."

(if we name it "rules", not "plans" - it has to be not future form, 
right? I.e. have to, must).

>
>
>         +* A patch will be applied to api-next that adds the new API
>         and removes the
>         +old, in these cases the implementation and tests must also
>         change at the same
>         +time to ensure that CI shows no regressions in the api-next
>         branch.
>
>     same here.
>
> describing how we operate is the purpose of this doc
That also I understood wrongly.

But replace old by new is not deprecation. It's just api replacement. 
That should be in api-next branch
description. And chapter Deprecated APIs should have rules only suitable 
for deprecation.

>
>
>         +* When the Release Manager has scheduled the api change to be
>         released in a
>         +future version, the initial deprecated patch will be moved to
>         next branch and
>         +released in the next release cycle.
>         +* When at a minim of one release cycle has passed, and
>         possibly longer as
>         +specified by the Release Manager the complete change will be
>         merged to next and
>         +then released in the next cycle.
>
>     Release Manager scheduled in next release cycle ... It's it too
>     complex
>     to read and understand when and what will be done. How about be more
>     community friendly in sentences? Something like:
>
>
> We can certainly try to make it clearer and put the points on a 
> diagram to show how they relate in time.
>
My point is - it's easy to mark function as deprecated. But you never 
know what time will take transition period
that everybody will stop using it. Linux kernel has some deprecated 
function which warn for years. And I think
that right thing will be discussion before next big release if we want 
to remove some specific functions.

>
>     ""
>     ODP API provides special API to mark function and data types as
>     deprecated.
>
>
> This is not true, there is no API only a doxygen comment.

everything what is in ./include/odp/api we consider as API, right?

include/odp/api/hints.h
#define ODP_DEPRECATED __attribute__((__deprecated__))
>
>     Marking function as deprecated means that ODP Community will
>     support all
>     functionality for that function, validation tests and test
>     execution in CI system.
>
>
> No, deprecated means literally that you should stop using something. 
> In our case becasue it will change and you can view the new version in 
> api-next.

It depends from with point of view you are looking. Yes it says - stop 
using it. But that api should still have implementation and validation tests
for linux-generic. I.e. we have to support it for some time until it's 
completely removed.

>     Because of support of both new API and deprecated adds additional
>     load and
>     increase complexity marking functions as deprecated will happen
>     only for
>     specific reason.
>
>
> We will mark them deprecated when the current API can be shown to be 
> deficient and a better alternative has already been proven in api-next.
>

yes, it was just sentence to document. That there should be specific reason.

>     That reason should be valuable, discussed in ODP community meetings,
>     recorded in mailing list and corresponding bug entry should be open. 
>
>
> Yes, that is why we created api-next so that the community can 
>  comment and give feedback

also just sentence to your process doc - where exactly we store that 
specific reason.

>     Also some transition
>     period for supporting old API should be defined.
>
>
> The release manager role is the one that ensures that all the process 
> has been completed and schedules the change to actually occur, at no 
> point will the old api be supported concurrently unless it is in a 
> long term support version. The period for which the deprecated element 
> is flagged will vary and will generally be reached by consensus in 
> api-next discussion.
>
It does not matter who will control that process. Idea is that document 
should say where it will be documented. I.e. each developer
can go to bug entry find information that for example function x() is 
deprecated in odp1.5 and will be removed in odp2.0, use y().
Might be doxygen can have all information about time.

btw, can we in doxygen have list of all things marked as @deprecated? 
That list will be very easy to review.

>
>         +
>         +NOTE: Any given release never supports two versions of an API
>         +
>
>
>     That is not what deprecated means. I.e. deprecated means
>     absolutely opposite - support old version
>     and new at the same time.
>
>
> No, "*Deprecation* is an attribute applied to a computer software 
> <https://en.wikipedia.org/wiki/Computer_software> feature, 
> characteristic, or practice to indicate that it should be avoided 
> (often because it is being superseded). "
> It says nothing about supporting it in parallel with a new variant.
> ODP support during this  period comes in the form that the old api 
> will still work while the warning is in effect that you should plan on 
> stopping using it. You don't have to stop using it, you could remain 
> on that release.

Yes. Again, from which side are you looking from odp apps developer or 
from odp developer. Both api have to work. That means they should
pass and have validation tests, correct implementation and etc.

>
>
>         +.Marking a deprecated API element
>         +[source,c]
>         +----
>         +/**
>         + * Get buffer handle from event
>         + *
>         + * Converts an ODP_EVENT_BUFFER type event to a buffer.
>         + *
>         + * @deprecated  This api will be removed for some good reason
>         defined here
>
>     doxygen is not enough I think. Also here might be some short
>     description and link to bug.
>
>     +odp_buffer_t odp_buffer_from_event(odp_event_t ev) ODP_DEPRECATED;
>     and compile with: -Wno-deprecated-declarations
>
>     Maxim.
>
>         + *
>         + * @param ev   Event handle
>         + *
>         + * @return Buffer handle
>         + *
>         + * @see odp_event_type()
>         + */
>         +odp_buffer_t odp_buffer_from_event(odp_event_t ev);
>         +----
>         \ No newline at end of file
>
>
>     _______________________________________________
>     lng-odp mailing list
>     lng-odp@lists.linaro.org <mailto:lng-odp@lists.linaro.org>
>     https://lists.linaro.org/mailman/listinfo/lng-odp
>
>
>
>
> -- 
> Mike Holmes
> Technical Manager - Linaro Networking Group
> Linaro.org <http://www.linaro.org/>***│ *Open source software for ARM SoCs
>
diff mbox

Patch

diff --git a/doc/process-guide/release-guide.adoc b/doc/process-guide/release-guide.adoc
index f5d29d2..d932118 100644
--- a/doc/process-guide/release-guide.adoc
+++ b/doc/process-guide/release-guide.adoc
@@ -134,3 +134,41 @@  made every month if sufficient change has accumulated.
 
 === Implementation (Impl) ===
 Platform specific free form text relating to the version.
+
+== Deprecated APIs
+
+Whenever an API is changed as part of an api-next patch the following rules
+apply to provide a warning to implementers and users.
+
+* A patch will be applied to api-next that adds the deprecated indication to
+the old public API in odp/include
+* A patch will be applied to api-next that adds the new API and removes the
+old, in these cases the implementation and tests must also change at the same
+time to ensure that CI shows no regressions in the api-next branch.
+* When the Release Manager has scheduled the api change to be released in a
+future version, the initial deprecated patch will be moved to next branch and
+released in the next release cycle.
+* When at a minim of one release cycle has passed, and possibly longer as
+specified by the Release Manager the complete change will be merged to next and
+then released in the next cycle.
+
+NOTE: Any given release never supports two versions of an API
+
+.Marking a deprecated API element
+[source,c]
+----
+/**
+ * Get buffer handle from event
+ *
+ * Converts an ODP_EVENT_BUFFER type event to a buffer.
+ *
+ * @deprecated  This api will be removed for some good reason defined here
+ *
+ * @param ev   Event handle
+ *
+ * @return Buffer handle
+ *
+ * @see odp_event_type()
+ */
+odp_buffer_t odp_buffer_from_event(odp_event_t ev);
+----
\ No newline at end of file