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);