Skip to content

Commit d8211d9

Browse files
committed
[libcxx] Add availability for populating cache from directory_iterator.
1 parent 69a00a0 commit d8211d9

File tree

3 files changed

+53
-14
lines changed

3 files changed

+53
-14
lines changed

libcxx/include/__configuration/availability.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,12 @@
353353
#define _LIBCPP_AVAILABILITY_HAS_BAD_EXPECTED_ACCESS_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19
354354
#define _LIBCPP_AVAILABILITY_BAD_EXPECTED_ACCESS_KEY_FUNCTION _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE
355355

356+
// This controls the availability of populating cache for directory entry
357+
// filesystem system. A directory_iterator builds cache for directory_entry
358+
// in the library.
359+
#define _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY _LIBCPP_INTRODUCED_IN_LLVM_19
360+
#define _LIBCPP_AVAILABILITY_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY _LIBCPP_INTRODUCED_IN_LLVM_19_ATTRIBUTE
361+
356362
// Define availability attributes that depend on _LIBCPP_HAS_NO_EXCEPTIONS.
357363
// Those are defined in terms of the availability attributes above, and
358364
// should not be vendor-specific.

libcxx/include/__filesystem/directory_entry.h

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,13 @@ class directory_entry {
199199
_Empty,
200200
_IterSymlink,
201201
_IterNonSymlink,
202-
_IterCachedSymlink,
203-
_IterCachedNonSymlink,
204202
_RefreshSymlink,
205203
_RefreshSymlinkUnresolved,
206-
_RefreshNonSymlink
204+
_RefreshNonSymlink,
205+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
206+
_IterCachedSymlink,
207+
_IterCachedNonSymlink
208+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
207209
};
208210

209211
struct __cached_data {
@@ -242,6 +244,7 @@ class directory_entry {
242244
return __data;
243245
}
244246

247+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
245248
_LIBCPP_HIDE_FROM_ABI static __cached_data
246249
__create_iter_cached_result(file_type __ft, uintmax_t __size, perms __perm, file_time_type __write_time) {
247250
__cached_data __data;
@@ -264,6 +267,7 @@ class directory_entry {
264267
}();
265268
return __data;
266269
}
270+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
267271

268272
_LIBCPP_HIDE_FROM_ABI void __assign_iter_entry(_Path&& __p, __cached_data __dt) {
269273
__p_ = std::move(__p);
@@ -306,34 +310,42 @@ class directory_entry {
306310
case _Empty:
307311
return __symlink_status(__p_, __ec).type();
308312
case _IterSymlink:
313+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
309314
case _IterCachedSymlink:
315+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
310316
case _RefreshSymlink:
311317
case _RefreshSymlinkUnresolved:
312318
if (__ec)
313319
__ec->clear();
314320
return file_type::symlink;
315-
case _IterNonSymlink:
321+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
316322
case _IterCachedNonSymlink:
317-
case _RefreshNonSymlink:
323+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
324+
case _IterNonSymlink:
325+
case _RefreshNonSymlink: {
318326
file_status __st(__data_.__type_);
319327
if (__ec && !filesystem::exists(__st))
320328
*__ec = make_error_code(errc::no_such_file_or_directory);
321329
else if (__ec)
322330
__ec->clear();
323331
return __data_.__type_;
324332
}
333+
}
325334
__libcpp_unreachable();
326335
}
327336

328337
_LIBCPP_HIDE_FROM_ABI file_type __get_ft(error_code* __ec = nullptr) const {
329338
switch (__data_.__cache_type_) {
330339
case _Empty:
331340
case _IterSymlink:
332-
case _IterCachedSymlink:
333341
case _RefreshSymlinkUnresolved:
334342
return __status(__p_, __ec).type();
335-
case _IterNonSymlink:
343+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
344+
case _IterCachedSymlink:
345+
return __status(__p_, __ec).type();
336346
case _IterCachedNonSymlink:
347+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
348+
case _IterNonSymlink:
337349
case _RefreshNonSymlink:
338350
case _RefreshSymlink: {
339351
file_status __st(__data_.__type_);
@@ -352,13 +364,17 @@ class directory_entry {
352364
case _Empty:
353365
case _IterNonSymlink:
354366
case _IterSymlink:
355-
case _IterCachedSymlink:
356367
case _RefreshSymlinkUnresolved:
357368
return __status(__p_, __ec);
358-
case _IterCachedNonSymlink:
359369
case _RefreshNonSymlink:
360370
case _RefreshSymlink:
361371
return file_status(__get_ft(__ec), __data_.__non_sym_perms_);
372+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
373+
case _IterCachedSymlink:
374+
return __status(__p_, __ec);
375+
case _IterCachedNonSymlink:
376+
return file_status(__get_ft(__ec), __data_.__non_sym_perms_);
377+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
362378
}
363379
__libcpp_unreachable();
364380
}
@@ -369,13 +385,17 @@ class directory_entry {
369385
case _IterNonSymlink:
370386
case _IterSymlink:
371387
return __symlink_status(__p_, __ec);
372-
case _IterCachedNonSymlink:
373388
case _RefreshNonSymlink:
374389
return file_status(__get_sym_ft(__ec), __data_.__non_sym_perms_);
375-
case _IterCachedSymlink:
376390
case _RefreshSymlink:
377391
case _RefreshSymlinkUnresolved:
378392
return file_status(__get_sym_ft(__ec), __data_.__sym_perms_);
393+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
394+
case _IterCachedNonSymlink:
395+
return file_status(__get_sym_ft(__ec), __data_.__non_sym_perms_);
396+
case _IterCachedSymlink:
397+
return file_status(__get_sym_ft(__ec), __data_.__sym_perms_);
398+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
379399
}
380400
__libcpp_unreachable();
381401
}
@@ -385,10 +405,13 @@ class directory_entry {
385405
case _Empty:
386406
case _IterNonSymlink:
387407
case _IterSymlink:
388-
case _IterCachedSymlink:
389408
case _RefreshSymlinkUnresolved:
390409
return filesystem::__file_size(__p_, __ec);
410+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
411+
case _IterCachedSymlink:
412+
return filesystem::__file_size(__p_, __ec);
391413
case _IterCachedNonSymlink:
414+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
392415
case _RefreshSymlink:
393416
case _RefreshNonSymlink: {
394417
error_code __m_ec;
@@ -409,8 +432,10 @@ class directory_entry {
409432
case _Empty:
410433
case _IterNonSymlink:
411434
case _IterSymlink:
435+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
412436
case _IterCachedNonSymlink:
413437
case _IterCachedSymlink:
438+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
414439
case _RefreshSymlinkUnresolved:
415440
return filesystem::__hard_link_count(__p_, __ec);
416441
case _RefreshSymlink:
@@ -429,10 +454,13 @@ class directory_entry {
429454
case _Empty:
430455
case _IterNonSymlink:
431456
case _IterSymlink:
432-
case _IterCachedSymlink:
433457
case _RefreshSymlinkUnresolved:
434458
return filesystem::__last_write_time(__p_, __ec);
459+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
460+
case _IterCachedSymlink:
461+
return filesystem::__last_write_time(__p_, __ec);
435462
case _IterCachedNonSymlink:
463+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
436464
case _RefreshSymlink:
437465
case _RefreshNonSymlink: {
438466
error_code __m_ec;

libcxx/src/filesystem/directory_iterator.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,16 @@ class __dir_stream {
7979
return false;
8080
__entry_.__assign_iter_entry(
8181
__root_ / __data_.cFileName,
82+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
8283
directory_entry::__create_iter_cached_result(
8384
detail::get_file_type(__data_),
8485
detail::get_file_size(__data_),
8586
detail::get_file_perm(__data_),
86-
detail::get_write_time(__data_)));
87+
detail::get_write_time(__data_))
88+
# else
89+
directory_entry::__create_iter_result(detail::get_file_type(__data_))
90+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
91+
);
8792
return true;
8893
}
8994

0 commit comments

Comments
 (0)