acl/lib_fiber/c/include/fiber/fiber_event.h
2022-04-01 14:39:54 +08:00

72 lines
2.0 KiB
C

#ifndef FIBER_EVENT_INCLUDE_H
#define FIBER_EVENT_INCLUDE_H
#include "fiber_define.h"
#ifdef __cplusplus
extern "C" {
#endif
/* fiber_event.c */
/**
* Fiber event mutex object based on IO event, which is thread safety. That's
* to say one event object can used in different threads
*/
typedef struct ACL_FIBER_EVENT ACL_FIBER_EVENT;
/**
* When the fiber_event is used in multiple threads for sync, if there're
* many threads, the flag FIBER_FLAG_USE_MUTEX should be set to avoid internal
* thundering herd which maybe happen by using atomic; if the threads' number
* is less than one hundred, the flag FIBER_FLAG_USE_MUTEX needn't be set
*/
#define FIBER_FLAG_USE_MUTEX (1 << 0)
/**
* If this flag is set, msg_fatal will be used other msg_error when error
* happened, this flag is optional for users
*/
#define FIBER_FLAG_USE_FATAL (1 << 1)
/**
* Create fiber event mutex which can be used in fibers mode or threads mode
* @param flag {unsigned} define as FIBER_FLAG_XXX above
* @return {ACL_FIBER_EVENT *}
*/
FIBER_API ACL_FIBER_EVENT *acl_fiber_event_create(unsigned flag);
/**
* Free event mutex returned by acl_fiber_event_create
* @param {ACL_FIBER_EVENT *}
*/
FIBER_API void acl_fiber_event_free(ACL_FIBER_EVENT *event);
/**
* Wait for event can be available
* @param {ACL_FIBER_EVENT *}
* @return {int} 0 returned if successful, or -1 if error happened
*/
FIBER_API int acl_fiber_event_wait(ACL_FIBER_EVENT *event);
/**
* Try to wait for event can be available
* @param {ACL_FIBER_EVENT *}
* @return {int} 0 returned if successful, or -1 if the event been locked
*/
FIBER_API int acl_fiber_event_trywait(ACL_FIBER_EVENT *event);
/**
* The event's owner notify the waiters that the event mutex can be available,
* and the waiter will get the event mutex
* @param {ACL_FIBER_EVENT *}
* @return {int} 0 returned if successful, or -1 if error happened
*/
FIBER_API int acl_fiber_event_notify(ACL_FIBER_EVENT *event);
#ifdef __cplusplus
}
#endif
#endif