aboutsummaryrefslogtreecommitdiff
path: root/pw_thread/public/pw_thread/thread_snapshot_service.h
diff options
context:
space:
mode:
Diffstat (limited to 'pw_thread/public/pw_thread/thread_snapshot_service.h')
-rw-r--r--pw_thread/public/pw_thread/thread_snapshot_service.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/pw_thread/public/pw_thread/thread_snapshot_service.h b/pw_thread/public/pw_thread/thread_snapshot_service.h
new file mode 100644
index 000000000..06445eb0d
--- /dev/null
+++ b/pw_thread/public/pw_thread/thread_snapshot_service.h
@@ -0,0 +1,85 @@
+// Copyright 2022 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+#pragma once
+
+#include "pw_rpc/raw/server_reader_writer.h"
+#include "pw_span/span.h"
+#include "pw_status/status.h"
+#include "pw_thread/config.h"
+#include "pw_thread/thread_info.h"
+#include "pw_thread_protos/thread.pwpb.h"
+#include "pw_thread_protos/thread_snapshot_service.pwpb.h"
+#include "pw_thread_protos/thread_snapshot_service.raw_rpc.pb.h"
+
+namespace pw::thread::proto {
+
+Status ProtoEncodeThreadInfo(pwpb::SnapshotThreadInfo::StreamEncoder& encoder,
+ const ThreadInfo& thread_info);
+
+// Calculates encoded buffer size based on code gen constants.
+constexpr size_t RequiredServiceBufferSize(
+ size_t num_threads = PW_THREAD_MAXIMUM_THREADS) {
+ constexpr size_t kSizeOfResponse =
+ pwpb::SnapshotThreadInfo::kMaxEncodedSizeBytes +
+ pwpb::Thread::kMaxEncodedSizeBytes;
+ return kSizeOfResponse * num_threads;
+}
+
+// The ThreadSnapshotService will return peak stack usage across running
+// threads when requested by GetPeak().
+//
+// Parameter encode_buffer: buffer where thread information is encoded. Size
+// depends on RequiredBufferSize().
+//
+// Parameter thread_proto_indices: array keeping track of thread boundaries in
+// the encode buffer. The service uses these indices to send response data out
+// in bundles.
+//
+// Parameter num_bundled_threads: constant describing number of threads per
+// bundle in response.
+class ThreadSnapshotService
+ : public pw_rpc::raw::ThreadSnapshotService::Service<
+ ThreadSnapshotService> {
+ public:
+ constexpr ThreadSnapshotService(
+ span<std::byte> encode_buffer,
+ Vector<size_t>& thread_proto_indices,
+ size_t num_bundled_threads = PW_THREAD_NUM_BUNDLED_THREADS)
+ : encode_buffer_(encode_buffer),
+ thread_proto_indices_(thread_proto_indices),
+ num_bundled_threads_(num_bundled_threads) {}
+ void GetPeakStackUsage(ConstByteSpan request, rpc::RawServerWriter& response);
+
+ private:
+ span<std::byte> encode_buffer_;
+ Vector<size_t>& thread_proto_indices_;
+ size_t num_bundled_threads_;
+};
+
+// A ThreadSnapshotService that allocates required buffers based on the
+// number of running threads on a device.
+template <size_t kNumThreads = PW_THREAD_MAXIMUM_THREADS>
+class ThreadSnapshotServiceBuffer : public ThreadSnapshotService {
+ public:
+ ThreadSnapshotServiceBuffer()
+ : ThreadSnapshotService(encode_buffer_, thread_proto_indices_) {}
+
+ private:
+ std::array<std::byte, RequiredServiceBufferSize(kNumThreads)> encode_buffer_;
+ // + 1 is needed to account for extra index that comes with the first
+ // submessage start or the last submessage end.
+ Vector<size_t, kNumThreads + 1> thread_proto_indices_;
+};
+
+} // namespace pw::thread::proto