Skip to main content

Server

Struct Server 

Source
pub struct Server { /* private fields */ }
Expand description

The shared state of a server, co-owned by the ServerHandle and by every class of it.

Implementations§

Source§

impl Server

Source

pub fn name(&self) -> &str

The exe/inst name of that server, under which it is registered in the database.

Source

pub fn admin_dev_name(&self) -> &str

Source

pub fn database(&self) -> &DatabaseProxy

Source

pub fn backend(&self) -> Option<Arc<dyn BackendServer>>

The backend serving the devices of that server, None once its handle is dropped, see ServerHandle.

Source

pub fn add_class<M: Model>(&self, def: ClassDef<M>) -> Result<Ref<'_, Class<M>>>

Register a new class in this server, from its definition.

Source

pub fn get_class(&self, name: &str) -> Option<Ref<'_, dyn AnyClass>>

Get a class of this server from its name.

Source

pub fn add_dev(&self, class: &str, name: &str) -> Result<Ref<'_, dyn AnyDev>>

Add a device to this server, as an instance of the class of that name, which is how the devices listed by the database are added, the database giving the class of each by its name. See Class::add_dev for the typed form.

The device is only registered: it is initialized, served and exported by the next Self::sync.

Source

pub fn remove_dev(&self, name: &str) -> bool

Remove the device of that name from this server, giving back whether it had one.

Its name is free again right away, but the device itself is only unexported, no longer served and deleted by the next Self::sync. A device removed before any synchronization reached it is simply dropped.

Source

pub async fn sync(&self) -> Result<()>

Apply what was done to the devices of this server since the last synchronization: the devices removed are unexported, no longer served and deleted, then the devices added are initialized, served and exported, which is what makes them reachable.

The devices added are initialized one after the other, class by class in the order the classes were made, and in the order they were added within a class. A device whose initialization adds devices has them initialized by this same synchronization, which is how the admin device boots a server. Each device is then served and exported on its own, which is what a Tango server always tells the database.

A device whose initialization failed is still served and exported, in FAULT, so that a client can ask it what went wrong. A device that could not be served or exported is retried by the next synchronization, and the first such error is given back once every other device is done.

Synchronizations never interleave: one waits for the one running to be done, so that everything done before calling it is applied once it returns. This is also why an init function must never call it, since it would wait for itself.

Source

pub fn sync_blocking(&self) -> Result<()>

The blocking form of Self::sync, which must therefore never run on the executor of a backend, in an asynchronous handler in particular.

Source

pub fn classes(&self) -> Vec<Ref<'_, dyn AnyClass>>

Every class of this server, in the order they were made, the admin one first, see AnyClass::index.

Source

pub fn devs(&self) -> Vec<Ref<'_, dyn AnyDev>>

Every device of this server, class by class in the order of Self::classes, and by name within a class.

Source

pub fn get_dev(&self, name: &str) -> Option<Ref<'_, dyn AnyDev>>

Get a device of this server from its name.

Source

pub async fn stop(&self) -> Result<()>

Stop this server, which is only ever done once: it is unexported as a whole, so that clients stop finding it, then its backend is stopped, the requests in flight still being answered. The thread waiting on the server then deletes the models, see ServerHandle::wait. No synchronization runs after this, the devices still waiting for one never being served.

This does not wait for the backend, and can therefore be called from anywhere, a request handler included, which is what the Kill command of the admin device does. The backend is stopped even if the server could not be unexported, which is the error then given back.

Trait Implementations§

Source§

impl Debug for Server

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl !Freeze for Server

§

impl !RefUnwindSafe for Server

§

impl !UnwindSafe for Server

§

impl Send for Server

§

impl Sync for Server

§

impl Unpin for Server

§

impl UnsafeUnpin for Server

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Model for T
where T: Send + Sync + 'static,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more