1 #ifndef LIBFILEZILLA_AIO_WRITER_HEADER
2 #define LIBFILEZILLA_AIO_WRITER_HEADER
11 #include "../buffer.hpp"
12 #include "../file.hpp"
13 #include "../thread_pool.hpp"
75 using progress_cb_t = std::function<void(writer_base const*, uint64_t written)>;
84 , progress_cb_(std::move(progress_cb))
85 , max_buffers_(max_buffers ? max_buffers : 1)
91 , progress_cb_(std::move(progress_cb))
92 , max_buffers_(max_buffers ? max_buffers : 1)
95 virtual void do_close(scoped_lock &) {}
98 aio_buffer_pool & buffer_pool_;
100 std::wstring
const name_;
102 progress_cb_t progress_cb_;
104 size_t const max_buffers_{};
105 std::list<buffer_lease> buffers_;
108 uint8_t finalizing_{};
119 : name_(std::move(name))
125 virtual std::unique_ptr<writer_factory> clone()
const = 0;
136 std::wstring
const& name()
const {
return name_; }
142 virtual uint64_t
size()
const {
return writer_base::nosize; }
151 virtual size_t preferred_buffer_count()
const {
return 1; }
164 std::wstring
const name_;
187 explicit operator bool()
const {
return impl_.operator bool(); }
189 std::wstring name()
const {
return impl_ ? impl_->name() : std::wstring(); }
191 uint64_t size()
const {
return impl_ ? impl_->size() : aio_base::nosize; }
194 std::unique_ptr<writer_factory> impl_;
205 using writer_base::writer_base;
235 virtual aio_result preallocate(uint64_t size)
override;
237 virtual bool set_mtime(
datetime const&)
override;
240 virtual void FZ_PRIVATE_SYMBOL do_close(
scoped_lock & l)
override;
243 void FZ_PRIVATE_SYMBOL entry();
248 bool preallocated_{};
251 enum class file_writer_flags : unsigned {
253 permissions_current_user_only = 0x02,
254 permissions_current_user_and_admins_only = 0x04
256 inline bool operator&(file_writer_flags lhs, file_writer_flags rhs) {
257 return (
static_cast<std::underlying_type_t<file_writer_flags>
>(lhs) &
static_cast<std::underlying_type_t<file_writer_flags>
>(rhs)) != 0;
259 inline file_writer_flags operator|(file_writer_flags lhs, file_writer_flags rhs) {
260 return static_cast<file_writer_flags
>(
static_cast<std::underlying_type_t<file_writer_flags>
>(lhs) |
static_cast<std::underlying_type_t<file_writer_flags>
>(rhs));
270 virtual std::unique_ptr<writer_factory> clone()
const override;
274 virtual uint64_t size()
const override;
275 virtual datetime mtime()
const override;
277 virtual bool set_mtime(
datetime const& t)
override;
281 virtual size_t preferred_buffer_count()
const override {
return 4; }
284 thread_pool & thread_pool_;
285 file_writer_flags flags_{};
299 virtual aio_result preallocate(uint64_t size)
override;
306 size_t size_limit_{};
321 virtual std::unique_ptr<writer_factory> clone()
const override;
325 size_t size_limit_{};
virtual size_t min_buffer_usage() const
The writer requires at least this many buffers.
Definition: writer.hpp:146
Definition: writer.hpp:167
Base class for all writers.
Definition: writer.hpp:27
A simple scoped lock.
Definition: mutex.hpp:116
virtual aio_result preallocate(uint64_t)
Instructs writer to preallocate storage. May be a noop.
Definition: writer.hpp:34
virtual bool set_mtime(datetime const &)
Sets the mtime of the target.
Definition: writer.hpp:158
Definition: event_handler.hpp:60
Waitable condition variable.
Definition: mutex.hpp:233
Handle for asynchronous tasks.
Definition: thread_pool.hpp:24
A writer factory.
Definition: writer.hpp:112
Buffer management and wait machinery for asynchronous I/O.
Represents a point of time in wallclock, tracking the timestamps accuracy/precision.
Definition: time.hpp:40
Definition: writer.hpp:315
aio_result
Result of aio operations.
Definition: aio.hpp:189
virtual bool multiple_buffer_usage() const override
Whether the writer can benefit from multiple buffers.
Definition: writer.hpp:279
A buffer pool for use with async readers/writers.
Definition: aio.hpp:106
Factory for.
Definition: writer.hpp:264
virtual uint64_t size() const
Some writers, e.g. for files, may have a pre-existing size.
Definition: writer.hpp:142
Definition: writer.hpp:294
The namespace used by libfilezilla.
Definition: apply.hpp:17
virtual bool multiple_buffer_usage() const
Whether the writer can benefit from multiple buffers.
Definition: writer.hpp:149
Lean class for file access.
Definition: file.hpp:28
virtual bool offsetable() const override
If true, writer can be opened from any position, not just the beginning, such as file_writer.
Definition: writer.hpp:272
File writer.
Definition: writer.hpp:227
virtual bool set_mtime(datetime const &)
Must be finalized already.
Definition: writer.hpp:61
The buffer class is a simple buffer where data can be appended at the end and consumed at the front...
Definition: buffer.hpp:26
virtual bool offsetable() const
If true, writer can be opened from any position, not just the beginning, such as file_writer.
Definition: writer.hpp:139
A dumb thread-pool for asynchronous tasks.
Definition: thread_pool.hpp:63
std::function< void(writer_base const *, uint64_t written)> progress_cb_t
Definition: writer.hpp:75
Base class for threaded writer.
Definition: writer.hpp:202