- Timestamp:
- 06/28/18 11:26:07 (3 years ago)
- Branches:
- cachetimestamps, develop, master, rc-4.0.4, ringdecrementfix, ringperformance
- Children:
- 055a2c9, b06b894
- Parents:
- 47d4f8c
- Location:
- lib/data-struct
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
lib/data-struct/simple_circular_buffer.c
re8e9052 r1ed69dc 10 10 #include <fcntl.h> 11 11 #include <sys/socket.h> 12 #include <errno.h> 12 13 13 14 #include "simple_circular_buffer.h" 14 15 15 DLLEXPORT voidlibtrace_scb_init(libtrace_scb_t *buf, uint32_t size,16 DLLEXPORT int libtrace_scb_init(libtrace_scb_t *buf, uint32_t size, 16 17 uint16_t id) { 17 18 … … 28 29 buf->fd = shm_open(anonname, O_RDWR | O_CREAT, 0600); 29 30 #endif 30 ftruncate(buf->fd, size); 31 32 buf->address = mmap(NULL, 2 * size, PROT_NONE, 33 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 34 mmap(buf->address, size, PROT_READ | PROT_WRITE, 35 MAP_SHARED | MAP_FIXED, buf->fd, 0); 36 mmap(buf->address + size, size, PROT_READ | PROT_WRITE, 37 MAP_SHARED | MAP_FIXED, buf->fd, 0); 31 if (ftruncate(buf->fd, size) < 0) { 32 perror("ftruncate in libtrace_scb_init"); 33 close(buf->fd); 34 buf->fd = -1; 35 buf->address = NULL; 36 } else { 37 buf->address = mmap(NULL, 2 * size, PROT_NONE, 38 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 39 mmap(buf->address, size, PROT_READ | PROT_WRITE, 40 MAP_SHARED | MAP_FIXED, buf->fd, 0); 41 mmap(buf->address + size, size, PROT_READ | PROT_WRITE, 42 MAP_SHARED | MAP_FIXED, buf->fd, 0); 43 } 38 44 buf->read_offset = 0; 39 45 buf->write_offset = 0; 40 46 buf->count_bytes = size; 47 48 if (buf->address) { 49 return 0; 50 } 51 return -1; 41 52 } 42 53 … … 44 55 /* TODO shm_unlink the file name if we used shm_open? */ 45 56 46 munmap(buf->address, buf->count_bytes * 2); 47 close(buf->fd); 57 if (buf->address) { 58 munmap(buf->address, buf->count_bytes * 2); 59 } 60 if (buf->fd != -1) { 61 close(buf->fd); 62 } 48 63 } 49 64 … … 52 67 int space = buf->count_bytes - (buf->write_offset - buf->read_offset); 53 68 int ret; 69 70 if (buf->address == NULL) { 71 return -1; 72 } 54 73 55 74 if (space == 0) { … … 68 87 uint32_t *available) { 69 88 89 if (buf->address == NULL) { 90 return NULL; 91 } 70 92 *available = buf->write_offset - buf->read_offset; 71 93 return buf->address + buf->read_offset; -
lib/data-struct/simple_circular_buffer.h
rb94478f r1ed69dc 13 13 14 14 15 DLLEXPORT voidlibtrace_scb_init(libtrace_scb_t *buf, uint32_t size,15 DLLEXPORT int libtrace_scb_init(libtrace_scb_t *buf, uint32_t size, 16 16 uint16_t id); 17 17 DLLEXPORT void libtrace_scb_destroy(libtrace_scb_t *buf);
Note: See TracChangeset
for help on using the changeset viewer.