blob: 775661b4a251f347eee45b49abcffb81c71d19b0 [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License..
use crate::sync::SpinMutex;
use crate::thread::Thread;
use alloc::boxed::Box;
use alloc::collections::linked_list::LinkedList;
use core::ffi::c_void;
static mut TASK_QUEUE: SpinMutex<LinkedList<Task>> = SpinMutex::new(LinkedList::new());
pub struct Task {
p: Box<dyn FnOnce(*mut c_void) -> *mut c_void>,
arg: *mut c_void,
thread: Thread,
}
impl Task {
pub fn new(
p: Box<dyn FnOnce(*mut c_void) -> *mut c_void>,
arg: *mut c_void,
thread: Thread,
) -> Task {
Task { p, arg, thread }
}
pub fn run(self) {
let retval = (self.p)(self.arg);
self.thread.set_retval(retval);
}
pub fn thread(&self) -> &Thread {
&self.thread
}
}
pub fn push(task: Task) {
unsafe {
TASK_QUEUE.lock().push_back(task);
}
}
pub fn pop() -> Option<Task> {
unsafe { TASK_QUEUE.lock().pop_front() }
}