@@ -37,11 +37,13 @@ using std::move;
3737using std::string;
3838using std::chrono::milliseconds;
3939using std::unique_ptr;
40+ using std::get;
4041
4142namespace cppkafka {
4243
4344Producer::Producer (Configuration config)
44- : KafkaHandleBase(move(config)), message_payload_policy_(PayloadPolicy::COPY_PAYLOAD) {
45+ : KafkaHandleBase(move(config)), message_payload_policy_(PayloadPolicy::COPY_PAYLOAD),
46+ has_internal_data_ (false ) {
4547 char error_buffer[512 ];
4648 auto config_handle = get_configuration ().get_handle ();
4749 rd_kafka_conf_set_opaque (config_handle, this );
@@ -67,47 +69,37 @@ void Producer::produce(const MessageBuilder& builder) {
6769 const Buffer& payload = builder.payload ();
6870 const Buffer& key = builder.key ();
6971 const int policy = static_cast <int >(message_payload_policy_);
70- void * opaque = builder.user_data ();
71- unique_ptr<MessageInternal> internal_data;
72- if (get_configuration ().get_delivery_report_callback ()) {
73- internal_data.reset (new MessageInternal (builder.user_data (), builder.internal ()));
74- opaque = internal_data.get ();
75- }
72+ LoadResult load_result = load_internal (builder.user_data (), builder.internal ());
7673 auto result = rd_kafka_producev (get_handle (),
7774 RD_KAFKA_V_TOPIC (builder.topic ().data ()),
7875 RD_KAFKA_V_PARTITION (builder.partition ()),
7976 RD_KAFKA_V_MSGFLAGS (policy),
8077 RD_KAFKA_V_TIMESTAMP (builder.timestamp ().count ()),
8178 RD_KAFKA_V_KEY ((void *)key.get_data (), key.get_size ()),
8279 RD_KAFKA_V_VALUE ((void *)payload.get_data (), payload.get_size ()),
83- RD_KAFKA_V_OPAQUE (opaque ),
80+ RD_KAFKA_V_OPAQUE (get< 0 >(load_result) ),
8481 RD_KAFKA_V_END);
8582 check_error (result);
86- internal_data .release (); // data has been passed-on to rdkafka so we release ownership
83+ get< 1 >(load_result) .release (); // data has been passed-on to rdkafka so we release ownership
8784}
8885
8986void Producer::produce (const Message& message) {
9087 const Buffer& payload = message.get_payload ();
9188 const Buffer& key = message.get_key ();
9289 const int policy = static_cast <int >(message_payload_policy_);
9390 int64_t duration = message.get_timestamp () ? message.get_timestamp ().get ().get_timestamp ().count () : 0 ;
94- void * opaque = message.get_user_data ();
95- unique_ptr<MessageInternal> internal_data;
96- if (get_configuration ().get_delivery_report_callback ()) {
97- internal_data.reset (new MessageInternal (message.get_user_data (), message.internal ()));
98- opaque = internal_data.get ();
99- }
91+ LoadResult load_result = load_internal (message.get_user_data (), message.internal ());
10092 auto result = rd_kafka_producev (get_handle (),
10193 RD_KAFKA_V_TOPIC (message.get_topic ().data ()),
10294 RD_KAFKA_V_PARTITION (message.get_partition ()),
10395 RD_KAFKA_V_MSGFLAGS (policy),
10496 RD_KAFKA_V_TIMESTAMP (duration),
10597 RD_KAFKA_V_KEY ((void *)key.get_data (), key.get_size ()),
10698 RD_KAFKA_V_VALUE ((void *)payload.get_data (), payload.get_size ()),
107- RD_KAFKA_V_OPAQUE (opaque ),
99+ RD_KAFKA_V_OPAQUE (get< 0 >(load_result) ),
108100 RD_KAFKA_V_END);
109101 check_error (result);
110- internal_data .release (); // data has been passed-on to rdkafka so we release ownership
102+ get< 1 >(load_result) .release (); // data has been passed-on to rdkafka so we release ownership
111103}
112104
113105int Producer::poll () {
@@ -127,4 +119,16 @@ void Producer::flush(milliseconds timeout) {
127119 check_error (result);
128120}
129121
122+ Producer::LoadResult Producer::load_internal (void * user_data, InternalPtr internal) {
123+ unique_ptr<MessageInternal> internal_data;
124+ if (!has_internal_data_ && internal) {
125+ has_internal_data_ = true ; // enable once for this producer
126+ }
127+ if (has_internal_data_ && get_configuration ().get_delivery_report_callback ()) {
128+ internal_data.reset (new MessageInternal (user_data, internal));
129+ user_data = internal_data.get (); // point to the internal data
130+ }
131+ return LoadResult (user_data, move (internal_data));
132+ }
133+
130134} // cppkafka
0 commit comments