diff options
Diffstat (limited to 'src/core/statistics/census_log.c')
-rw-r--r-- | src/core/statistics/census_log.c | 591 |
1 files changed, 248 insertions, 343 deletions
diff --git a/src/core/statistics/census_log.c b/src/core/statistics/census_log.c index 16a9e28b1f..88e338038d 100644 --- a/src/core/statistics/census_log.c +++ b/src/core/statistics/census_log.c @@ -101,15 +101,13 @@ /* End of platform specific code */ -typedef struct census_log_block_list_struct -{ +typedef struct census_log_block_list_struct { struct census_log_block_list_struct *next; struct census_log_block_list_struct *prev; struct census_log_block *block; } cl_block_list_struct; -typedef struct census_log_block -{ +typedef struct census_log_block { /* Pointer to underlying buffer */ char *buffer; gpr_atm writer_lock; @@ -148,16 +146,14 @@ typedef struct census_log_block } cl_block; /* A list of cl_blocks, doubly-linked through cl_block::link. */ -typedef struct census_log_block_list -{ - gpr_int32 count; /* Number of items in list. */ - cl_block_list_struct ht; /* head/tail of linked list. */ +typedef struct census_log_block_list { + gpr_int32 count; /* Number of items in list. */ + cl_block_list_struct ht; /* head/tail of linked list. */ } cl_block_list; /* Cacheline aligned block pointers to avoid false sharing. Block pointer must be initialized via set_block(), before calling other functions */ -typedef struct census_log_core_local_block -{ +typedef struct census_log_core_local_block { gpr_atm block; /* Ensure cachline alignment: we assume sizeof(gpr_atm) == 4 or 8 */ #if defined(GPR_ARCH_64) @@ -174,17 +170,16 @@ typedef struct census_log_core_local_block #endif } cl_core_local_block; -struct census_log -{ +struct census_log { int discard_old_records; /* Number of cores (aka hardware-contexts) */ unsigned num_cores; /* number of CENSUS_LOG_2_MAX_RECORD_SIZE blocks in log */ gpr_int32 num_blocks; - cl_block *blocks; /* Block metadata. */ - cl_core_local_block *core_local_blocks; /* Keeps core to block mappings. */ + cl_block *blocks; /* Block metadata. */ + cl_core_local_block *core_local_blocks; /* Keeps core to block mappings. */ gpr_mu lock; - int initialized; /* has log been initialized? */ + int initialized; /* has log been initialized? */ /* Keeps the state of the reader iterator. A value of 0 indicates that iterator has reached the end. census_log_init_reader() resets the value to num_core to restart iteration. */ @@ -206,61 +201,44 @@ static struct census_log g_log; /* Functions that operate on an atomic memory location used as a lock */ /* Returns non-zero if lock is acquired */ -static int -cl_try_lock (gpr_atm * lock) -{ - return gpr_atm_acq_cas (lock, 0, 1); -} +static int cl_try_lock(gpr_atm *lock) { return gpr_atm_acq_cas(lock, 0, 1); } -static void -cl_unlock (gpr_atm * lock) -{ - gpr_atm_rel_store (lock, 0); -} +static void cl_unlock(gpr_atm *lock) { gpr_atm_rel_store(lock, 0); } /* Functions that operate on cl_core_local_block's */ -static void -cl_core_local_block_set_block (cl_core_local_block * clb, cl_block * block) -{ - gpr_atm_rel_store (&clb->block, (gpr_atm) block); +static void cl_core_local_block_set_block(cl_core_local_block *clb, + cl_block *block) { + gpr_atm_rel_store(&clb->block, (gpr_atm)block); } -static cl_block * -cl_core_local_block_get_block (cl_core_local_block * clb) -{ - return (cl_block *) gpr_atm_acq_load (&clb->block); +static cl_block *cl_core_local_block_get_block(cl_core_local_block *clb) { + return (cl_block *)gpr_atm_acq_load(&clb->block); } /* Functions that operate on cl_block_list_struct's */ -static void -cl_block_list_struct_initialize (cl_block_list_struct * bls, cl_block * block) -{ +static void cl_block_list_struct_initialize(cl_block_list_struct *bls, + cl_block *block) { bls->next = bls->prev = bls; bls->block = block; } /* Functions that operate on cl_block_list's */ -static void -cl_block_list_initialize (cl_block_list * list) -{ +static void cl_block_list_initialize(cl_block_list *list) { list->count = 0; - cl_block_list_struct_initialize (&list->ht, NULL); + cl_block_list_struct_initialize(&list->ht, NULL); } /* Returns head of *this, or NULL if empty. */ -static cl_block * -cl_block_list_head (cl_block_list * list) -{ +static cl_block *cl_block_list_head(cl_block_list *list) { return list->ht.next->block; } /* Insert element *e after *pos. */ -static void -cl_block_list_insert (cl_block_list * list, cl_block_list_struct * pos, cl_block_list_struct * e) -{ +static void cl_block_list_insert(cl_block_list *list, cl_block_list_struct *pos, + cl_block_list_struct *e) { list->count++; e->next = pos->next; e->prev = pos; @@ -269,23 +247,17 @@ cl_block_list_insert (cl_block_list * list, cl_block_list_struct * pos, cl_block } /* Insert block at the head of the list */ -static void -cl_block_list_insert_at_head (cl_block_list * list, cl_block * block) -{ - cl_block_list_insert (list, &list->ht, &block->link); +static void cl_block_list_insert_at_head(cl_block_list *list, cl_block *block) { + cl_block_list_insert(list, &list->ht, &block->link); } /* Insert block at the tail of the list */ -static void -cl_block_list_insert_at_tail (cl_block_list * list, cl_block * block) -{ - cl_block_list_insert (list, list->ht.prev, &block->link); +static void cl_block_list_insert_at_tail(cl_block_list *list, cl_block *block) { + cl_block_list_insert(list, list->ht.prev, &block->link); } /* Removes block *b. Requires *b be in the list. */ -static void -cl_block_list_remove (cl_block_list * list, cl_block * b) -{ +static void cl_block_list_remove(cl_block_list *list, cl_block *b) { list->count--; b->link.next->prev = b->link.prev; b->link.prev->next = b->link.next; @@ -293,28 +265,23 @@ cl_block_list_remove (cl_block_list * list, cl_block * b) /* Functions that operate on cl_block's */ -static void -cl_block_initialize (cl_block * block, char *buffer) -{ +static void cl_block_initialize(cl_block *block, char *buffer) { block->buffer = buffer; - gpr_atm_rel_store (&block->writer_lock, 0); - gpr_atm_rel_store (&block->reader_lock, 0); - gpr_atm_rel_store (&block->bytes_committed, 0); + gpr_atm_rel_store(&block->writer_lock, 0); + gpr_atm_rel_store(&block->reader_lock, 0); + gpr_atm_rel_store(&block->bytes_committed, 0); block->bytes_read = 0; - cl_block_list_struct_initialize (&block->link, block); + cl_block_list_struct_initialize(&block->link, block); } /* Guards against exposing partially written buffer to the reader. */ -static void -cl_block_set_bytes_committed (cl_block * block, gpr_int32 bytes_committed) -{ - gpr_atm_rel_store (&block->bytes_committed, bytes_committed); +static void cl_block_set_bytes_committed(cl_block *block, + gpr_int32 bytes_committed) { + gpr_atm_rel_store(&block->bytes_committed, bytes_committed); } -static gpr_int32 -cl_block_get_bytes_committed (cl_block * block) -{ - return gpr_atm_acq_load (&block->bytes_committed); +static gpr_int32 cl_block_get_bytes_committed(cl_block *block) { + return gpr_atm_acq_load(&block->bytes_committed); } /* Tries to disable future read/write access to this block. Succeeds if: @@ -324,62 +291,51 @@ cl_block_get_bytes_committed (cl_block * block) On success, clears the block state and returns with writer_lock_ and reader_lock_ held. These locks are released by a subsequent cl_block_access_enable() call. */ -static int -cl_block_try_disable_access (cl_block * block, int discard_data) -{ - if (!cl_try_lock (&block->writer_lock)) - { - return 0; - } - if (!cl_try_lock (&block->reader_lock)) - { - cl_unlock (&block->writer_lock); - return 0; - } - if (!discard_data && (block->bytes_read != cl_block_get_bytes_committed (block))) - { - cl_unlock (&block->reader_lock); - cl_unlock (&block->writer_lock); - return 0; - } - cl_block_set_bytes_committed (block, 0); +static int cl_block_try_disable_access(cl_block *block, int discard_data) { + if (!cl_try_lock(&block->writer_lock)) { + return 0; + } + if (!cl_try_lock(&block->reader_lock)) { + cl_unlock(&block->writer_lock); + return 0; + } + if (!discard_data && + (block->bytes_read != cl_block_get_bytes_committed(block))) { + cl_unlock(&block->reader_lock); + cl_unlock(&block->writer_lock); + return 0; + } + cl_block_set_bytes_committed(block, 0); block->bytes_read = 0; return 1; } -static void -cl_block_enable_access (cl_block * block) -{ - cl_unlock (&block->reader_lock); - cl_unlock (&block->writer_lock); +static void cl_block_enable_access(cl_block *block) { + cl_unlock(&block->reader_lock); + cl_unlock(&block->writer_lock); } /* Returns with writer_lock held. */ -static void * -cl_block_start_write (cl_block * block, size_t size) -{ +static void *cl_block_start_write(cl_block *block, size_t size) { gpr_int32 bytes_committed; - if (!cl_try_lock (&block->writer_lock)) - { - return NULL; - } - bytes_committed = cl_block_get_bytes_committed (block); - if (bytes_committed + size > CENSUS_LOG_MAX_RECORD_SIZE) - { - cl_unlock (&block->writer_lock); - return NULL; - } + if (!cl_try_lock(&block->writer_lock)) { + return NULL; + } + bytes_committed = cl_block_get_bytes_committed(block); + if (bytes_committed + size > CENSUS_LOG_MAX_RECORD_SIZE) { + cl_unlock(&block->writer_lock); + return NULL; + } return block->buffer + bytes_committed; } /* Releases writer_lock and increments committed bytes by 'bytes_written'. 'bytes_written' must be <= 'size' specified in the corresponding StartWrite() call. This function is thread-safe. */ -static void -cl_block_end_write (cl_block * block, size_t bytes_written) -{ - cl_block_set_bytes_committed (block, cl_block_get_bytes_committed (block) + bytes_written); - cl_unlock (&block->writer_lock); +static void cl_block_end_write(cl_block *block, size_t bytes_written) { + cl_block_set_bytes_committed( + block, cl_block_get_bytes_committed(block) + bytes_written); + cl_unlock(&block->writer_lock); } /* Returns a pointer to the first unread byte in buffer. The number of bytes @@ -387,60 +343,49 @@ cl_block_end_write (cl_block * block, size_t bytes_written) released by a subsequent cl_block_end_read() call. Returns NULL if: - read in progress - no data available */ -static void * -cl_block_start_read (cl_block * block, size_t * bytes_available) -{ +static void *cl_block_start_read(cl_block *block, size_t *bytes_available) { void *record; - if (!cl_try_lock (&block->reader_lock)) - { - return NULL; - } + if (!cl_try_lock(&block->reader_lock)) { + return NULL; + } /* bytes_committed may change from under us. Use bytes_available to update bytes_read below. */ - *bytes_available = cl_block_get_bytes_committed (block) - block->bytes_read; - if (*bytes_available == 0) - { - cl_unlock (&block->reader_lock); - return NULL; - } + *bytes_available = cl_block_get_bytes_committed(block) - block->bytes_read; + if (*bytes_available == 0) { + cl_unlock(&block->reader_lock); + return NULL; + } record = block->buffer + block->bytes_read; block->bytes_read += *bytes_available; return record; } -static void -cl_block_end_read (cl_block * block) -{ - cl_unlock (&block->reader_lock); +static void cl_block_end_read(cl_block *block) { + cl_unlock(&block->reader_lock); } /* Internal functions operating on g_log */ /* Allocates a new free block (or recycles an available dirty block if log is configured to discard old records). Returns NULL if out-of-space. */ -static cl_block * -cl_allocate_block (void) -{ - cl_block *block = cl_block_list_head (&g_log.free_block_list); - if (block != NULL) - { - cl_block_list_remove (&g_log.free_block_list, block); - return block; - } - if (!g_log.discard_old_records) - { - /* No free block and log is configured to keep old records. */ - return NULL; - } +static cl_block *cl_allocate_block(void) { + cl_block *block = cl_block_list_head(&g_log.free_block_list); + if (block != NULL) { + cl_block_list_remove(&g_log.free_block_list, block); + return block; + } + if (!g_log.discard_old_records) { + /* No free block and log is configured to keep old records. */ + return NULL; + } /* Recycle dirty block. Start from the oldest. */ - for (block = cl_block_list_head (&g_log.dirty_block_list); block != NULL; block = block->link.next->block) - { - if (cl_block_try_disable_access (block, 1 /* discard data */ )) - { - cl_block_list_remove (&g_log.dirty_block_list, block); - return block; - } + for (block = cl_block_list_head(&g_log.dirty_block_list); block != NULL; + block = block->link.next->block) { + if (cl_block_try_disable_access(block, 1 /* discard data */)) { + cl_block_list_remove(&g_log.dirty_block_list, block); + return block; } + } return NULL; } @@ -450,250 +395,210 @@ cl_allocate_block (void) - allocated a new block OR - 'core_id' => 'old_block' mapping changed (another thread allocated a block before lock was acquired). */ -static int -cl_allocate_core_local_block (gpr_int32 core_id, cl_block * old_block) -{ +static int cl_allocate_core_local_block(gpr_int32 core_id, + cl_block *old_block) { /* Now that we have the lock, check if core-local mapping has changed. */ cl_core_local_block *core_local_block = &g_log.core_local_blocks[core_id]; - cl_block *block = cl_core_local_block_get_block (core_local_block); - if ((block != NULL) && (block != old_block)) - { - return 1; - } - if (block != NULL) - { - cl_core_local_block_set_block (core_local_block, NULL); - cl_block_list_insert_at_tail (&g_log.dirty_block_list, block); - } - block = cl_allocate_block (); - if (block == NULL) - { - gpr_atm_rel_store (&g_log.is_full, 1); - return 0; - } - cl_core_local_block_set_block (core_local_block, block); - cl_block_enable_access (block); + cl_block *block = cl_core_local_block_get_block(core_local_block); + if ((block != NULL) && (block != old_block)) { + return 1; + } + if (block != NULL) { + cl_core_local_block_set_block(core_local_block, NULL); + cl_block_list_insert_at_tail(&g_log.dirty_block_list, block); + } + block = cl_allocate_block(); + if (block == NULL) { + gpr_atm_rel_store(&g_log.is_full, 1); + return 0; + } + cl_core_local_block_set_block(core_local_block, block); + cl_block_enable_access(block); return 1; } -static cl_block * -cl_get_block (void *record) -{ - gpr_uintptr p = (gpr_uintptr) ((char *) record - g_log.buffer); +static cl_block *cl_get_block(void *record) { + gpr_uintptr p = (gpr_uintptr)((char *)record - g_log.buffer); gpr_uintptr index = p >> CENSUS_LOG_2_MAX_RECORD_SIZE; return &g_log.blocks[index]; } /* Gets the next block to read and tries to free 'prev' block (if not NULL). Returns NULL if reached the end. */ -static cl_block * -cl_next_block_to_read (cl_block * prev) -{ +static cl_block *cl_next_block_to_read(cl_block *prev) { cl_block *block = NULL; - if (g_log.read_iterator_state == g_log.num_cores) - { - /* We are traversing dirty list; find the next dirty block. */ - if (prev != NULL) - { - /* Try to free the previous block if there is no unread data. This block - may have unread data if previously incomplete record completed between - read_next() calls. */ - block = prev->link.next->block; - if (cl_block_try_disable_access (prev, 0 /* do not discard data */ )) - { - cl_block_list_remove (&g_log.dirty_block_list, prev); - cl_block_list_insert_at_head (&g_log.free_block_list, prev); - gpr_atm_rel_store (&g_log.is_full, 0); - } - } - else - { - block = cl_block_list_head (&g_log.dirty_block_list); - } - if (block != NULL) - { - return block; - } - /* We are done with the dirty list; moving on to core-local blocks. */ + if (g_log.read_iterator_state == g_log.num_cores) { + /* We are traversing dirty list; find the next dirty block. */ + if (prev != NULL) { + /* Try to free the previous block if there is no unread data. This block + may have unread data if previously incomplete record completed between + read_next() calls. */ + block = prev->link.next->block; + if (cl_block_try_disable_access(prev, 0 /* do not discard data */)) { + cl_block_list_remove(&g_log.dirty_block_list, prev); + cl_block_list_insert_at_head(&g_log.free_block_list, prev); + gpr_atm_rel_store(&g_log.is_full, 0); + } + } else { + block = cl_block_list_head(&g_log.dirty_block_list); } - while (g_log.read_iterator_state > 0) - { - g_log.read_iterator_state--; - block = cl_core_local_block_get_block (&g_log.core_local_blocks[g_log.read_iterator_state]); - if (block != NULL) - { - return block; - } + if (block != NULL) { + return block; + } + /* We are done with the dirty list; moving on to core-local blocks. */ + } + while (g_log.read_iterator_state > 0) { + g_log.read_iterator_state--; + block = cl_core_local_block_get_block( + &g_log.core_local_blocks[g_log.read_iterator_state]); + if (block != NULL) { + return block; } + } return NULL; } /* External functions: primary stats_log interface */ -void -census_log_initialize (size_t size_in_mb, int discard_old_records) -{ +void census_log_initialize(size_t size_in_mb, int discard_old_records) { gpr_int32 ix; /* Check cacheline alignment. */ - GPR_ASSERT (sizeof (cl_block) % GPR_CACHELINE_SIZE == 0); - GPR_ASSERT (sizeof (cl_core_local_block) % GPR_CACHELINE_SIZE == 0); - GPR_ASSERT (!g_log.initialized); + GPR_ASSERT(sizeof(cl_block) % GPR_CACHELINE_SIZE == 0); + GPR_ASSERT(sizeof(cl_core_local_block) % GPR_CACHELINE_SIZE == 0); + GPR_ASSERT(!g_log.initialized); g_log.discard_old_records = discard_old_records; - g_log.num_cores = gpr_cpu_num_cores (); + g_log.num_cores = gpr_cpu_num_cores(); /* Ensure at least as many blocks as there are cores. */ - g_log.num_blocks = GPR_MAX (g_log.num_cores, (size_in_mb << 20) >> CENSUS_LOG_2_MAX_RECORD_SIZE); - gpr_mu_init (&g_log.lock); + g_log.num_blocks = GPR_MAX( + g_log.num_cores, (size_in_mb << 20) >> CENSUS_LOG_2_MAX_RECORD_SIZE); + gpr_mu_init(&g_log.lock); g_log.read_iterator_state = 0; g_log.block_being_read = NULL; - gpr_atm_rel_store (&g_log.is_full, 0); - g_log.core_local_blocks = (cl_core_local_block *) gpr_malloc_aligned (g_log.num_cores * sizeof (cl_core_local_block), GPR_CACHELINE_SIZE_LOG); - memset (g_log.core_local_blocks, 0, g_log.num_cores * sizeof (cl_core_local_block)); - g_log.blocks = (cl_block *) gpr_malloc_aligned (g_log.num_blocks * sizeof (cl_block), GPR_CACHELINE_SIZE_LOG); - memset (g_log.blocks, 0, g_log.num_blocks * sizeof (cl_block)); - g_log.buffer = gpr_malloc (g_log.num_blocks * CENSUS_LOG_MAX_RECORD_SIZE); - memset (g_log.buffer, 0, g_log.num_blocks * CENSUS_LOG_MAX_RECORD_SIZE); - cl_block_list_initialize (&g_log.free_block_list); - cl_block_list_initialize (&g_log.dirty_block_list); - for (ix = 0; ix < g_log.num_blocks; ++ix) - { - cl_block *block = g_log.blocks + ix; - cl_block_initialize (block, g_log.buffer + (CENSUS_LOG_MAX_RECORD_SIZE * ix)); - cl_block_try_disable_access (block, 1 /* discard data */ ); - cl_block_list_insert_at_tail (&g_log.free_block_list, block); - } - gpr_atm_rel_store (&g_log.out_of_space_count, 0); + gpr_atm_rel_store(&g_log.is_full, 0); + g_log.core_local_blocks = (cl_core_local_block *)gpr_malloc_aligned( + g_log.num_cores * sizeof(cl_core_local_block), GPR_CACHELINE_SIZE_LOG); + memset(g_log.core_local_blocks, 0, + g_log.num_cores * sizeof(cl_core_local_block)); + g_log.blocks = (cl_block *)gpr_malloc_aligned( + g_log.num_blocks * sizeof(cl_block), GPR_CACHELINE_SIZE_LOG); + memset(g_log.blocks, 0, g_log.num_blocks * sizeof(cl_block)); + g_log.buffer = gpr_malloc(g_log.num_blocks * CENSUS_LOG_MAX_RECORD_SIZE); + memset(g_log.buffer, 0, g_log.num_blocks * CENSUS_LOG_MAX_RECORD_SIZE); + cl_block_list_initialize(&g_log.free_block_list); + cl_block_list_initialize(&g_log.dirty_block_list); + for (ix = 0; ix < g_log.num_blocks; ++ix) { + cl_block *block = g_log.blocks + ix; + cl_block_initialize(block, + g_log.buffer + (CENSUS_LOG_MAX_RECORD_SIZE * ix)); + cl_block_try_disable_access(block, 1 /* discard data */); + cl_block_list_insert_at_tail(&g_log.free_block_list, block); + } + gpr_atm_rel_store(&g_log.out_of_space_count, 0); g_log.initialized = 1; } -void -census_log_shutdown (void) -{ - GPR_ASSERT (g_log.initialized); - gpr_mu_destroy (&g_log.lock); - gpr_free_aligned (g_log.core_local_blocks); +void census_log_shutdown(void) { + GPR_ASSERT(g_log.initialized); + gpr_mu_destroy(&g_log.lock); + gpr_free_aligned(g_log.core_local_blocks); g_log.core_local_blocks = NULL; - gpr_free_aligned (g_log.blocks); + gpr_free_aligned(g_log.blocks); g_log.blocks = NULL; - gpr_free (g_log.buffer); + gpr_free(g_log.buffer); g_log.buffer = NULL; g_log.initialized = 0; } -void * -census_log_start_write (size_t size) -{ +void *census_log_start_write(size_t size) { /* Used to bound number of times block allocation is attempted. */ gpr_int32 attempts_remaining = g_log.num_blocks; /* TODO(aveitch): move this inside the do loop when current_cpu is fixed */ - gpr_int32 core_id = gpr_cpu_current_cpu (); - GPR_ASSERT (g_log.initialized); - if (size > CENSUS_LOG_MAX_RECORD_SIZE) - { + gpr_int32 core_id = gpr_cpu_current_cpu(); + GPR_ASSERT(g_log.initialized); + if (size > CENSUS_LOG_MAX_RECORD_SIZE) { + return NULL; + } + do { + int allocated; + void *record = NULL; + cl_block *block = + cl_core_local_block_get_block(&g_log.core_local_blocks[core_id]); + if (block && (record = cl_block_start_write(block, size))) { + return record; + } + /* Need to allocate a new block. We are here if: + - No block associated with the core OR + - Write in-progress on the block OR + - block is out of space */ + if (gpr_atm_acq_load(&g_log.is_full)) { + gpr_atm_no_barrier_fetch_add(&g_log.out_of_space_count, 1); return NULL; } - do - { - int allocated; - void *record = NULL; - cl_block *block = cl_core_local_block_get_block (&g_log.core_local_blocks[core_id]); - if (block && (record = cl_block_start_write (block, size))) - { - return record; - } - /* Need to allocate a new block. We are here if: - - No block associated with the core OR - - Write in-progress on the block OR - - block is out of space */ - if (gpr_atm_acq_load (&g_log.is_full)) - { - gpr_atm_no_barrier_fetch_add (&g_log.out_of_space_count, 1); - return NULL; - } - gpr_mu_lock (&g_log.lock); - allocated = cl_allocate_core_local_block (core_id, block); - gpr_mu_unlock (&g_log.lock); - if (!allocated) - { - gpr_atm_no_barrier_fetch_add (&g_log.out_of_space_count, 1); - return NULL; - } + gpr_mu_lock(&g_log.lock); + allocated = cl_allocate_core_local_block(core_id, block); + gpr_mu_unlock(&g_log.lock); + if (!allocated) { + gpr_atm_no_barrier_fetch_add(&g_log.out_of_space_count, 1); + return NULL; } - while (attempts_remaining--); + } while (attempts_remaining--); /* Give up. */ - gpr_atm_no_barrier_fetch_add (&g_log.out_of_space_count, 1); + gpr_atm_no_barrier_fetch_add(&g_log.out_of_space_count, 1); return NULL; } -void -census_log_end_write (void *record, size_t bytes_written) -{ - GPR_ASSERT (g_log.initialized); - cl_block_end_write (cl_get_block (record), bytes_written); +void census_log_end_write(void *record, size_t bytes_written) { + GPR_ASSERT(g_log.initialized); + cl_block_end_write(cl_get_block(record), bytes_written); } -void -census_log_init_reader (void) -{ - GPR_ASSERT (g_log.initialized); - gpr_mu_lock (&g_log.lock); +void census_log_init_reader(void) { + GPR_ASSERT(g_log.initialized); + gpr_mu_lock(&g_log.lock); /* If a block is locked for reading unlock it. */ - if (g_log.block_being_read != NULL) - { - cl_block_end_read (g_log.block_being_read); - g_log.block_being_read = NULL; - } + if (g_log.block_being_read != NULL) { + cl_block_end_read(g_log.block_being_read); + g_log.block_being_read = NULL; + } g_log.read_iterator_state = g_log.num_cores; - gpr_mu_unlock (&g_log.lock); -} - -const void * -census_log_read_next (size_t * bytes_available) -{ - GPR_ASSERT (g_log.initialized); - gpr_mu_lock (&g_log.lock); - if (g_log.block_being_read != NULL) - { - cl_block_end_read (g_log.block_being_read); - } - do - { - g_log.block_being_read = cl_next_block_to_read (g_log.block_being_read); - if (g_log.block_being_read != NULL) - { - void *record = cl_block_start_read (g_log.block_being_read, bytes_available); - if (record != NULL) - { - gpr_mu_unlock (&g_log.lock); - return record; - } - } + gpr_mu_unlock(&g_log.lock); +} + +const void *census_log_read_next(size_t *bytes_available) { + GPR_ASSERT(g_log.initialized); + gpr_mu_lock(&g_log.lock); + if (g_log.block_being_read != NULL) { + cl_block_end_read(g_log.block_being_read); + } + do { + g_log.block_being_read = cl_next_block_to_read(g_log.block_being_read); + if (g_log.block_being_read != NULL) { + void *record = + cl_block_start_read(g_log.block_being_read, bytes_available); + if (record != NULL) { + gpr_mu_unlock(&g_log.lock); + return record; + } } - while (g_log.block_being_read != NULL); - gpr_mu_unlock (&g_log.lock); + } while (g_log.block_being_read != NULL); + gpr_mu_unlock(&g_log.lock); return NULL; } -size_t -census_log_remaining_space (void) -{ +size_t census_log_remaining_space(void) { size_t space; - GPR_ASSERT (g_log.initialized); - gpr_mu_lock (&g_log.lock); - if (g_log.discard_old_records) - { - /* Remaining space is not meaningful; just return the entire log space. */ - space = g_log.num_blocks << CENSUS_LOG_2_MAX_RECORD_SIZE; - } - else - { - space = g_log.free_block_list.count * CENSUS_LOG_MAX_RECORD_SIZE; - } - gpr_mu_unlock (&g_log.lock); + GPR_ASSERT(g_log.initialized); + gpr_mu_lock(&g_log.lock); + if (g_log.discard_old_records) { + /* Remaining space is not meaningful; just return the entire log space. */ + space = g_log.num_blocks << CENSUS_LOG_2_MAX_RECORD_SIZE; + } else { + space = g_log.free_block_list.count * CENSUS_LOG_MAX_RECORD_SIZE; + } + gpr_mu_unlock(&g_log.lock); return space; } -int -census_log_out_of_space_count (void) -{ - GPR_ASSERT (g_log.initialized); - return gpr_atm_acq_load (&g_log.out_of_space_count); +int census_log_out_of_space_count(void) { + GPR_ASSERT(g_log.initialized); + return gpr_atm_acq_load(&g_log.out_of_space_count); } |