@@ -44,6 +44,7 @@ int aeron_ipc_publication_create(
44
44
aeron_ipc_publication_t * _pub = NULL ;
45
45
const uint64_t usable_fs_space = context -> usable_fs_space_func (context -> aeron_dir );
46
46
const uint64_t log_length = AERON_LOGBUFFER_COMPUTE_LOG_LENGTH (term_buffer_length );
47
+ const int64_t now_ns = context -> nano_clock ();
47
48
48
49
* publication = NULL ;
49
50
@@ -90,10 +91,11 @@ int aeron_ipc_publication_create(
90
91
aeron_logbuffer_fill_default_header (
91
92
_pub -> mapped_raw_log .log_meta_data .addr , session_id , stream_id , initial_term_id );
92
93
94
+ _pub -> nano_clock = context -> nano_clock ;
93
95
_pub -> conductor_fields .subscribeable .array = NULL ;
94
96
_pub -> conductor_fields .subscribeable .length = 0 ;
95
97
_pub -> conductor_fields .subscribeable .capacity = 0 ;
96
- _pub -> conductor_fields .subscribeable .add_position_hook_func = aeron_driver_subscribeable_null_hook ;
98
+ _pub -> conductor_fields .subscribeable .add_position_hook_func = aeron_ipc_publication_add_subscriber_hook ;
97
99
_pub -> conductor_fields .subscribeable .remove_position_hook_func = aeron_ipc_publication_remove_subscriber_hook ;
98
100
_pub -> conductor_fields .subscribeable .clientd = _pub ;
99
101
_pub -> conductor_fields .managed_resource .registration_id = registration_id ;
@@ -105,7 +107,7 @@ int aeron_ipc_publication_create(
105
107
_pub -> conductor_fields .trip_limit = 0 ;
106
108
_pub -> conductor_fields .consumer_position = 0 ;
107
109
_pub -> conductor_fields .last_consumer_position = 0 ;
108
- _pub -> conductor_fields .time_of_last_consumer_position_change = 0 ;
110
+ _pub -> conductor_fields .time_of_last_consumer_position_change = now_ns ;
109
111
_pub -> conductor_fields .status = AERON_IPC_PUBLICATION_STATUS_ACTIVE ;
110
112
_pub -> conductor_fields .refcnt = 1 ;
111
113
_pub -> session_id = session_id ;
@@ -238,8 +240,8 @@ void aeron_ipc_publication_check_for_blocked_publisher(aeron_ipc_publication_t *
238
240
{
239
241
if (publication -> conductor_fields .consumer_position == publication -> conductor_fields .last_consumer_position )
240
242
{
241
- if (aeron_ipc_publication_producer_position ( publication ) > publication -> conductor_fields .consumer_position &&
242
- now_ns > ( publication -> conductor_fields .time_of_last_consumer_position_change + publication -> unblock_timeout_ns ) )
243
+ if (now_ns > ( publication -> conductor_fields .time_of_last_consumer_position_change + publication -> unblock_timeout_ns ) &&
244
+ aeron_ipc_publication_producer_position ( publication ) > publication -> conductor_fields .consumer_position )
243
245
{
244
246
if (aeron_logbuffer_unblocker_unblock (
245
247
publication -> mapped_raw_log .term_buffers ,
@@ -257,6 +259,7 @@ void aeron_ipc_publication_check_for_blocked_publisher(aeron_ipc_publication_t *
257
259
}
258
260
}
259
261
262
+ extern void aeron_ipc_publication_add_subscriber_hook (void * clientd , int64_t * value_addr );
260
263
extern void aeron_ipc_publication_remove_subscriber_hook (void * clientd , int64_t * value_addr );
261
264
extern int64_t aeron_ipc_publication_producer_position (aeron_ipc_publication_t * publication );
262
265
extern int64_t aeron_ipc_publication_joining_position (aeron_ipc_publication_t * publication );
0 commit comments