Skip to content

Commit dca4a71

Browse files
committed
save debug log
1 parent 7a9aa72 commit dca4a71

File tree

10 files changed

+92
-27
lines changed

10 files changed

+92
-27
lines changed

Firestore/Example/Firestore.xcodeproj/xcshareddata/xcschemes/Firestore_IntegrationTests_iOS.xcscheme

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
2828
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
2929
shouldUseLaunchSchemeArgsEnv = "YES"
30+
enableAddressSanitizer = "YES"
3031
enableASanStackUseAfterReturn = "YES">
3132
<MacroExpansion>
3233
<BuildableReference
@@ -37,6 +38,13 @@
3738
ReferencedContainer = "container:Firestore.xcodeproj">
3839
</BuildableReference>
3940
</MacroExpansion>
41+
<AdditionalOptions>
42+
<AdditionalOption
43+
key = "NSZombieEnabled"
44+
value = "YES"
45+
isEnabled = "YES">
46+
</AdditionalOption>
47+
</AdditionalOptions>
4048
<Testables>
4149
<TestableReference
4250
skipped = "NO">

Firestore/Source/API/FIRCallbackWrapper.mm

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#import "FIRCallbackWrapper.h"
1818

19+
#include <iostream>
1920
#include <memory>
2021
#include <utility>
2122
#include <vector>
@@ -35,21 +36,24 @@
3536
@implementation FIRCallbackWrapper
3637

3738
+ (PipelineSnapshotListener)wrapPipelineCallback:(std::shared_ptr<api::Firestore>)firestore
38-
completion:(void (^)(PipelineResultVector result,
39+
completion:(void (^)(CppPipelineResult *result,
3940
NSError *_Nullable error))completion {
40-
class Converter : public EventListener<std::vector<PipelineResult>> {
41+
class Converter : public EventListener<CppPipelineResult> {
4142
public:
4243
explicit Converter(std::shared_ptr<api::Firestore> firestore, PipelineBlock completion)
4344
: firestore_(firestore), completion_(completion) {
4445
}
4546

46-
void OnEvent(StatusOr<std::vector<PipelineResult>> maybe_snapshot) override {
47+
void OnEvent(StatusOr<CppPipelineResult> maybe_snapshot) override {
4748
if (maybe_snapshot.ok()) {
48-
completion_(
49-
std::initializer_list<PipelineResult>{PipelineResult::GetTestResult(firestore_)},
50-
nullptr);
49+
std::cout << "zzyzx OnEvent 1" << std::endl;
50+
CppPipelineResult result = maybe_snapshot.ValueOrDie();
51+
std::cout << "zzyzx OnEvent 2 result.id=" << result.id_ << std::endl;
52+
completion_(&result, nullptr);
53+
std::cout << "zzyzx OnEvent 3 result.id=" << result.id_ << std::endl;
5154
} else {
52-
completion_(std::initializer_list<PipelineResult>{}, MakeNSError(maybe_snapshot.status()));
55+
// completion_(PipelineResult::GetTestResult(firestore_),
56+
// MakeNSError(maybe_snapshot.status()));
5357
}
5458
}
5559

@@ -58,7 +62,7 @@ void OnEvent(StatusOr<std::vector<PipelineResult>> maybe_snapshot) override {
5862
PipelineBlock completion_;
5963
};
6064

61-
return absl::make_unique<Converter>(firestore, completion);
65+
return std::make_shared<Converter>(firestore, completion);
6266
}
6367

6468
@end

Firestore/Source/Public/FirebaseFirestore/FIRCallbackWrapper.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ namespace core = firebase::firestore::core;
3838

3939
NS_ASSUME_NONNULL_BEGIN
4040

41-
typedef void (^PipelineBlock)(std::vector<api::PipelineResult> result, NSError *_Nullable error)
42-
NS_SWIFT_UNAVAILABLE("Use Swift's closure syntax instead.");
41+
typedef api::PipelineResult CppPipelineResult;
4342

44-
typedef std::vector<api::PipelineResult> PipelineResultVector;
43+
typedef void (^PipelineBlock)(CppPipelineResult *result, NSError *_Nullable error)
44+
NS_SWIFT_UNAVAILABLE("Use Swift's closure syntax instead.");
4545

4646
NS_SWIFT_SENDABLE
4747
NS_SWIFT_NAME(CallbackWrapper)
@@ -51,9 +51,9 @@ NS_SWIFT_NAME(CallbackWrapper)
5151
// are invoked on a different thread than the one they were originally defined in. If this callback
5252
// is expected to be called on a different thread, it should be marked as `Sendable` to ensure
5353
// thread safety.
54-
+ (std::shared_ptr<core::EventListener<std::vector<api::PipelineResult>>>)
54+
+ (std::shared_ptr<core::EventListener<api::PipelineResult>>)
5555
wrapPipelineCallback:(std::shared_ptr<api::Firestore>)firestore
56-
completion:(void (^NS_SWIFT_SENDABLE)(PipelineResultVector result,
56+
completion:(void (^NS_SWIFT_SENDABLE)(CppPipelineResult *result,
5757
NSError *_Nullable error))completion
5858
NS_SWIFT_NAME(wrapPipelineCallback(firestore:completion:));
5959

Firestore/Swift/Source/SwiftAPI/Pipeline.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,17 @@ public struct Pipeline {
2929
}
3030

3131
@discardableResult
32-
public func GetPipelineResult() async throws -> [PipelineResult] {
32+
public func GetPipelineResult() async throws -> Int {
3333
return try await withCheckedThrowingContinuation { continuation in
3434
let listener = CallbackWrapper.wrapPipelineCallback(firestore: cppObj.GetFirestore()) {
3535
result, error in
3636
if let error {
3737
continuation.resume(throwing: error)
3838
} else {
3939
// Our callbacks guarantee that we either return an error or a progress event.
40-
continuation.resume(returning: PipelineResult.convertToArrayFromCppVector(result))
40+
print("zzyzx Swift use id: \(result.pointee.id_)")
41+
PipelineResult(result.pointee)
42+
continuation.resume(returning: 5)
4143
}
4244
}
4345
cppObj.GetPipelineResult(listener)

Firestore/Swift/Source/SwiftAPI/PipelineResult.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,18 @@ public struct PipelineResult {
2222

2323
public init(_ cppSource: firebase.firestore.api.PipelineResult) {
2424
cppObj = cppSource
25+
print("zzyzx SwiftObj id: \(cppObj.id_)")
2526
}
2627

27-
static func convertToArrayFromCppVector(_ vector: PipelineResultVector)
28+
static func convertToArrayFromCppVector(_ vector: CppPipelineResult)
2829
-> [PipelineResult] {
2930
// Create a Swift array and populate it by iterating over the C++ vector
3031
var swiftArray: [PipelineResult] = []
3132

32-
for index in vector.indices {
33-
let cppResult = vector[index]
34-
swiftArray.append(PipelineResult(cppResult))
35-
}
33+
// for index in vector.indices {
34+
// let cppResult = vector[index]
35+
// swiftArray.append(PipelineResult(cppResult))
36+
// }
3637

3738
return swiftArray
3839
}

Firestore/Swift/Tests/Integration/PipelineTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ final class PipelineTests: FSTIntegrationTestCase {
2121
func testCreatePipeline() async throws {
2222
let pipelineSource: PipelineSource = db.pipeline()
2323
let pipeline: Pipeline = pipelineSource.GetCollection("path")
24-
let _: [PipelineResult] = try await pipeline.GetPipelineResult()
24+
let _ = try await pipeline.GetPipelineResult()
2525
}
2626
}

Firestore/core/interfaceForSwift/api/pipeline.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ void Pipeline::GetPipelineResult(PipelineSnapshotListener callback) const {
4545
/*include_document_metadata_changes=*/true,
4646
/*wait_for_sync_when_online=*/true);
4747

48-
callback->OnEvent(StatusOr<std::vector<PipelineResult>>(
49-
{(PipelineResult::GetTestResult(firestore_))}));
48+
PipelineResult sample = PipelineResult::GetTestResult(firestore_);
49+
50+
StatusOr<PipelineResult> res(sample);
51+
callback->OnEvent(res);
5052

5153
// class ListenOnce : public EventListener<std::vector<PipelineResult>> {
5254
// public:

Firestore/core/interfaceForSwift/api/pipeline.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Firestore;
3535
class PipelineResult;
3636

3737
using PipelineSnapshotListener =
38-
std::shared_ptr<core::EventListener<std::vector<PipelineResult>>>;
38+
std::shared_ptr<core::EventListener<PipelineResult>>;
3939

4040
class Pipeline {
4141
public:

Firestore/core/interfaceForSwift/api/pipeline_result.cc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,29 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#include "Firestore/core/interfaceForSwift/api/pipeline_result.h"
15+
#include <iostream>
16+
1617
#include "Firestore/core/include/firebase/firestore/timestamp.h"
18+
#include "Firestore/core/interfaceForSwift/api/pipeline_result.h"
1719

1820
namespace firebase {
1921
namespace firestore {
2022

2123
namespace api {
2224

25+
std::atomic<int> next_id(0);
26+
2327
PipelineResult::PipelineResult(std::shared_ptr<Firestore> firestore,
2428
std::shared_ptr<Timestamp> execution_time,
2529
std::shared_ptr<Timestamp> update_time,
2630
std::shared_ptr<Timestamp> create_time)
27-
: firestore_(firestore),
31+
: id_(next_id.fetch_add(1)),
32+
firestore_(firestore),
2833
execution_time_(execution_time),
2934
update_time_(update_time),
3035
create_time_(create_time) {
36+
std::cout << "zzyzx PipelineResult[" << id_ << "]@"
37+
<< reinterpret_cast<std::uintptr_t>(this) << "()" << std::endl;
3138
}
3239

3340
PipelineResult PipelineResult::GetTestResult(

Firestore/core/interfaceForSwift/api/pipeline_result.h

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
#ifndef FIRESTORE_CORE_INTERFACEFORSWIFT_API_PIPELINE_RESULT_H_
1616
#define FIRESTORE_CORE_INTERFACEFORSWIFT_API_PIPELINE_RESULT_H_
1717

18+
#include <atomic>
19+
#include <iostream>
1820
#include <memory>
1921

2022
namespace firebase {
@@ -28,16 +30,55 @@ namespace api {
2830
class Firestore;
2931
class DocumentReference;
3032

33+
extern std::atomic<int> next_id;
34+
3135
class PipelineResult {
3236
public:
3337
PipelineResult(std::shared_ptr<Firestore> firestore,
3438
std::shared_ptr<Timestamp> execution_time,
3539
std::shared_ptr<Timestamp> update_time,
3640
std::shared_ptr<Timestamp> create_time);
3741

42+
// Copy constructor
43+
PipelineResult(const PipelineResult& other)
44+
: id_(next_id.fetch_add(1)),
45+
firestore_(other.firestore_),
46+
execution_time_(other.execution_time_),
47+
update_time_(other.update_time_),
48+
create_time_(other.create_time_) {
49+
std::cout << "zzyzx PipelineResult[" << id_ << "]@"
50+
<< reinterpret_cast<std::uintptr_t>(this)
51+
<< "(const PipelineResult&) other.id=" << other.id_ << std::endl;
52+
long n = execution_time_.use_count();
53+
std::cout << "Calling copy ctor when refer count is:" << n << std::endl;
54+
}
55+
56+
// Copy assignment operator
57+
PipelineResult& operator=(const PipelineResult& other) {
58+
std::cout << "zzyzx PipelineResult[" << id_ << "]@"
59+
<< reinterpret_cast<std::uintptr_t>(this)
60+
<< ".operator=(const PipelineResult&) other.id_=" << other.id_
61+
<< std::endl;
62+
if (this != &other) {
63+
firestore_ = other.firestore_;
64+
execution_time_ = other.execution_time_;
65+
update_time_ = other.update_time_;
66+
create_time_ = other.create_time_;
67+
}
68+
return *this;
69+
}
70+
3871
static PipelineResult GetTestResult(std::shared_ptr<Firestore> firestore);
3972

40-
private:
73+
~PipelineResult() {
74+
std::cout << "zzyzx PipelineResult[" << id_ << "]@"
75+
<< reinterpret_cast<std::uintptr_t>(this) << "~PipelineResult()"
76+
<< std::endl;
77+
long n = execution_time_.use_count();
78+
std::cout << "Calling destructor when refer count is:" << n << std::endl;
79+
}
80+
81+
int id_;
4182
std::shared_ptr<Firestore> firestore_;
4283
std::shared_ptr<Timestamp> execution_time_;
4384
std::shared_ptr<Timestamp> update_time_;

0 commit comments

Comments
 (0)