134 #ifndef _FBR_FIBER_H_ 
  135 #define _FBR_FIBER_H_ 
  145 #include <sys/types.h> 
  146 #include <sys/socket.h> 
  147 #include <sys/queue.h> 
  151 #include <evfibers/config.h> 
  156 #define FBR_CALL_STACK_SIZE 16 
  160 #define FBR_STACK_SIZE (64 * 1024)  
  167 #define fbr_assert(context, expr)           ((void)(0)) 
  169 #define fbr_assert(context, expr)                                                             \ 
  171                 __typeof__(expr) ex = (expr);                                                 \ 
  175                         fbr_dump_stack(context, fbr_log_e);                                   \ 
  176                         __assert_fail(__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION); \ 
  186 #define fbr_container_of(ptr, type, member) ({                       \ 
  187                 const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 
  188                 (type *)( (char *)__mptr - offsetof(type,member) );  \ 
  191 struct fbr_context_private;
 
  197 } __attribute__((packed));
 
  209         return a.p == b.p && a.g == b.g;
 
  212 static inline int fbr_id_isnull(
fbr_id_t a)
 
  214         return fbr_id_eq(a, FBR_ID_NULL);
 
  244         struct fbr_context_private *
__p; 
 
  253 #define FBR_P struct fbr_context *fctx 
  258 #define FBR_PU __attribute__((unused)) FBR_P 
  264 #define FBR_P_ FBR_P, 
  269 #define FBR_PU_ __attribute__((unused)) FBR_P_ 
  280 #define FBR_A_ FBR_A, 
  367         return level <= fctx->logger->level;
 
  375         fctx->logger->level = desired_level;
 
  428 #define FBR_DESTRUCTOR_INITIALIZER { \ 
  442         struct fbr_id_tailq *head;
 
  472 #define fbr_ev_upcast(ptr, type_no_struct) \ 
  473        fbr_container_of(ptr, struct type_no_struct, ev_base) 
  524         struct fbr_id_tailq pending;
 
  537         struct fbr_id_tailq waiting;
 
  571         size_t prepared_bytes;
 
  572         size_t waiting_bytes;
 
  593 #define FBR_MAX_KEY 64 
  628 static inline void fbr_destructor_init(
struct fbr_destructor *dtor)
 
  630         memset(dtor, 0x00, 
sizeof(*dtor));
 
  733 void fbr_destroy(
FBR_P);
 
  767         __attribute__ ((format (printf, 2, 3)));
 
  781         __attribute__ ((format (printf, 2, 3)));
 
  795         __attribute__ ((format (printf, 2, 3)));
 
  809         __attribute__ ((format (printf, 2, 3)));
 
  823         __attribute__ ((format (printf, 2, 3)));
 
  828 #define FBR_MAX_FIBER_NAME 64 
  986 void fbr_yield(
FBR_P);
 
 1011 void *fbr_alloc(
FBR_P_ size_t size);
 
 1042 void *fbr_calloc(
FBR_P_ unsigned int nmemb, 
size_t size);
 
 1053 void fbr_free(
FBR_P_ void *ptr);
 
 1064 void fbr_free_nd(
FBR_P_ void *ptr);
 
 1075 int fbr_fd_nonblock(
FBR_P_ int fd);
 
 1092 int fbr_connect(
FBR_P_ int sockfd, 
const struct sockaddr *addr,
 
 1113 ssize_t fbr_read(
FBR_P_ int fd, 
void *buf, 
size_t count);
 
 1135 ssize_t fbr_read_all(
FBR_P_ int fd, 
void *buf, 
size_t count);
 
 1154 ssize_t fbr_readline(
FBR_P_ int fd, 
void *buffer, 
size_t n);
 
 1172 ssize_t fbr_write(
FBR_P_ int fd, 
const void *buf, 
size_t count);
 
 1192 ssize_t fbr_write_all(
FBR_P_ int fd, 
const void *buf, 
size_t count);
 
 1211 ssize_t fbr_recvfrom(
FBR_P_ int sockfd, 
void *buf, 
size_t len, 
int flags,
 
 1212                 struct sockaddr *src_addr, socklen_t *addrlen);
 
 1226 ssize_t fbr_recv(
FBR_P_ int sockfd, 
void *buf, 
size_t len, 
int flags);
 
 1245 ssize_t fbr_sendto(
FBR_P_ int sockfd, 
const void *buf, 
size_t len, 
int flags, 
const 
 1246                 struct sockaddr *dest_addr, socklen_t addrlen);
 
 1259 ssize_t fbr_send(
FBR_P_ int sockfd, 
const void *buf, 
size_t len, 
int flags);
 
 1275 int fbr_accept(
FBR_P_ int sockfd, 
struct sockaddr *addr, socklen_t *addrlen);
 
 1285 ev_tstamp fbr_sleep(
FBR_P_ ev_tstamp seconds);
 
 1451 int fbr_vrb_init(
struct fbr_vrb *vrb, 
size_t size, 
const char *file_pattern);
 
 1462 void fbr_vrb_destroy(
struct fbr_vrb *vrb);
 
 1471 static inline size_t fbr_vrb_data_len(
struct fbr_vrb *vrb)
 
 1473         return vrb->space_ptr - vrb->data_ptr;
 
 1483 static inline size_t fbr_vrb_space_len(
struct fbr_vrb *vrb)
 
 1485         return vrb->data_ptr + vrb->ptr_size - vrb->space_ptr;
 
 1495 static inline size_t fbr_vrb_capacity(
struct fbr_vrb *vrb)
 
 1497         return vrb->ptr_size;
 
 1507 static inline void *fbr_vrb_space_ptr(
struct fbr_vrb *vrb)
 
 1509         return vrb->space_ptr;
 
 1519 static inline void *fbr_vrb_data_ptr(
struct fbr_vrb *vrb)
 
 1521         return vrb->data_ptr;
 
 1537 static inline int fbr_vrb_give(
struct fbr_vrb *vrb, 
size_t size)
 
 1539         if (size > fbr_vrb_space_len(vrb))
 
 1541         vrb->space_ptr += size;
 
 1558 static inline int fbr_vrb_take(
struct fbr_vrb *vrb, 
size_t size)
 
 1560         if (size > fbr_vrb_data_len(vrb))
 
 1562         vrb->data_ptr += size;
 
 1564         if (vrb->data_ptr >= vrb->upper_ptr) {
 
 1565                 vrb->data_ptr -= vrb->ptr_size;
 
 1566                 vrb->space_ptr -= vrb->ptr_size;
 
 1581 static inline void fbr_vrb_reset(
struct fbr_vrb *vrb)
 
 1583         vrb->data_ptr = vrb->lower_ptr;
 
 1584         vrb->space_ptr = vrb->lower_ptr;
 
 1588 int fbr_vrb_resize_do(
struct fbr_vrb *vrb, 
size_t new_size,
 
 1589                 const char *file_pattern);
 
 1605 static inline int fbr_vrb_resize(
struct fbr_vrb *vrb, 
size_t new_size,
 
 1606                 const char *file_pattern)
 
 1610         if (fbr_vrb_capacity(vrb) >= new_size)
 
 1612         memcpy(&tmp, vrb, 
sizeof(tmp));
 
 1613         rv = fbr_vrb_init(vrb, new_size, file_pattern);
 
 1615                 memcpy(vrb, &tmp, 
sizeof(tmp));
 
 1618         memcpy(fbr_vrb_space_ptr(vrb), fbr_vrb_data_ptr(&tmp),
 
 1619                         fbr_vrb_data_len(&tmp));
 
 1620         fbr_vrb_give(vrb, fbr_vrb_data_len(&tmp));
 
 1621         fbr_vrb_destroy(&tmp);
 
 1649         return fbr_vrb_data_len(&buffer->vrb);
 
 1662         return fbr_vrb_space_len(&buffer->vrb);
 
 1677         return fbr_vrb_capacity(&buffer->vrb);
 
 1701         return fbr_vrb_space_ptr(&buffer->vrb);
 
 1725         return fbr_vrb_data_ptr(&buffer->vrb);
 
 1744         fbr_vrb_reset(&buffer->vrb);
 
 1772 void *fbr_buffer_alloc_prepare(
FBR_P_ struct fbr_buffer *buffer, 
size_t size);
 
 1808 void *fbr_buffer_read_address(
FBR_P_ struct fbr_buffer *buffer, 
size_t size);
 
 1858         return &buffer->committed_cond;
 
 1869         return &buffer->bytes_freed_cond;
 
 1887         fbr_mutex_lock(
FBR_A_ &mutex);
 
 1888         while (fbr_buffer_bytes(
FBR_A_ buffer) < size) {
 
 1889                 retval = fbr_cond_wait(
FBR_A_ &buffer->committed_cond, &mutex);
 
 1890                 assert(0 == retval);
 
 1893         fbr_mutex_unlock(
FBR_A_ &mutex);
 
 1910         return fbr_buffer_bytes(
FBR_A_ buffer) >= size;
 
 1928         fbr_mutex_lock(
FBR_A_ &mutex);
 
 1929         while (fbr_buffer_free_bytes(
FBR_A_ buffer) < size) {
 
 1930                 retval = fbr_cond_wait(
FBR_A_ &buffer->bytes_freed_cond,
 
 1932                 assert(0 == retval);
 
 1935         fbr_mutex_unlock(
FBR_A_ &mutex);
 
 1952         return fbr_buffer_free_bytes(
FBR_A_ buffer) >= size;
 
 1976 pid_t fbr_popen3(
FBR_P_ const char *filename, 
char *
const argv[],
 
 1977                 char *
const envp[], 
const char *working_dir,
 
 1978                 int *stdin_w_ptr, 
int *stdout_r_ptr, 
int *stderr_r_ptr);
 
 1980 static inline pid_t fbr_popen2(
FBR_P_ const char *filename, 
char *
const argv[],
 
 1981                 char *
const envp[], 
const char *working_dir, 
int *stdin_w_ptr,
 
 1984         return fbr_popen3(
FBR_A_ filename, argv, envp, working_dir, stdin_w_ptr,
 
 1985                         stdout_r_ptr, NULL);
 
 1988 static inline pid_t fbr_popen0(
FBR_P_ const char *filename, 
char *
const argv[],
 
 1989                 char *
const envp[], 
const char *working_dir)
 
 1991         return fbr_popen3(
FBR_A_ filename, argv, envp, working_dir, NULL, NULL,
 
 1995 int fbr_waitpid(
FBR_P_ pid_t pid);
 
 1997 int fbr_system(
FBR_P_ const char *filename, 
char *
const argv[],
 
 1998                 char *
const envp[], 
const char *working_dir);