libevfibers
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
fiber.h
Go to the documentation of this file.
1 /********************************************************************
2 
3  Copyright 2012 Konstantin Olkhovskiy <lupus@oxnull.net>
4 
5  This file is part of libevfibers.
6 
7  libevfibers is free software: you can redistribute it and/or modify
8  it under the terms of the GNU Lesser General Public License as
9  published by the Free Software Foundation, either version 3 of the
10  License, or any later version.
11 
12  libevfibers is distributed in the hope that it will be useful, but
13  WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  Lesser General Public License for more details.
16 
17  You should have received a copy of the GNU Lesser General
18  Public License along with libevfibers. If not, see
19  <http://www.gnu.org/licenses/>.
20 
21  ********************************************************************/
22 
143 #ifndef _FBR_FIBER_H_
144 #define _FBR_FIBER_H_
145 
149 #include <unistd.h>
150 #include <stdarg.h>
151 #include <stddef.h>
152 #include <sys/types.h>
153 #include <sys/socket.h>
154 #include <assert.h>
155 #include <ev.h>
156 
160 #define FBR_CALL_STACK_SIZE 16
161 
164 #define FBR_STACK_SIZE (64 * 1024) /* 64 KB */
165 
170 #ifdef NDEBUG
171 #define fbr_assert(context, expr) ((void)(0))
172 #else
173 #define fbr_assert(context, expr) \
174  do { \
175  __typeof__(expr) ex = (expr); \
176  if (ex) \
177  (void)(0); \
178  else { \
179  fbr_dump_stack(context, fbr_log_e); \
180  __assert_fail(__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION); \
181  } \
182  } while (0)
183 #endif
184 
190 #define fbr_container_of(ptr, type, member) ({ \
191  const typeof( ((type *)0)->member ) *__mptr = (ptr); \
192  (type *)( (char *)__mptr - offsetof(type,member) ); \
193  })
194 
195 struct fbr_context_private;
196 struct fbr_mutex;
197 struct fbr_logger;
198 struct fbr_buffer;
199 struct fbr_cond_var;
205 typedef __uint128_t fbr_id_t;
206 
215  FBR_SUCCESS = 0,
216  FBR_EINVAL,
217  FBR_ENOFIBER,
218  FBR_ESYSTEM,
219  FBR_EBUFFERMMAP,
220 };
221 
229 struct fbr_context {
230  struct fbr_context_private *__p;
233  struct fbr_logger *logger;
234 };
235 
239 #define FBR_P struct fbr_context *fctx
240 
245 #define FBR_P_ FBR_P,
246 
250 #define FBR_A fctx
251 
256 #define FBR_A_ FBR_A,
257 
267 typedef void (*fbr_fiber_func_t)(FBR_P_ void *_arg);
268 
281 typedef void (*fbr_alloc_destructor_func_t)(FBR_P_ void *ptr, void *context);
282 
289  FBR_LOG_ERROR = 0,
290  FBR_LOG_WARNING,
291  FBR_LOG_NOTICE,
292  FBR_LOG_INFO,
293  FBR_LOG_DEBUG
294 };
295 
296 struct fbr_logger;
297 
305 #define fbr_need_log(fctx, test_level) ((test_level) <= (fctx)->logger->level)
306 
310 #define fbr_set_log_level(fctx, desired_level) \
311  (fctx)->logger->level = (desired_level)
312 
325 typedef void (*fbr_log_func_t)(FBR_P_ struct fbr_logger *logger,
326  enum fbr_log_level level, const char *format, va_list ap);
335 typedef void (*fbr_logutil_func_t)(FBR_P_ const char *format, ...);
336 
342 struct fbr_logger {
345  void *data;
346 };
347 
356 };
357 
366 struct fbr_ev_base {
369  struct fbr_context *fctx; //Private
370  void *data; //Private
371 };
372 
381 #define fbr_ev_upcast(ptr, type_no_struct) \
382  fbr_container_of(ptr, struct type_no_struct, ev_base)
383 
394  ev_watcher *w;
395  struct fbr_ev_base ev_base;
396 };
397 
405 struct fbr_ev_mutex {
406  struct fbr_mutex *mutex;
407  struct fbr_ev_base ev_base;
408 };
409 
418  struct fbr_cond_var *cond;
420  struct fbr_mutex *mutex;
421  struct fbr_ev_base ev_base;
422 };
423 
432 void fbr_ev_watcher_init(FBR_P_ struct fbr_ev_watcher *ev, ev_watcher *w);
433 
442 void fbr_ev_mutex_init(FBR_P_ struct fbr_ev_mutex *ev,
443  struct fbr_mutex *mutex);
444 
453 void fbr_ev_cond_var_init(FBR_P_ struct fbr_ev_cond_var *ev,
454  struct fbr_cond_var *cond, struct fbr_mutex *mutex);
455 
464 void fbr_ev_wait_one(FBR_P_ struct fbr_ev_base *one);
465 
477 struct fbr_ev_base *fbr_ev_wait(FBR_P_ struct fbr_ev_base *events[]);
478 
488 int fbr_transfer(FBR_P_ fbr_id_t to);
489 
500 void fbr_init(struct fbr_context *fctx, struct ev_loop *loop);
501 
510 void fbr_destroy(FBR_P);
511 
522 void fbr_enable_backtraces(FBR_P, int enabled);
523 
530 const char *fbr_strerror(FBR_P_ enum fbr_error_code code);
531 
543 void fbr_log_e(FBR_P_ const char *format, ...)
544  __attribute__ ((format (printf, 2, 3)));
545 
557 void fbr_log_w(FBR_P_ const char *format, ...)
558  __attribute__ ((format (printf, 2, 3)));
559 
571 void fbr_log_n(FBR_P_ const char *format, ...)
572  __attribute__ ((format (printf, 2, 3)));
573 
585 void fbr_log_i(FBR_P_ const char *format, ...)
586  __attribute__ ((format (printf, 2, 3)));
587 
599 void fbr_log_d(FBR_P_ const char *format, ...)
600  __attribute__ ((format (printf, 2, 3)));
601 
628 fbr_id_t fbr_create(FBR_P_ const char *name, fbr_fiber_func_t func, void *arg,
629  size_t stack_size);
630 
631 
648 int fbr_disown(FBR_P_ fbr_id_t parent);
649 
659 fbr_id_t fbr_parent(FBR_P);
660 
676 int fbr_reclaim(FBR_P_ fbr_id_t fiber);
677 
683 int fbr_is_reclaimed(FBR_P_ fbr_id_t fiber);
684 
689 fbr_id_t fbr_self(FBR_P);
690 
696 struct fbr_fiber_arg fbr_arg_i(int i);
697 
703 struct fbr_fiber_arg fbr_arg_v(void *v);
704 
716 void fbr_yield(FBR_P);
717 
730 void *fbr_alloc(FBR_P_ size_t size);
731 
749  void *context);
750 
761 void *fbr_calloc(FBR_P_ unsigned int nmemb, size_t size);
762 
772 void fbr_free(FBR_P_ void *ptr);
773 
783 void fbr_free_nd(FBR_P_ void *ptr);
784 
794 int fbr_fd_nonblock(FBR_P_ int fd);
795 
814 ssize_t fbr_read(FBR_P_ int fd, void *buf, size_t count);
815 
836 ssize_t fbr_read_all(FBR_P_ int fd, void *buf, size_t count);
837 
855 ssize_t fbr_readline(FBR_P_ int fd, void *buffer, size_t n);
856 
873 ssize_t fbr_write(FBR_P_ int fd, const void *buf, size_t count);
874 
893 ssize_t fbr_write_all(FBR_P_ int fd, const void *buf, size_t count);
894 
912 ssize_t fbr_recvfrom(FBR_P_ int sockfd, void *buf, size_t len, int flags,
913  struct sockaddr *src_addr, socklen_t *addrlen);
914 
932 ssize_t fbr_sendto(FBR_P_ int sockfd, const void *buf, size_t len, int flags, const
933  struct sockaddr *dest_addr, socklen_t addrlen);
934 
949 int fbr_accept(FBR_P_ int sockfd, struct sockaddr *addr, socklen_t *addrlen);
950 
959 ev_tstamp fbr_sleep(FBR_P_ ev_tstamp seconds);
960 
966 void fbr_dump_stack(FBR_P_ fbr_logutil_func_t log);
967 
981 struct fbr_mutex *fbr_mutex_create(FBR_P);
982 
995 void fbr_mutex_lock(FBR_P_ struct fbr_mutex *mutex);
996 
1010 int fbr_mutex_trylock(FBR_P_ struct fbr_mutex *mutex);
1011 
1024 void fbr_mutex_unlock(FBR_P_ struct fbr_mutex *mutex);
1025 
1037 void fbr_mutex_destroy(FBR_P_ struct fbr_mutex *mutex);
1038 
1051 struct fbr_cond_var *fbr_cond_create(FBR_P);
1052 
1063 void fbr_cond_destroy(FBR_P_ struct fbr_cond_var *cond);
1064 
1080 int fbr_cond_wait(FBR_P_ struct fbr_cond_var *cond, struct fbr_mutex *mutex);
1081 
1093 void fbr_cond_broadcast(FBR_P_ struct fbr_cond_var *cond);
1094 
1106 void fbr_cond_signal(FBR_P_ struct fbr_cond_var *cond);
1107 
1118 struct fbr_buffer *fbr_buffer_create(FBR_P_ size_t size);
1119 
1127 void fbr_buffer_free(FBR_P_ struct fbr_buffer *buffer);
1128 
1144 void *fbr_buffer_alloc_prepare(FBR_P_ struct fbr_buffer *buffer, size_t size);
1145 
1154 void fbr_buffer_alloc_commit(FBR_P_ struct fbr_buffer *buffer);
1155 
1165 void fbr_buffer_alloc_abort(FBR_P_ struct fbr_buffer *buffer);
1166 
1180 void *fbr_buffer_read_address(FBR_P_ struct fbr_buffer *buffer, size_t size);
1181 
1191 void fbr_buffer_read_advance(FBR_P_ struct fbr_buffer *buffer);
1192 
1202 void fbr_buffer_read_discard(FBR_P_ struct fbr_buffer *buffer);
1203 
1212 size_t fbr_buffer_bytes(FBR_P_ struct fbr_buffer *buffer);
1213 
1222 size_t fbr_buffer_free_bytes(FBR_P_ struct fbr_buffer *buffer);
1223 
1224 struct fbr_cond_var *fbr_buffer_cond_read(FBR_P_ struct fbr_buffer *buffer);
1225 struct fbr_cond_var *fbr_buffer_cond_write(FBR_P_ struct fbr_buffer *buffer);
1226 
1235 void *fbr_get_user_data(FBR_P_ fbr_id_t id);
1236 
1246 int fbr_set_user_data(FBR_P_ fbr_id_t id, void *data);
1247 
1248 #endif