Struct cargo::core::compiler::job_queue::job_state::JobState

source ·
pub struct JobState<'a, 'gctx> {
    messages: Arc<Queue<Message>>,
    output: Option<&'a DiagDedupe<'gctx>>,
    id: JobId,
    rmeta_required: Cell<bool>,
    _marker: PhantomData<&'a ()>,
}
Expand description

A JobState is constructed by JobQueue::run and passed to Job::run. It includes everything necessary to communicate between the main thread and the execution of the job.

The job may execute on either a dedicated thread or the main thread. If the job executes on the main thread, the output field must be set to prevent a deadlock.

Fields§

§messages: Arc<Queue<Message>>

Channel back to the main thread to coordinate messages and such.

When the output field is Some, care must be taken to avoid calling push_bounded on the message queue to prevent a deadlock.

§output: Option<&'a DiagDedupe<'gctx>>

Normally output is sent to the job queue with backpressure. When the job is fresh however we need to immediately display the output to prevent a deadlock as the output messages are processed on the same thread as they are sent from. output defines where to output in this case.

Currently the Shell inside GlobalContext is wrapped in a RefCell and thus can’t be passed between threads. This means that it isn’t possible for multiple output messages to be interleaved. In the future, it may be wrapped in a Mutex instead. In this case interleaving is still prevented as the lock would be held for the whole printing of an output message.

§id: JobId

The job id that this state is associated with, used when sending messages back to the main thread.

§rmeta_required: Cell<bool>

Whether or not we’re expected to have a call to rmeta_produced. Once that method is called this is dynamically set to false to prevent sending a double message later on.

§_marker: PhantomData<&'a ()>

Implementations§

source§

impl<'a, 'gctx> JobState<'a, 'gctx>

source

pub(super) fn new( id: JobId, messages: Arc<Queue<Message>>, output: Option<&'a DiagDedupe<'gctx>>, rmeta_required: bool ) -> Self

source

pub fn running(&self, cmd: &ProcessBuilder)

source

pub fn build_plan( &self, module_name: String, cmd: ProcessBuilder, filenames: Arc<Vec<OutputFile>> )

source

pub fn stdout(&self, stdout: String) -> CargoResult<()>

source

pub fn stderr(&self, stderr: String) -> CargoResult<()>

source

pub fn emit_diag( &self, level: String, diag: String, fixable: bool ) -> CargoResult<()>

source

pub fn warning(&self, warning: String) -> CargoResult<()>

source

pub fn rmeta_produced(&self)

A method used to signal to the coordinator thread that the rmeta file for an rlib has been produced. This is only called for some rmeta builds when required, and can be called at any time before a job ends. This should only be called once because a metadata file can only be produced once!

source

pub(super) fn run_to_finish(self, job: Job)

Drives a Job to finish. This ensures that a Message::Finish is sent even if our job panics.

source

pub fn future_incompat_report(&self, report: Vec<FutureBreakageItem>)

Auto Trait Implementations§

§

impl<'a, 'gctx> !Freeze for JobState<'a, 'gctx>

§

impl<'a, 'gctx> !RefUnwindSafe for JobState<'a, 'gctx>

§

impl<'a, 'gctx> !Send for JobState<'a, 'gctx>

§

impl<'a, 'gctx> !Sync for JobState<'a, 'gctx>

§

impl<'a, 'gctx> Unpin for JobState<'a, 'gctx>

§

impl<'a, 'gctx> !UnwindSafe for JobState<'a, 'gctx>

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.

§

impl<T> Instrument for T

§

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

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

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.

§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

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

§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

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

§

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 24 bytes