]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os: capture local bindings using capture variable list 37890/head
authorKefu Chai <kchai@redhat.com>
Thu, 29 Oct 2020 08:24:45 +0000 (16:24 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 29 Oct 2020 08:32:26 +0000 (16:32 +0800)
structured binding does not define variables, and the implicit
capture-by-copy `=` does not help in this case, we have to define a
capture with an initializer to create a *variable* enclosed by
the closure explicitly.

this address the error like:

src/crimson/os/seastore/segment_cleaner.cc:315:5: error: reference to local binding 'addr' declared in enclosing lambda expression
                  addr);
                  ^

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/os/seastore/segment_cleaner.cc

index 21e669f5614334483c9a2159e1eb0abffb62f676..a3ed047d7d47486bbb25b74aa77cbcf9a50ca089 100644 (file)
@@ -308,7 +308,7 @@ SegmentCleaner::do_gc_ret SegmentCleaner::do_gc(
              addr,
              info.addr,
              info.len
-           ).safe_then([=, &t](CachedExtentRef ext) {
+           ).safe_then([addr=addr, &t, this](CachedExtentRef ext) {
              if (!ext) {
                logger().debug(
                  "SegmentCleaner::do_gc: addr {} dead, skipping",
@@ -324,7 +324,7 @@ SegmentCleaner::do_gc_ret SegmentCleaner::do_gc(
                t,
                ext);
            });
-         }).safe_then([=, &t] {
+         }).safe_then([next=next, &t, this] {
            auto old_pos = std::exchange(gc_current_pos, next);
            if (gc_current_pos == P_ADDR_NULL) {
              t.mark_segment_to_release(old_pos.segment);