Sematic-Cartographer/cartographer-master/cartographer/common/task.h

77 lines
2.2 KiB
C++
Executable File

/*
* Copyright 2018 The Cartographer Authors
*
* Licensed 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.
*/
#ifndef CARTOGRAPHER_COMMON_TASK_H_
#define CARTOGRAPHER_COMMON_TASK_H_
#include <set>
#include "absl/synchronization/mutex.h"
#include "glog/logging.h"
#include "thread_pool.h"
namespace cartographer {
namespace common {
class ThreadPoolInterface;
class Task {
public:
friend class ThreadPoolInterface;
using WorkItem = std::function<void()>;
enum State { NEW, DISPATCHED, DEPENDENCIES_COMPLETED, RUNNING, COMPLETED };
Task() = default;
~Task();
State GetState() LOCKS_EXCLUDED(mutex_);
// State must be 'NEW'.
void SetWorkItem(const WorkItem& work_item) LOCKS_EXCLUDED(mutex_);
// State must be 'NEW'. 'dependency' may be nullptr, in which case it is
// assumed completed.
void AddDependency(std::weak_ptr<Task> dependency) LOCKS_EXCLUDED(mutex_);
private:
// Allowed in all states.
void AddDependentTask(Task* dependent_task);
// State must be 'DEPENDENCIES_COMPLETED' and becomes 'COMPLETED'.
void Execute() LOCKS_EXCLUDED(mutex_);
// State must be 'NEW' and becomes 'DISPATCHED' or 'DEPENDENCIES_COMPLETED'.
void SetThreadPool(ThreadPoolInterface* thread_pool) LOCKS_EXCLUDED(mutex_);
// State must be 'NEW' or 'DISPATCHED'. If 'DISPATCHED', may become
// 'DEPENDENCIES_COMPLETED'.
void OnDependenyCompleted();
WorkItem work_item_ GUARDED_BY(mutex_);
ThreadPoolInterface* thread_pool_to_notify_ GUARDED_BY(mutex_) = nullptr;
State state_ GUARDED_BY(mutex_) = NEW;
unsigned int uncompleted_dependencies_ GUARDED_BY(mutex_) = 0;
std::set<Task*> dependent_tasks_ GUARDED_BY(mutex_);
absl::Mutex mutex_;
};
} // namespace common
} // namespace cartographer
#endif // CARTOGRAPHER_COMMON_TASK_H_