CCF
Loading...
Searching...
No Matches
handle_ring_buffer.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
5#include "../ds/files.h"
6#include "../enclave/interface.h"
8#include "ds/non_blocking.h"
9#include "timer.h"
10
11#include <chrono>
12#include <ctime>
13#include <iomanip>
14#include <nlohmann/json.hpp>
15#include <string>
16#include <sys/types.h>
17#include <unistd.h>
18
19namespace asynchost
20{
22 {
23 private:
24 // Maximum number of outbound ringbuffer messages which will be processed in
25 // a single iteration
26 static constexpr size_t max_messages = 256;
27
31
32 public:
37 bp(bp),
38 r(r),
39 nbwf(nbwf)
40 {
42 bp,
43 AdminMessage::fatal_error_msg,
44 [](const uint8_t* data, size_t size) {
45 auto [msg] =
46 ringbuffer::read_message<AdminMessage::fatal_error_msg>(data, size);
47
48 std::cerr << msg << std::endl << std::flush;
49 throw std::logic_error(msg);
50 });
51
53 bp, AdminMessage::stopped, [](const uint8_t*, size_t) {
54 uv_stop(uv_default_loop());
55 LOG_INFO_FMT("Host stopped successfully");
56 });
57
59 bp, AdminMessage::restart, [&](const uint8_t*, size_t) {
60 LOG_INFO_FMT("Received request to restart enclave, sending stops");
61 auto to_enclave = nbwf.create_writer_to_inside();
62 RINGBUFFER_WRITE_MESSAGE(AdminMessage::stop, to_enclave);
63 });
64 }
65
66 void on_timer()
67 {
68 // Regularly read (and process) some outbound ringbuffer messages...
69 bp.read_n(max_messages, r);
70
71 // ...flush any pending inbound messages...
72 nbwf.flush_all_inbound();
73 }
74 };
75
77}
Definition handle_ring_buffer.h:22
HandleRingbufferImpl(messaging::BufferProcessor &bp, ringbuffer::Reader &r, ringbuffer::NonBlockingWriterFactory &nbwf)
Definition handle_ring_buffer.h:33
void on_timer()
Definition handle_ring_buffer.h:66
Definition proxy.h:51
Definition messaging.h:187
size_t read_n(size_t max_messages, ringbuffer::Reader &r)
Definition messaging.h:216
Definition non_blocking.h:193
bool flush_all_inbound()
Definition non_blocking.h:256
std::shared_ptr< ringbuffer::AbstractWriter > create_writer_to_inside() override
Definition non_blocking.h:267
Definition ring_buffer.h:172
#define LOG_INFO_FMT
Definition internal_logger.h:15
#define DISPATCHER_SET_MESSAGE_HANDLER(DISP, MSG,...)
Definition messaging.h:292
Definition after_io.h:8
#define RINGBUFFER_WRITE_MESSAGE(MSG,...)
Definition ring_buffer_types.h:259