Skip to content

Commit 5f78cfc

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

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
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: 40 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+
_LIBCPP_AVAILABILITY_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;
@@ -306,34 +309,42 @@ class directory_entry {
306309
case _Empty:
307310
return __symlink_status(__p_, __ec).type();
308311
case _IterSymlink:
312+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
309313
case _IterCachedSymlink:
314+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
310315
case _RefreshSymlink:
311316
case _RefreshSymlinkUnresolved:
312317
if (__ec)
313318
__ec->clear();
314319
return file_type::symlink;
315-
case _IterNonSymlink:
320+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
316321
case _IterCachedNonSymlink:
317-
case _RefreshNonSymlink:
322+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
323+
case _IterNonSymlink:
324+
case _RefreshNonSymlink: {
318325
file_status __st(__data_.__type_);
319326
if (__ec && !filesystem::exists(__st))
320327
*__ec = make_error_code(errc::no_such_file_or_directory);
321328
else if (__ec)
322329
__ec->clear();
323330
return __data_.__type_;
324331
}
332+
}
325333
__libcpp_unreachable();
326334
}
327335

328336
_LIBCPP_HIDE_FROM_ABI file_type __get_ft(error_code* __ec = nullptr) const {
329337
switch (__data_.__cache_type_) {
330338
case _Empty:
331339
case _IterSymlink:
332-
case _IterCachedSymlink:
333340
case _RefreshSymlinkUnresolved:
334341
return __status(__p_, __ec).type();
335-
case _IterNonSymlink:
342+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
343+
case _IterCachedSymlink:
344+
return __status(__p_, __ec).type();
336345
case _IterCachedNonSymlink:
346+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
347+
case _IterNonSymlink:
337348
case _RefreshNonSymlink:
338349
case _RefreshSymlink: {
339350
file_status __st(__data_.__type_);
@@ -352,13 +363,17 @@ class directory_entry {
352363
case _Empty:
353364
case _IterNonSymlink:
354365
case _IterSymlink:
355-
case _IterCachedSymlink:
356366
case _RefreshSymlinkUnresolved:
357367
return __status(__p_, __ec);
358-
case _IterCachedNonSymlink:
359368
case _RefreshNonSymlink:
360369
case _RefreshSymlink:
361370
return file_status(__get_ft(__ec), __data_.__non_sym_perms_);
371+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
372+
case _IterCachedSymlink:
373+
return __status(__p_, __ec);
374+
case _IterCachedNonSymlink:
375+
return file_status(__get_ft(__ec), __data_.__non_sym_perms_);
376+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
362377
}
363378
__libcpp_unreachable();
364379
}
@@ -369,13 +384,17 @@ class directory_entry {
369384
case _IterNonSymlink:
370385
case _IterSymlink:
371386
return __symlink_status(__p_, __ec);
372-
case _IterCachedNonSymlink:
373387
case _RefreshNonSymlink:
374388
return file_status(__get_sym_ft(__ec), __data_.__non_sym_perms_);
375-
case _IterCachedSymlink:
376389
case _RefreshSymlink:
377390
case _RefreshSymlinkUnresolved:
378391
return file_status(__get_sym_ft(__ec), __data_.__sym_perms_);
392+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
393+
case _IterCachedNonSymlink:
394+
return file_status(__get_sym_ft(__ec), __data_.__non_sym_perms_);
395+
case _IterCachedSymlink:
396+
return file_status(__get_sym_ft(__ec), __data_.__sym_perms_);
397+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
379398
}
380399
__libcpp_unreachable();
381400
}
@@ -385,10 +404,13 @@ class directory_entry {
385404
case _Empty:
386405
case _IterNonSymlink:
387406
case _IterSymlink:
388-
case _IterCachedSymlink:
389407
case _RefreshSymlinkUnresolved:
390408
return filesystem::__file_size(__p_, __ec);
409+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
410+
case _IterCachedSymlink:
411+
return filesystem::__file_size(__p_, __ec);
391412
case _IterCachedNonSymlink:
413+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
392414
case _RefreshSymlink:
393415
case _RefreshNonSymlink: {
394416
error_code __m_ec;
@@ -409,8 +431,10 @@ class directory_entry {
409431
case _Empty:
410432
case _IterNonSymlink:
411433
case _IterSymlink:
434+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
412435
case _IterCachedNonSymlink:
413436
case _IterCachedSymlink:
437+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
414438
case _RefreshSymlinkUnresolved:
415439
return filesystem::__hard_link_count(__p_, __ec);
416440
case _RefreshSymlink:
@@ -429,10 +453,13 @@ class directory_entry {
429453
case _Empty:
430454
case _IterNonSymlink:
431455
case _IterSymlink:
432-
case _IterCachedSymlink:
433456
case _RefreshSymlinkUnresolved:
434457
return filesystem::__last_write_time(__p_, __ec);
458+
# if _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
459+
case _IterCachedSymlink:
460+
return filesystem::__last_write_time(__p_, __ec);
435461
case _IterCachedNonSymlink:
462+
# endif // _LIBCPP_AVAILABILITY_HAS_FILESYSTEM_FULLY_POPULATED_CACHED_ENTRY
436463
case _RefreshSymlink:
437464
case _RefreshNonSymlink: {
438465
error_code __m_ec;

0 commit comments

Comments
 (0)