123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802 |
- #ifndef IOQUEUE_H
- #define IOQUEUE_H
- #pragma once
- #include "config.h"
- #include <winpr/winsock.h>
- #if defined(_MSC_VER)
- #pragma comment(lib, "ws2_32.lib")
- #pragma comment(lib, "Mswsock.lib")
- #endif //_MSC_VER
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include <stddef.h>
- #include "timerqueue.h"
- #include "list.h"
- #include "spinlock.h"
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // ioqueue
- //
- // support:
- // (1) user message queue
- // (2) timer
- // (3) proactor network framework
- /**
- * opaque structure for io queue
- */
- typedef struct ioqueue_t ioqueue_t;
- /**
- * @return return non-zero means need continue processing
- */
- typedef int (*ioqueue_on_msg_callback)(unsigned short msg_id, param_size_t param1, param_size_t param2);
- #define MAX_MSG 1024
- #define MAX_MSG_PRIORITY 32
- /**
- * create io queue
- * @param ioq [out] pointer to ioqueue_t structure
- * @return NULL failed
- */
- TOOLKIT_API ioqueue_t *ioqueue_create();
- /**
- * destroy io queue
- */
- TOOLKIT_API void ioqueue_destroy(ioqueue_t *ioq);
- /**
- * is all handler closed ?
- */
- TOOLKIT_API int ioqueue_handler_empty(ioqueue_t *ioq);
- /** is all pending msg procceed ? */
- TOOLKIT_API int ioqueue_msg_empty(ioqueue_t *ioq);
- /** detect whether can exit */
- static int __inline ioqueue_can_exit(ioqueue_t *ioq)
- {
- return ioqueue_handler_empty(ioq) && ioqueue_msg_empty(ioq);
- }
- /**
- * set user cutomized data
- * @return the old user_data value
- */
- TOOLKIT_API void *ioqueue_set_user_data(ioqueue_t *ioq, void* user_data);
- /**
- * get user cutomized data
- */
- TOOLKIT_API void *ioqueue_get_user_data(ioqueue_t *ioq);
- /**
- * poll io queue for dispatching events
- * @param timeout time out value for a poll operation
- * @return number of events dispatched
- */
- TOOLKIT_API int ioqueue_poll(ioqueue_t *ioq, int timeout);
- /**
- * stop
- */
- TOOLKIT_API void ioqueue_stop(ioqueue_t *ioq);
- /**
- * register a message handler for msg_type
- * @param msg_type message type identifier [0, 1024)
- * @param priority [0,32), the lower value means this cb will be invoked first while processing msgs of msg_id
- * @return -1 failed, 0 success
- */
- TOOLKIT_API int ioqueue_msg_add_handler(ioqueue_t *ioq, int msg_type, int priority, ioqueue_on_msg_callback cb);
- /**
- * unregister a message handler for msg_type
- */
- TOOLKIT_API int ioqueue_msg_remove_handler(ioqueue_t *ioq, int msg_type, int priority);
- /**
- * post user message
- */
- TOOLKIT_API int ioqueue_post_message(ioqueue_t *ioq, int msg_type, param_size_t param1, param_size_t param2);
- /**
- * send message, synchronous operation
- */
- TOOLKIT_API int ioqueue_send_message(ioqueue_t *ioq, int msg_type, param_size_t param1, param_size_t param2);
- /**
- * cancel all message with msg_type
- */
- // int ioqueue_cancel_message(ioqueue_t *ioq, int msg_type);
- /**
- * start a timer invoked at now() + delay
- * @param entry the entry to schedule
- * @param delay time value to delay, in milliseconds
- * @return 0 success, -1 failed
- */
- TOOLKIT_API int ioqueue_timer_schedule(ioqueue_t *ioq, timer_entry *entry, unsigned int delay);
- /**
- * cancel a timer
- * @param entry timer entry that has been scheduled
- * @param cancel if cancel successful if invoke timer with error = -1?
- * @return 0 cancel ok, -1 failed
- */
- TOOLKIT_API int ioqueue_timer_cancel(ioqueue_t *ioq, timer_entry *entry, int cancel);
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // acceptor
- typedef struct ioqueue_handle_context { /* do not access directly */
- struct list_head node;
- int type;
- union {
- HANDLE file;
- SOCKET sock;
- #ifdef _WIN32
- char* pipe_name;
- #endif //_WIN32
- }u;
- #ifndef _WIN32
- char* pipe_name;
- #endif //NOT _WIN32
- void *user_data;
- ioqueue_t *owner;
- LONG pending_ios;
- lock_t ov_pending_list_lock;
- struct list_head ov_pending_list;
- }ioqueue_handle_context;
- typedef struct ioqueue_handle_context ioqueue_udpsock_t;
- typedef struct ioqueue_handle_context ioqueue_tcpsock_t;
- typedef struct ioqueue_handle_context ioqueue_acceptor_t;
- typedef struct ioqueue_handle_context ioqueue_file_t;
- typedef struct ioqueue_handle_context ioqueue_pipe_acceptor_t;
- typedef struct ioqueue_overlapped_t { /* do not access directly */
- void* __internal[32];
- }ioqueue_overlapped_t;
- /**
- * callback while new client connects in
- * @param user_data pass from async_accept
- * @param in_sock client socket, if you dont need this socket,
- * no need to call closesocket on it, just return zero!!!
- * @param err -1 on failed, 0 on success
- * @return non-zero means accept, zero reject
- */
- typedef int (*ioqueue_on_accept_callback)(ioqueue_acceptor_t *acceptor,
- ioqueue_overlapped_t *overlapped,
- SOCKET in_sock,
- void *user_data,
- int err);
- /**
- * create a new acceptor(TCP only)
- * @param [in] ioq io queue pointer
- * @param [in] ip service ip address
- * @param [in] port service port
- * @param [out] acceptor pointer to result structure
- * @return 0 success, -1 failed
- */
- TOOLKIT_API int ioqueue_acceptor_create(ioqueue_t *ioq,
- const char *ip,
- unsigned short port,
- ioqueue_acceptor_t* acceptor);
- /**
- * destory an acceptor
- */
- TOOLKIT_API void ioqueue_acceptor_destroy(ioqueue_acceptor_t *acceptor);
- /** close socket handler, so all pending async operation can be aborted */
- TOOLKIT_API void ioqueue_acceptor_close(ioqueue_acceptor_t* acceptor);
- /**
- * listen
- * @return 0 ok, -1 failed
- */
- TOOLKIT_API int ioqueue_acceptor_listen(ioqueue_acceptor_t* acceptor, int backlog);
- /**
- * get raw socket handler
- */
- TOOLKIT_API SOCKET ioqueue_acceptor_get_raw_socket(ioqueue_acceptor_t *sock);
- /**
- * get owned ioqueue
- */
- TOOLKIT_API ioqueue_t* ioqueue_acceptor_get_owned_ioqueue(ioqueue_acceptor_t* acceptor);
- /**
- * set user customize data
- * @return old value
- */
- TOOLKIT_API void *ioqueue_acceptor_set_user_data(ioqueue_acceptor_t* acceptor, void *user_data);
- /**
- * get user customize data
- */
- TOOLKIT_API void *ioqueue_acceptor_get_user_data(ioqueue_acceptor_t* acceptor);
- /**
- * start a accept asynchronous operation
- * @param acceptor [in] pointer to acceptor
- * @param overlapped [in] operation based structure, cannot be free before callback invoked
- * @param on_accept_cb [in] accept callback, invoked after new socket accept
- * @return -1 failed, 0 on success
- */
- TOOLKIT_API int ioqueue_acceptor_async_accept(ioqueue_acceptor_t* acceptor,
- ioqueue_overlapped_t *overlapped,
- ioqueue_on_accept_callback on_accept_cb,
- void *user_data);
- /** blocked accept */
- TOOLKIT_API int ioqueue_acceptor_accept(ioqueue_acceptor_t* acceptor, SOCKET *s, struct sockaddr *addr, int *addrlen, int timeout);
- /**
- * get client tcp socket from acceptor and overlapped result, used in ioqueue_on_accept_callback!!!
- * @param acceptor [in] acceptor handle, from ioqueue_on_accept_callback params
- * @param s [in] acceptor returned client socket, from ioqueue_on_accept_callback params
- * @param tcpsock [out] result
- * @return -1 failed, 0 ok
- */
- TOOLKIT_API int ioqueue_acceptor_create_client(ioqueue_acceptor_t* acceptor, SOCKET s, ioqueue_tcpsock_t *tcpsock);
- TOOLKIT_API void ioqueue_acceptor_destroy_client(ioqueue_tcpsock_t *tcpsock);
- /**
- * cancel all async operation
- * @return -1 failed, 0 ok
- */
- TOOLKIT_API int ioqueue_acceptor_cancel(ioqueue_acceptor_t* acceptor);
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // tcp socket
- /** asynchronous callbacks */
- typedef void (*ioqueue_on_connect_callback)(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *user_data,
- int err);
- typedef void (*ioqueue_on_send_callback)(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int transfer_bytes,
- void *user_data,
- int err);
- typedef void (*ioqueue_on_recv_callback)(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int transfer_bytes,
- void *user_data,
- int err);
- typedef void (*ioqueue_on_recvuntil_callback)(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int transfer_bytes,
- unsigned int header_length,
- void *user_data,
- int err);
- /**
- * create tcp socket (non-connect, already bind to random local address)
- */
- TOOLKIT_API int ioqueue_tcpsock_create(ioqueue_t *ioq, ioqueue_tcpsock_t *tcpsock);
- /** create tcp socket object from socket handle */
- TOOLKIT_API int ioqueue_tcpsock_create_from_handle(ioqueue_t *ioq, SOCKET s, ioqueue_tcpsock_t *tcpsock);
- /**
- * connect to tcp(ip:port)
- * @param [in] ip remote server ip address
- * @param [in] port remote server port number, host byte order
- * @param [in] on_connect_cb callback function
- * @param [in] user_data pass to on_connect_cb
- * @return 0 success, -1 failed
- */
- TOOLKIT_API int ioqueue_tcpsock_async_connect(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- const char *ip,
- unsigned short port,
- ioqueue_on_connect_callback on_connect_cb,
- void* user_data);
- /** block connect */
- TOOLKIT_API int ioqueue_tcpsock_conect(ioqueue_tcpsock_t *tcpsock, const char *ip, unsigned short port, int timeout);
- /**
- * issue an asynchronous send operation
- * @param buf send buffer
- * @param len buffer length
- * @param on_send_cb callback funtion
- * @return -1 on failed, 0 on success
- */
- TOOLKIT_API int ioqueue_tcpsock_async_sendsome(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- ioqueue_on_send_callback on_send_cb,
- void *user_data);
- TOOLKIT_API int ioqueue_tcpsock_async_sendn(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- ioqueue_on_send_callback on_send_cb,
- void* user_data);
- TOOLKIT_API int ioqueue_tcpsock_async_senduntil(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- const char *delimer,
- ioqueue_on_send_callback on_send_cb,
- void* user_data);
- /** blocking send */
- TOOLKIT_API int ioqueue_tcpsock_sendsome(ioqueue_tcpsock_t *tcpsock,
- void *buf,
- unsigned int len,
- int timeout);
- TOOLKIT_API int ioqueue_tcpsock_sendn(ioqueue_tcpsock_t *tcpsock,
- void *buf,
- unsigned int len,
- int timeout);
- TOOLKIT_API int ioqueue_tcpsock_senduntil(ioqueue_tcpsock_t *tcpsock,
- void *buf,
- unsigned int len,
- const char *delimer,
- int timeout);
- /**
- * issue an asynchronous recv operation
- */
- TOOLKIT_API int ioqueue_tcpsock_async_recvsome(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- ioqueue_on_recv_callback on_recv_cb,
- void *user_data);
- TOOLKIT_API int ioqueue_tcpsock_async_recvn(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- ioqueue_on_recv_callback on_recv_cb,
- void *user_data);
- TOOLKIT_API int ioqueue_tcpsock_async_recvuntil(ioqueue_tcpsock_t *tcpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- const char *delimer,
- ioqueue_on_recvuntil_callback on_recvuntil_cb,
- void *user_data);
- /** blocking recv */
- TOOLKIT_API int ioqueue_tcpsock_recvsome(ioqueue_tcpsock_t *tcpsock,
- void *buf,
- unsigned int len,
- int timeout);
- TOOLKIT_API int ioqueue_tcpsock_recvn(ioqueue_tcpsock_t *tcpsock,
- void *buf,
- unsigned int len,
- int timeout);
- TOOLKIT_API int ioqueue_tcpsock_recvuntil(ioqueue_tcpsock_t *tcpsock,
- void *buf,
- unsigned int len,
- const char *delimer,
- unsigned int *header_len,
- int timeout);
- /** close socket handler, so all pending async operation can be aborted */
- TOOLKIT_API void ioqueue_tcpsock_close(ioqueue_tcpsock_t *tcpsock);
- /**
- * destory an tcpsock
- */
- TOOLKIT_API void ioqueue_tcpsock_destroy(ioqueue_tcpsock_t *tcpsock);
- /**
- * shutdown wrapper
- */
- TOOLKIT_API int ioqueue_tcpsock_shutdown(ioqueue_tcpsock_t *tcpsock, int how);
- /**
- * get raw socket handler
- */
- TOOLKIT_API SOCKET ioqueue_tcpsock_get_raw_socket(ioqueue_tcpsock_t *tcpsock);
- /**
- * get owned ioqueue
- */
- TOOLKIT_API ioqueue_t* ioqueue_tcpsock_get_owned_ioqueue(ioqueue_tcpsock_t *tcpsock);
- /**
- * set user customize data
- * @return old value
- */
- TOOLKIT_API void *ioqueue_tcpsock_set_user_data(ioqueue_tcpsock_t *tcpsock, void *user_data);
- /**
- * get user customize data
- */
- TOOLKIT_API void *ioqueue_tcpsock_get_user_data(ioqueue_tcpsock_t *tcpsock);
- /**
- * cancel all async operation
- * @return -1 failed, 0 ok
- */
- TOOLKIT_API int ioqueue_tcpsock_cancel(ioqueue_tcpsock_t* tcpsock);
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // udp socket
- typedef void (*ioqueue_on_sendto_callback)(ioqueue_udpsock_t *udpsock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int transfer_bytes,
- void *user_data,
- int err);
- typedef void (*ioqueue_on_recvfrom_callback)(ioqueue_udpsock_t *udpsock,
- ioqueue_overlapped_t *overlapped,
- const struct sockaddr *from,
- int fromlen,
- void *buf,
- unsigned int transfer_bytes,
- void *user_data,
- int err);
- /**
- * create udp socket
- */
- TOOLKIT_API int ioqueue_udpsock_create(ioqueue_t *ioq, ioqueue_udpsock_t *udpsock);
- /** create udp socket object from socket handle */
- TOOLKIT_API int ioqueue_udpsock_create_from_handle(ioqueue_t *ioq, SOCKET s, ioqueue_udpsock_t *udpsock);
- /** close socket handler, so all pending async operation can be aborted */
- TOOLKIT_API void ioqueue_udpsock_close(ioqueue_udpsock_t *udpsock);
- /**
- * destroy udp socket
- */
- TOOLKIT_API void ioqueue_udpsock_destroy(ioqueue_udpsock_t *udpsock);
- /**
- * issue an asynchronous sendto operation, mainly for udp udpsock
- */
- TOOLKIT_API int ioqueue_udpsock_async_sendto(ioqueue_udpsock_t* sock,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- int len,
- const struct sockaddr* to,
- int tolen,
- ioqueue_on_sendto_callback on_sendto_cb,
- void *user_data);
- /** blocking sendto */
- TOOLKIT_API int ioqueue_udpsock_sendto(ioqueue_udpsock_t *udpsock,
- void *buf,
- int len,
- const struct sockaddr* to,
- int tolen,
- int timeout);
- /**
- * issue an asynchronous recv operation, mainly for udp udpsock
- */
- TOOLKIT_API int ioqueue_udpsock_async_recvfrom(ioqueue_udpsock_t* udpsock,
- ioqueue_overlapped_t *overlapped,
- void* buf,
- int len,
- ioqueue_on_recvfrom_callback on_recvfrom_cb,
- void *user_data);
- /** blocking recvfrom */
- TOOLKIT_API int ioqueue_udpsock_recvfrom(ioqueue_udpsock_t* udpsock,
- ioqueue_overlapped_t *overlapped,
- void* buf,
- int len,
- struct sockaddr *addr,
- int *addrlen,
- int timeout);
- /**
- * get raw socket handler
- */
- TOOLKIT_API SOCKET ioqueue_udpsock_get_raw_socket(ioqueue_udpsock_t *udpsock);
- /**
- * get owned ioqueue
- */
- TOOLKIT_API ioqueue_t* ioqueue_udpsock_get_owned_ioqueue(ioqueue_udpsock_t *udpsock);
- /**
- * set user customize data
- * @return old value
- */
- TOOLKIT_API void *ioqueue_udpsock_set_user_data(ioqueue_udpsock_t *udpsock, void *user_data);
- /**
- * get user customize data
- */
- TOOLKIT_API void *ioqueue_udpsock_get_user_data(ioqueue_udpsock_t *udpsock);
- /**
- * cancel all async operation
- * @return -1 failed, 0 ok
- */
- TOOLKIT_API int ioqueue_udpsock_cancel(ioqueue_udpsock_t *udpsock);
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // file
- /** asychronous callbacks */
- typedef void (*ioqueue_on_read_callback)(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int transfer_bytes,
- void *user_data,
- int err);
- typedef void (*ioqueue_on_readuntil_callback)(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int transfer_bytes,
- unsigned int header_length,
- void *user_data,
- int err);
- typedef void (*ioqueue_on_write_callback)(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int transfer_bytes,
- void *user_data,
- int err);
- /**
- * create file from path
- * @param path local file system path
- * @param dwDesiredAccess refer CreateFile api
- * @param dwShareMode refer CreateFile api
- * @param dwCreationDisposition refer CreateFile api
- * @param dwFlagsAndAttributes refer CreateFile api
- * @return 0 success, -1 failed
- */
- TOOLKIT_API int ioqueue_file_create(ioqueue_t *ioq,
- const char *path,
- DWORD dwDesiredAccess,
- DWORD dwShareMode,
- DWORD dwCreationDisposition,
- DWORD dwFlagsAndAttributes,
- ioqueue_file_t *file);
- TOOLKIT_API int ioqueue_file_create_from_handle(ioqueue_t *ioq, HANDLE h, ioqueue_file_t *file);
- /** close file handler, so all pending async operation can be aborted */
- TOOLKIT_API void ioqueue_file_close(ioqueue_file_t* file);
- /**
- * destroy file
- */
- TOOLKIT_API void ioqueue_file_destroy(ioqueue_file_t* file);
- /**
- * issue an asynchronous read operation
- * @return -1 on failed, 0 on success
- */
- TOOLKIT_API int ioqueue_file_async_readsome(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- ioqueue_on_read_callback on_read_cb,
- void *user_data);
- TOOLKIT_API int ioqueue_file_async_readn(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- ioqueue_on_read_callback on_read_cb,
- void *user_data);
- /** blocking read */
- TOOLKIT_API int ioqueue_file_readsome(ioqueue_file_t *file, void *buf, unsigned int len);
- TOOLKIT_API int ioqueue_file_readn(ioqueue_file_t *file, void *buf, unsigned int len);
- /**
- * issue an asynchronous read at operation
- * @param buf read buffer
- * @param len buffer length
- * @param pos file read position
- * @param on_read_cb callback function
- */
- TOOLKIT_API int ioqueue_file_async_readsome_at(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- DWORD posLow,
- DWORD posHigh,
- ioqueue_on_read_callback on_read_cb,
- void *user_data);
- TOOLKIT_API int ioqueue_file_async_readn_at(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void *buf,
- unsigned int len,
- DWORD posLow,
- DWORD posHigh,
- ioqueue_on_read_callback on_read_cb,
- void *user_data);
- /** blocking read at */
- TOOLKIT_API int ioqueue_file_readsome_at(ioqueue_file_t *file, void *buf, unsigned int len, DWORD posLow, DWORD posHigh);
- TOOLKIT_API int ioqueue_file_readn_at(ioqueue_file_t *file, void *buf, unsigned int len, DWORD posLow, DWORD posHigh);
- /**
- * issue an asynchronous write at operation
- */
- TOOLKIT_API int ioqueue_file_async_writesome(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void* buf,
- unsigned int len,
- ioqueue_on_write_callback on_write_cb,
- void *user_data);
- TOOLKIT_API int ioqueue_file_async_writen(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void* buf,
- unsigned int len,
- ioqueue_on_write_callback on_write_cb,
- void *user_data);
- /** blocking write */
- TOOLKIT_API int ioqueue_file_writesome(ioqueue_file_t* file, const void *buf, unsigned int len);
- TOOLKIT_API int ioqueue_file_writen(ioqueue_file_t* file, const void *buf, unsigned int len);
- /**
- * issue an asynchronous write at operation
- */
- TOOLKIT_API int ioqueue_file_async_writesome_at(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void* buf,
- unsigned int len,
- DWORD posLow,
- DWORD posHigh,
- ioqueue_on_write_callback on_write_cb,
- void *user_data);
- TOOLKIT_API int ioqueue_file_async_writen_at(ioqueue_file_t* file,
- ioqueue_overlapped_t *overlapped,
- void* buf,
- unsigned int len,
- DWORD posLow,
- DWORD posHigh,
- ioqueue_on_write_callback on_write_cb,
- void *user_data);
- /** blocking write at */
- TOOLKIT_API int ioqueue_file_writesome_at(ioqueue_file_t* file,
- const void *buf,
- unsigned int len,
- DWORD posLow,
- DWORD posHigh);
- TOOLKIT_API int ioqueue_file_writen_at(ioqueue_file_t* file,
- const void *buf,
- unsigned int len,
- DWORD posLow,
- DWORD posHigh);
- /**
- * get owned ioqueue
- */
- TOOLKIT_API ioqueue_t* ioqueue_file_get_owned_ioqueue(ioqueue_file_t* file);
- /**
- * get inner file handler
- */
- TOOLKIT_API HANDLE ioqueue_file_get_raw_handle(ioqueue_file_t* file);
- /**
- * set user customized data
- * @return old value
- */
- TOOLKIT_API void *ioqueue_file_set_user_data(ioqueue_file_t* file, void* user_data);
- /**
- * get user customized data
- */
- TOOLKIT_API void *ioqueue_file_get_user_data(ioqueue_file_t* file);
- /**
- * cancel all async operation
- * @return -1 failed, 0 ok
- */
- TOOLKIT_API int ioqueue_file_cancel(ioqueue_file_t* file);
- ////////////////////////////////////////////////////////////////////////////////////////////////
- // pipe server
- /**
- * callback while new pipe client connects in
- * @param user_data pass from async_accept
- * @param in_sock client socket, if you dont need this socket,
- * no need to call closesocket on it, just return zero!!!
- * @param err -1 on failed, 0 on success
- * @return non-zero means accept, zero reject
- */
- typedef int (*ioqueue_on_pipe_accept_callback)(ioqueue_pipe_acceptor_t *acceptor,
- ioqueue_overlapped_t *overlapped,
- HANDLE pipe,
- void *user_data,
- int err);
- /**
- * pipe acceptor
- */
- TOOLKIT_API int ioqueue_pipe_acceptor_create(ioqueue_t *ioq, const char *name, ioqueue_pipe_acceptor_t *acceptor);
- /**
- * destroy pipe acceptor
- */
- TOOLKIT_API void ioqueue_pipe_acceptor_destroy(ioqueue_pipe_acceptor_t *acceptor);
- /**
- * get owned ioqueue
- */
- TOOLKIT_API ioqueue_t* ioqueue_pipe_acceptor_get_owned_ioqueue(ioqueue_pipe_acceptor_t *acceptor);
- /**
- * set user customize data
- * @return old value
- */
- TOOLKIT_API void *ioqueue_pipe_acceptor_set_user_data(ioqueue_pipe_acceptor_t *acceptor, void *user_data);
- /**
- * get user customize data
- */
- TOOLKIT_API void *ioqueue_pipe_acceptor_get_user_data(ioqueue_pipe_acceptor_t *acceptor);
- /** async accept */
- TOOLKIT_API int ioqueue_pipe_acceptor_async_accept(ioqueue_pipe_acceptor_t *acceptor,
- ioqueue_overlapped_t *overlapped,
- ioqueue_on_pipe_accept_callback cb,
- void *user_data);
- /** blocked accept */
- TOOLKIT_API int ioqueue_pipe_acceptor_accept(ioqueue_pipe_acceptor_t *acceptor, HANDLE *p_pipe, int timeout);
- /**
- * get client pipe from acceptor and overlapped result, used in ioqueue_on_pipe_accept_callback!!!
- * @param acceptor [in] acceptor handle, from ioqueue_on_accept_callback params
- * @param h [in] acceptor returned client pipe handle, from ioqueue_on_pipe_accept_callback params
- * @param pipe [out] result
- * @return -1 failed, 0 ok
- */
- TOOLKIT_API int ioqueue_pipe_acceptor_create_client(ioqueue_pipe_acceptor_t *acceptor, HANDLE h, ioqueue_file_t *pipe);
- TOOLKIT_API void ioqueue_pipe_acceptor_destroy_client(ioqueue_file_t *pipe);
- /**
- * cancel all async operation
- * @return -1 failed, 0 ok
- */
- TOOLKIT_API int ioqueue_pipe_acceptor_cancel(ioqueue_pipe_acceptor_t *acceptor);
- TOOLKIT_API int ioqueue_pipe_acceptor_close_pending_handle(ioqueue_pipe_acceptor_t *acceptor);
- #ifndef _WIN32
- TOOLKIT_API int ioqueue_overlapped_get_mask(const ioqueue_overlapped_t* const io);
- TOOLKIT_API void ioqueue_overlapped_set_mask(ioqueue_overlapped_t* io, int mask_value);
- TOOLKIT_API uint32_t ioqueue_overlapped_get_type(const ioqueue_overlapped_t* const io);
- #endif //NOT _WIN32
- #ifdef __cplusplus
- } // extern "C" {
- #endif
- #endif // IOQUEUE_H
|