gstreamer/subprojects/gstreamer/docs
Alicia Boya García 9ca194d8cc harness: Fix race condition when torn down during the handling of a non-serialized query or event
It's possible and normal to tear down a harness while the pipeline is
running. At the same time, it's desired for the
`gst_harness_pad_link_tear_down()` function to be synchronous.

This has created the conflict where the main thread may request a
harness to be torn down while it's in use or about to be used by a pad
in the streaming thread.

The previous implementation of `gst_harness_pad_link_tear_down()` tried
to handle this by taking the stream lock of the harnessed pad and
resetting all the pad functions while holding it. That approach was
however insufficient to handle the case where a non-serialized event
or query is being handled or about to be handled in a different thread.

This edge case was one race condition behind the flakes in the flvmux
check tests -- the rest being covered by https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2803.

This patch fixes the problem by adding an intermediate ref-counted
object, GstHarnessLink, which replaces the usage of the HARNESS_KEY
association. GstHarnessLink allows the pad functions such as event,
query and chain to borrow a reference to GstHarness and more
importantly, to lock the GstHarnessLink during their usage to block
(delay) its destruction until no users are left, and guarantee that any
future user will not receive an invalid GstHarness handle past its
destruction.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5017>
2023-07-12 13:18:00 +00:00
..
gst doc: Add %p and %r patters for GST_DEBUG_FILE 2023-06-11 17:31:32 +00:00
images Move files from gstreamer into the "subprojects/gstreamer/" subdir 2021-09-24 16:13:07 -03:00
libs Move files from gstreamer into the "subprojects/gstreamer/" subdir 2021-09-24 16:13:07 -03:00
plugins clocksync: Add "QoS" support 2023-02-01 07:02:19 +00:00
random Remove ChangeLog files from git repository 2022-12-04 18:16:25 +00:00
gst-hotdoc-plugins-scanner.c gstreamer: re-indent with GNU indent 2.2.12 2023-03-17 03:18:53 +00:00
gst-plugins-doc-cache-generator.py doc: Avoid shelling out to hotdoc to generate plugins config files 2023-04-25 02:57:55 +00:00
index.md doc: Add %p and %r patters for GST_DEBUG_FILE 2023-06-11 17:31:32 +00:00
meson.build harness: Fix race condition when torn down during the handling of a non-serialized query or event 2023-07-12 13:18:00 +00:00
README Move files from gstreamer into the "subprojects/gstreamer/" subdir 2021-09-24 16:13:07 -03:00
version.in Move files from gstreamer into the "subprojects/gstreamer/" subdir 2021-09-24 16:13:07 -03:00

GStreamer documentation notes

OVERVIEW
========

Our documentation uses hotdoc, you should usually refer to the
[hotdoc documentation](http://hotdoc.github.io/).

GStreamer has two sets of documentation but both are controlled and aggregated in
the `gst-docs` module:

* API references, using hotdoc (gstreamer, gstreamer-libs) - maintained
  in each GStreamer modules repository
* FAQ / Application Development Manual / Plugin Writer's Guide / Tutorials -
  these are maintained in markdown format and live in the gst-docs repository.

To build the full documentation you should make sure to have `hotdoc` installed and
build [gst-build](https://cgit.freedesktop.org/gstreamer/gst-build/) configuring it with:

```
meson -Ddoc=enabled build/
```

And building the documentation:

```
ninja -C build/ subprojects/gst-docs/GStreamer-doc`, this will result in two documentation sets:
```

This will generate two outputs:

  - the html in `build/subprojects/gst-docs/GStreamer-doc/html`
  - the [devhelp](https://wiki.gnome.org/Apps/Devhelp) in `build/subprojects/gst-docs/GStreamer-doc/devhelp`

HOW THE BUILD SYSTEM IS SET UP
------------------------------
Hotdoc build targets are generated for each documentation 'components' (ie. hotdoc
subprojects). This includes libraries documentation and one target per GStreamer plugin.

One can build a specific documentation target by explicitly building the target,
for example to build the GStreamer core library documentation (adapt the paths if you
are using `gst-build`):

    ninja docs/libgstreamer-doc

Then the documentation will be available in `docs/libgstreamer-doc/html/`.

SPELL CHECKING
--------------

FILL ME.

HOTDOC NOTES
=============

* files under revision control:
  - sitemap.txt: defines the overall structure of the documentation
  - gst_plugins_cache.json: Automatically generated information about plugins

* what to do when adding a new piece of API:
  - Just let hotdoc generate the documentation and decide where to put it
  - Make sure to add a `SECTION` documentation section in the file where
    the documentation should land (hotdoc will use that to create its
    "smart index" and list symbols from other files that should land
    on that page in that section.
  - document functions, signals in the .c files
  - document structs, typedefs, enums in the .h files

* what to do when trying to improve the docs
  - compare the output of
    grep "_get_type" gstreamer-sections.txt | sort
    with the types in XXX.types to detect entries that
    are maybe missing
  - hotdoc does not warns about empty member docs!, run
    find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@.*: *$" {} \;
    in the project root to find them
  - hotdoc does not warns about empty Returns: docs!, run
    find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@Returns: *$" {} \;
    in the project root to find them

* what happens during a hotdoc build ?
  - Read the GIR and scan the sources files for the docstrings and
    generate the documentation laying out pages the way they are documented.
  - The meson build definition is set in a way that makes it so all plugins
    in `plugins_doc` are introspected and documented

STYLE GUIDE FOR HOTDOC
=======================
- this is in addition to gtk-doc's style-guide.txt

- function/macro descriptions are descriptive, not imperative
  ie, it uses the third person verb
- synopsis and description should have most-used/application functions at the
  top
- functions that can return FALSE/NULL or fail should describe their failure
  conditions like this:
  * Returns NULL if no element with the given name is found in the bin, if
  * the frobble was stuck in the froob, or the frizzle was frazzed.
- a line with function attributes should be added before Returns:
  - can contain:
    "MT safe." - the function is verified to be multithreadingsafe
    "Caller owns returned reference" for refcounted classes
    "Caller owns returned value" for other types (iterators, ..)
  - we do this because, in contrast with GLib/GTK, we are more explicit
    about threadsafety and related issues

WEBSITE DOCUMENTATION
=====================

Updating the online documentation is done from with the `gst-docs` repository

DOCUMENTING ELEMENTS
====================
A hotdoc plugin is provided by GStreamer to document GStreamer plugins.

- to add a plugin to be documented:
  - make sure the plugin is added to the `plugins_doc` variable in meson
- to add an element to be documented:
  - add a gtk-doc section to the source code like:
/**
 * SECTION:element-multifdsink

  and fill it with documentation about the element
  - add an example:
    - either a few pipelines, inside a codeblock
    - or a piece of code inside a codeblock or in `tests/examples/(pluginname)`
  - to build the doc for a plugin, do:
    `ninja docs/(pluginname)-doc`


DEVHELP INTEGRATION
-------------------
Check https://wiki.gnome.org/Apps/Devhelp
It's a really nice development app allowing you to look up API stuff
from various hotdoc/gtk-doc'd libraries.  GStreamer is one of these ;)

hotdoc generates both html API docs and the matching .devhelp(2) books.

IMAGES
------
It's important to keep the original source format for images, to be able
to change and regenerate later on.  Original files go in
docs/images