122 {
123 LLFIO_LOG_FUNCTION_CALL(this);
124 std::chrono::steady_clock::time_point began_steady;
125 std::chrono::system_clock::time_point end_utc;
126 if(d)
127 {
128 if((d).steady)
129 {
130 began_steady = std::chrono::steady_clock::now();
131 }
132 else
133 {
134 end_utc = (d).to_time_point();
135 }
136 }
137 size_t n;
138
139 std::vector<std::string> entity_paths(out.entities.size());
140 for(n = 0; n < out.entities.size(); n++)
141 {
142 auto v = out.entities[n].value;
143 entity_paths[n] = QUICKCPPLIB_NAMESPACE::algorithm::string::to_hex_string(span<char>(reinterpret_cast<char *>(&v), 8));
144 }
145 _hs.resize(out.entities.size());
146 do
147 {
148 auto was_contended = static_cast<size_t>(-1);
149 {
150 auto undo = make_scope_exit([&]() noexcept {
151
152 if(n > 0)
153 {
154 --n;
155
156 for(; n > 0; n--)
157 {
158 (void) _hs[n].
close();
159 }
160 (void) _hs[0].
close();
161 }
162 });
163 for(n = 0; n < out.entities.size(); n++)
164 {
165 auto ret =
file_handle::file(_path, entity_paths[n], file_handle::mode::write, file_handle::creation::only_if_not_exist, file_handle::caching::temporary, file_handle::flag::unlink_on_first_close);
166 if(ret.has_error())
167 {
168 const auto &ec = ret.error();
169 if(ec != errc::resource_unavailable_try_again && ec != errc::file_exists)
170 {
171 return std::move(ret).error();
172 }
173
174 was_contended = n;
175 break;
176 }
177 _hs[n] = std::move(ret.value());
178 }
179 if(n == out.entities.size())
180 {
181 undo.release();
182 }
183 }
184 if(n != out.entities.size())
185 {
186 if(d)
187 {
188 if((d).steady)
189 {
190 if(std::chrono::steady_clock::now() >= (began_steady + std::chrono::nanoseconds((d).nsecs)))
191 {
192 return errc::timed_out;
193 }
194 }
195 else
196 {
197 if(std::chrono::system_clock::now() >= end_utc)
198 {
199 return errc::timed_out;
200 }
201 }
202 }
203
204 std::swap(out.entities[was_contended], out.entities[0]);
205 auto front = out.entities.begin();
206 ++front;
207 QUICKCPPLIB_NAMESPACE::algorithm::small_prng::random_shuffle(front, out.entities.end());
208
209 if(!spin_not_sleep)
210 {
211 std::this_thread::yield();
212 }
213 }
214 } while(n < out.entities.size());
215 return success();
216 }
static result< file_handle > file(const path_handle &base, path_view_type path, mode _mode=mode::read, creation _creation=creation::open_existing, caching _caching=caching::all, flag flags=flag::none) noexcept
result< void > close(handle &self) noexcept
Immediately close the native handle type managed by this handle.
Definition handle.hpp:679