blob: 5de81ae496e1cab372befbae5a58dd6d60ab122c [file] [log] [blame]
/**
* 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.
*/
#pragma once
#include "ExecutorService.h"
namespace pulsar {
/**
* A task that is executed periodically.
*
* After the `start()` method is called, it will trigger `callback_` method periodically whose interval is
* `periodMs` in the constructor. After the `stop()` method is called, the timer will be cancelled and
* `callback()` will never be called again unless `start()` was called again.
*
* If you don't want to execute the task infinitely, you can call `stop()` in the implementation of
* `callback()` method.
*
* NOTE: If the `periodMs` is negative, the `callback()` will never be called.
*/
class PeriodicTask : public std::enable_shared_from_this<PeriodicTask> {
public:
using ErrorCode = boost::system::error_code;
using CallbackType = std::function<void(const ErrorCode&)>;
enum State : std::uint8_t
{
Pending,
Ready,
Closing
};
PeriodicTask(ExecutorService& executor, int periodMs)
: timer_(executor.createDeadlineTimer()), periodMs_(periodMs) {}
void start();
void stop() noexcept;
void setCallback(CallbackType callback) noexcept { callback_ = callback; }
State getState() const noexcept { return state_; }
int getPeriodMs() const noexcept { return periodMs_; }
private:
std::atomic<State> state_{Pending};
DeadlineTimerPtr timer_;
const int periodMs_;
CallbackType callback_{trivialCallback};
void handleTimeout(const ErrorCode& ec);
static void trivialCallback(const ErrorCode&) {}
};
} // namespace pulsar