class DriverBase2

Defined at line 219 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

|DriverBase| is an interface that drivers should inherit from. It provides methods

for accessing the start args, as well as helper methods for common initialization tasks.

There are four virtual methods:

|Start| which must be overridden.

|Stop| and the destructor |~DriverBase|, are optional to override.

In order to work with the default FUCHSIA_DRIVER_EXPORT macro,

classes which inherit from |DriverBase| must implement a constructor with the following

signature and forward said parameters to the |DriverBase| base class:

T(DriverContext

&

context, fdf::UnownedSynchronizedDispatcher driver_dispatcher);

The following illustrates an example:

```

class MyDriver : public fdf::DriverBase2 {

public:

MyDriver(fdf::DriverContext

&

context, fdf::UnownedSynchronizedDispatcher driver_dispatcher)

: fdf::DriverBase("my_driver", context, std::move(driver_dispatcher)) {}

zx::result

<

> Start(DriverContext context) override {

context.incoming()->Connect(...);

outgoing()->AddService(...);

FDF_LOG(INFO, "hello world!");

inspector().Health().Ok();

node_client_.Bind(std::move(node()), dispatcher());

/* Ensure all capabilities offered have been added to the outgoing directory first. */

auto add_result = AddChild(...); if (add_result.is_error()) {

/* Releasing the node channel signals unbind to DF. */

node_client_.AsyncTeardown(); // Or node().reset() if we hadn't moved it into the client.

return add_result.take_error();

}

return zx::ok();

}

private:

fidl::Client

<fuchsia

_driver_framework::Node> node_client_;

};

```

# Thread safety

This class is thread-unsafe. Instances must be managed and used from tasks

running on the |driver_dispatcher|, and the dispatcher must be synchronized.

See

https://fuchsia.dev/fuchsia-src/development/languages/c-cpp/thread-safe-async#synchronized-dispatcher

Protected Members

unique_ptr logger_

Public Methods

void DriverBase2 (std::string_view name)

Defined at line 101 of file ../../sdk/lib/driver/component/cpp/driver_base2.cc

void DriverBaseInternalInit (DriverContext & context, fdf::UnownedSynchronizedDispatcher driver_dispatcher)

Defined at line 103 of file ../../sdk/lib/driver/component/cpp/driver_base2.cc

void ~DriverBase2 ()

The destructor is called right after the |Stop| method.

Defined at line 158 of file ../../sdk/lib/driver/component/cpp/driver_base2.cc

zx::result<OwnedChildNode> AddOwnedChild (std::string_view node_name)

Creates an owned child node on the node that the driver is bound to. The driver framework will

NOT try to match and bind a driver to this child as it is owned by the current driver.

The |node()| must not have been moved out manually by the user. This is a synchronous call

and requires that the dispatcher allow sync calls.

Defined at line 121 of file ../../sdk/lib/driver/component/cpp/driver_base2.cc

zx::result<fidl::ClientEnd<fuchsia_driver_framework::NodeController>> AddChild (std::string_view node_name, cpp20::span<const fuchsia_driver_framework::NodeProperty> properties, cpp20::span<const fuchsia_driver_framework::Offer> offers)

Creates a child node with the given offers and properties on the node that the driver is

bound to. The driver framework will try to match and bind a driver to this child.

The |node()| must not have been moved out manually by the user. This is a synchronous call

and requires that the dispatcher allow sync calls.

Defined at line 125 of file ../../sdk/lib/driver/component/cpp/driver_base2.cc

zx::result<OwnedChildNode> AddOwnedChild (std::string_view node_name, fuchsia_driver_framework::DevfsAddArgs & devfs_args)

Creates an owned child node with devfs support on the node that the driver is bound to. The

driver framework will NOT try to match and bind a driver to this child as it is already owned

by the current driver.

The |node()| must not have been moved out manually by the user. This is a synchronous call

and requires that the dispatcher allow sync calls.

Defined at line 132 of file ../../sdk/lib/driver/component/cpp/driver_base2.cc

zx::result<fidl::ClientEnd<fuchsia_driver_framework::NodeController>> AddChild (std::string_view node_name, fuchsia_driver_framework::DevfsAddArgs & devfs_args, cpp20::span<const fuchsia_driver_framework::NodeProperty> properties, cpp20::span<const fuchsia_driver_framework::Offer> offers)

Creates a child node with devfs support and the given offers and properties on the node that

the driver is bound to. The driver framework will try to match and bind a driver to this child.

The |node()| must not have been moved out manually by the user. This is a synchronous call

and requires that the dispatcher allow sync calls.

Defined at line 137 of file ../../sdk/lib/driver/component/cpp/driver_base2.cc

zx::result<fidl::ClientEnd<fuchsia_driver_framework::NodeController>> AddChild (std::string_view node_name, cpp20::span<const fuchsia_driver_framework::NodeProperty2> properties, cpp20::span<const fuchsia_driver_framework::Offer> offers)

Defined at line 144 of file ../../sdk/lib/driver/component/cpp/driver_base2.cc

zx::result<fidl::ClientEnd<fuchsia_driver_framework::NodeController>> AddChild (std::string_view node_name, fuchsia_driver_framework::DevfsAddArgs & devfs_args, cpp20::span<const fuchsia_driver_framework::NodeProperty2> properties, cpp20::span<const fuchsia_driver_framework::Offer> offers)

Defined at line 151 of file ../../sdk/lib/driver/component/cpp/driver_base2.cc

template <typename DriverBaseImpl>
DriverBaseImpl * GetInstanceFromTokenForTesting (void * token)

Gets the DriverBase instance from the given token. This is only intended for testing.

Defined at line 223 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

void DriverBase2 (const DriverBase2 & )

Defined at line 231 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

DriverBase2 & operator= (const DriverBase2 & )

Defined at line 232 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

void RegisterInitMethods (InitMethodCallback cb)

Callbacks that are invoked prior to the start hook.

Defined at line 241 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

zx::result<> Start (DriverContext context)

This method will be called by the factory to start the driver. This is when

the driver should setup the outgoing directory through `outgoing()->Add...` calls.

Do not call Serve, as it has already been called by the |DriverBase2| constructor.

Child nodes can be created here synchronously or asynchronously as long as all of the

protocols being offered to the child has been added to the outgoing directory first.

There are two versions of this method which may be implemented depending on whether Start would

like to complete synchronously or asynchronously. The driver may override either one of these

methods, but must implement one. The asynchronous version will be called over the synchronous

version if both are implemented.

Defined at line 255 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

void Start (DriverContext context, StartCompleter completer)

Defined at line 256 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

void Stop (StopCompleter completer)

This provides a way for the driver to asynchronously prepare to stop. The driver should

initiate any teardowns that need to happen on the driver dispatchers. Once it is ready to stop,

the completer's Complete function can be called (from any thread/context) with a result.

After the completer is called, the framework will shutdown all of the driver's fdf dispatchers

and deallocate the driver.

Defined at line 265 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

Logger & logger ()

This can be used to log in driver factories:

`driver->logger().log(fdf::INFO, "...");`

Defined at line 269 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

fidl::ClientEnd<fuchsia_driver_framework::Node> take_node ()

Client to the `fuchsia.driver.framework/Node` protocol provided by the driver framework.

This can be used to add children to the node that the driver is bound to.

Defined at line 273 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

const fidl::ClientEnd<fuchsia_driver_framework::Node> & node ()

Defined at line 278 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

Protected Methods

std::string_view name ()

The name of the driver that is given to the DriverBase2 constructor.

Defined at line 337 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

std::shared_ptr<OutgoingDirectory> & outgoing ()

Used to access the outgoing directory that the driver is serving. Can be used to add both

zircon and driver transport outgoing services.

Defined at line 341 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

const fdf::UnownedSynchronizedDispatcher & driver_dispatcher ()

The unowned synchronized driver dispatcher that the driver is started with.

Defined at line 344 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

async_dispatcher_t * dispatcher ()

The async_dispatcher_t interface of the synchronized driver dispatcher that the driver

is started with.

Defined at line 348 of file ../../sdk/lib/driver/component/cpp/driver_base2.h

Friends

class DriverContext