Commit message (Collapse) | Author | Age | Files | Lines | |
---|---|---|---|---|---|
* | bftw: Fix quadratic reference counting complexity | Tavian Barnes | 2017-03-20 | 1 | -8/+15 |
| | | | | | | | | | | | | | dircache_entry refcounts used to count every single descendant, resulting in n refcount updates to create/delete an entry at depth n, and thus O(n^2) complexity overall for deep directory structures. Fix it by only counting direct children instead. The cache eviction policy is changed to prefer shallower entries in all cases, attempting to save at least some of the benefit of the previous accounting scheme. Unfortunately, the average number of traversed components for openat() calls still went up by ~20%, but the performance in practice is roughly unchanged in my tests. | ||||
* | Color link targets for -ls | Tavian Barnes | 2017-03-16 | 1 | -19/+1 |
| | | | | Fixes #18. | ||||
* | bftw: Make the nameoff of "///" point to "/" | Tavian Barnes | 2017-02-09 | 1 | -0/+3 |
| | | | | This simplifies a few things such as -name handling for ///. | ||||
* | bftw: Add the DIR* to bftw_state | Tavian Barnes | 2017-02-09 | 1 | -15/+39 |
| | | | | Can't forget to close it that way. | ||||
* | Add support for -x?type with multiple types | Tavian Barnes | 2017-02-08 | 1 | -30/+26 |
| | | | | This functionality is already part of GNU findutils git. | ||||
* | bftw: Add mising closedir() to error path | Tavian Barnes | 2017-02-07 | 1 | -0/+1 |
| | |||||
* | bftw: Plug a leak if dirqueue_push() fails | Tavian Barnes | 2017-02-06 | 1 | -16/+28 |
| | | | | | | | | | | If bftw_add() succeeds but dirqueue_push() fails, we need to clean up the just-added dircache_entry. Otherwise it will leak, and we'll also fail the cache->size == 0 assertion. Fix it by extracting the dircache-related parts of bftw_pop() into a new helper function bftw_gc(), and call it from bftw_pop() as well as the bftw_push() failure path. | ||||
* | bftw: Compute nameoff correctly for the root in BFTW_DEPTH mode | Tavian Barnes | 2017-02-05 | 1 | -1/+5 |
| | |||||
* | Implement -printf/-fprintf | Tavian Barnes | 2017-02-05 | 1 | -0/+1 |
| | | | | | Based on a patch by Fangrui Song <i@maskray.me>. Closes #16. | ||||
* | Implement -regex, -iregex, and -regextype/-E | Tavian Barnes | 2016-12-18 | 1 | -1/+4 |
| | |||||
* | bftw: Clean up the dirqueue implementation a bit | Tavian Barnes | 2016-12-17 | 1 | -38/+34 |
| | |||||
* | Move portability code into util.h | Tavian Barnes | 2016-12-04 | 1 | -2/+2 |
| | |||||
* | bftw: Infer the flags in ftwbuf_stat() | Tavian Barnes | 2016-11-23 | 1 | -5/+5 |
| | |||||
* | bftw: Make a defensive copy of the ftwbuf | Tavian Barnes | 2016-11-21 | 1 | -1/+4 |
| | | | | | The callback may modify the ftwbuf, but we check it after the callback (for typeflag and statbuf). Have them mutate a copy instead. | ||||
* | bftw: Always initialize dircache_entry::{dev,ino} | Tavian Barnes | 2016-11-21 | 1 | -6/+7 |
| | | | | | If stat() fails, they won't get filled in otherwise. Then cycle detection would have read uninitialized values. | ||||
* | bftw: Make bftw_flags more similar to fts() options. | Tavian Barnes | 2016-11-21 | 1 | -5/+9 |
| | |||||
* | Check for readdir() errors everywhere. | Tavian Barnes | 2016-11-14 | 1 | -14/+2 |
| | |||||
* | bftw: Keep trailing slashes on the root in BFTW_DEPTH mode. | Tavian Barnes | 2016-11-13 | 1 | -6/+16 |
| | |||||
* | bftw: Don't fail just because we couldn't open/read a directory. | Tavian Barnes | 2016-11-03 | 1 | -3/+3 |
| | | | | | | | With BFTW_RECOVER set, we're not supposed to fail just because a single measly directory couldn't be handled. But using state.error as scratch space made us fail in this case. The end result is that #7 resurfaced, so fix it again. | ||||
* | Implement -ignore_readdir_race. | Tavian Barnes | 2016-10-24 | 1 | -1/+4 |
| | |||||
* | bftw: Add support for some exotic file types, where available. | Tavian Barnes | 2016-10-02 | 1 | -1/+59 |
| | |||||
* | bftw: Handle errors from readdir(). | Tavian Barnes | 2016-10-02 | 1 | -25/+66 |
| | |||||
* | bftw: Fix do/to typo in a comment. | Tavian Barnes | 2016-09-10 | 1 | -1/+1 |
| | |||||
* | bftw: Initialize typeflag to BFTW_UNKNOWN. | Tavian Barnes | 2016-08-24 | 1 | -2/+1 |
| | | | | It was totally broken on filesystems that spit out DT_UNKNOWN. | ||||
* | dstring: Clean up the API a bit. | Tavian Barnes | 2016-05-22 | 1 | -1/+4 |
| | |||||
* | bftw: Use realloc() to grow the dirqueue. | Tavian Barnes | 2016-05-17 | 1 | -13/+11 |
| | |||||
* | bftw: Remove some debugging counters that were left in accidentally. | Tavian Barnes | 2016-05-17 | 1 | -10/+0 |
| | |||||
* | dstring: Split out the dynamic string logic. | Tavian Barnes | 2016-04-13 | 1 | -68/+25 |
| | |||||
* | bftw: Update at_flags when not following a broken symbolic link. | Tavian Barnes | 2016-02-23 | 1 | -1/+2 |
| | |||||
* | bftw: Plug a leak when the root is not a directory. | Tavian Barnes | 2016-02-23 | 1 | -1/+6 |
| | |||||
* | bftw: Use the currently open directory as at_fd in BFTW_CHILD mode. | Tavian Barnes | 2016-02-22 | 1 | -2/+5 |
| | |||||
* | bftw: Use O_CLOEXEC. | Tavian Barnes | 2016-02-21 | 1 | -3/+3 |
| | |||||
* | bftw: Don't store the terminating '\0' in dircache_entry names. | Tavian Barnes | 2016-02-21 | 1 | -2/+1 |
| | |||||
* | bftw: Use a better cache eviction policy. | Tavian Barnes | 2016-02-21 | 1 | -113/+186 |
| | | | | | | Instead of simple LRU, we now evict the open entry with the lowest refcount. This reduces the average number of components passed to openat() by a significant margin, and speeds bfs up by about ~5%. | ||||
* | bftw: Shrink the LRU before finding the parent. | Tavian Barnes | 2016-02-20 | 1 | -10/+6 |
| | | | | Otherwise we might close the found parent. | ||||
* | bftw: Clean up dirqueue implementation a bit. | Tavian Barnes | 2016-02-19 | 1 | -20/+28 |
| | |||||
* | bftw: Don't keep DIR*'s around. | Tavian Barnes | 2016-02-19 | 1 | -40/+75 |
| | | | | | | | | | | | | | | | DIR*'s were being kept around so dirfd(dir) could be passed to future openat() calls. But DIR*'s are big, holding a cache of filenames etc. read by readdir(). Instead, store the raw fd and dup() it to open a DIR* with fdopendir(). This way we can call dirclose() as soon as possible, while still keeping an open fd. Ideally there would be a way to closedir() without invoking close() on the underlying fd, but this is a good approximation. Reduces memory footprint by around 64% in a large directory tree. | ||||
* | bftw: Use a circular buffer to implement the dirqueue. | Tavian Barnes | 2016-02-17 | 1 | -46/+37 |
| | |||||
* | Implement -mount/-xdev. | Tavian Barnes | 2016-02-14 | 1 | -2/+11 |
| | |||||
* | Fix -name handling when the root has trailing slashes. | Tavian Barnes | 2016-02-13 | 1 | -2/+18 |
| | |||||
* | Follow links if appropriate in predicates. | Tavian Barnes | 2016-02-13 | 1 | -5/+3 |
| | |||||
* | Implement -L/-follow. | Tavian Barnes | 2016-02-09 | 1 | -22/+66 |
| | |||||
* | bftw: Don't give up when following a broken symlink. | Tavian Barnes | 2016-02-06 | 1 | -1/+9 |
| | |||||
* | Implement -P and -H. | Tavian Barnes | 2016-02-04 | 1 | -4/+14 |
| | |||||
* | Don't use typedefs to avoid struct/enum tags. | Tavian Barnes | 2016-02-04 | 1 | -66/+62 |
| | |||||
* | bftw: Add missing #include. | Tavian Barnes | 2016-01-30 | 1 | -0/+1 |
| | |||||
* | bftw: Fix fd leak if fdopendir() fails. | Tavian Barnes | 2016-01-30 | 1 | -1/+5 |
| | |||||
* | Optimize -maxdepth in -depth mode. | Tavian Barnes | 2015-09-26 | 1 | -14/+1 |
| | |||||
* | bftw() interface improvements: | Tavian Barnes | 2015-09-26 | 1 | -52/+38 |
| | | | | | | - Use enums instead of ints where it makes sense - Move the file path inside struct BFTW - Expose a fd and relative path for *at() calls | ||||
* | Add -depth support. | Tavian Barnes | 2015-09-08 | 1 | -41/+186 |
| | | | | | | | The resulting order is fairly weird, as files are still returned in breadth-first order, but directories are returned in a backwards order based on when their reference counts drop to zero. But it's good enough for -delete support. |