const char* ctype = (conn && conn->meta.get_type \
58? conn->meta.get_type(conn->meta.c_get_type) \
60char* descr = (conn && conn->meta.descr \
61? conn->meta.descr(conn->meta.c_descr) \
64if ((EIO_Status) status == eIO_Timeout && timeout) { \
65assert(timeout != kDefaultTimeout); \
66sprintf(stbuf, "%s[%u.%06u]", ststr, \
67timeout->usec / 1000000 + timeout->sec, \
68timeout->usec % 1000000); \
69assert(strlen(stbuf) < sizeof(stbuf)); \
72CORE_LOGF_X(subcode, level, \
73("[CONN_" #func_name "(%s%s%s)] %s%s%s", \
74ctype && *ctype ? ctype : "UNDEF", \
75descr && *descr ? "; " : "", descr ? descr : "", \
77ststr && *ststr ? ": " : "", \
78ststr ? ststr : "")); \
83 #define CONN_LOG(s_c, f_n, lvl, msg) CONN_LOG_EX(s_c, f_n, lvl, msg, status) 86 # define CONN_CALLTRACE(func_name) \ 88 static const STimeout* timeout = 0; \ 90 sprintf(x_handle, "0x%p", conn); \
91CONN_LOG_EX(0, func_name, eLOG_Trace, x_handle, 0); \
94 # define CONN_CALLTRACE(func_name) 101 #define CONN_NOT_NULL_EX(subcode, func_name, retval) \ 103 CONN_CALLTRACE(func_name); \ 105 static const STimeout* timeout = 0; \ 106 CONN_LOG_EX(subcode, func_name, eLOG_Error, \ 107 "NULL connection handle", retval); \
111if (conn->magic != CONNECTION_MAGIC) { \
112static const STimeout* timeout = 0
; \ 114 sprintf(x_errmsg, "Corrupt connection handle 0x%p", conn); \
115CONN_LOG_EX(subcode, func_name, eLOG_Critical, x_errmsg, 0); \
121 #define CONN_NOT_NULL(s_c, f_n) CONN_NOT_NULL_EX(s_c, f_n, eIO_InvalidArg) 124 # define CONN_TRACE(f_n, msg) CONN_LOG(0, f_n, eLOG_Trace, msg) 126 # define CONN_TRACE(f_n, msg) 189 static const STimeout* timeout = 0
;
191sprintf(errmsg,
"Unknown callback #%u for 0x%p, assume corruption",
244 if(!(func =
conn->cb[idx].func))
268 if(!
conn->meta.flush)
272timeout =
conn->meta.default_timeout;
274status =
conn->meta.flush(
conn->meta.c_flush, timeout);
276 conn->w_status = status;
300status =
conn->meta.list
305 for(x_conn =
conn->meta.list; x_conn; x_conn = x_conn->
next) {
307 if(x_conn == connector) {
310 if(!x_conn->
next&& x_conn ==
conn->meta.list)
319 if(
conn->meta.list) {
330 if(
conn->meta.close) {
333?
conn->meta.default_timeout
336closed =
conn->meta.close(
conn->meta.c_close, timeout);
341&& (status != eIO_Closed || connector)) {
345 "Connection failed to close properly");
348 "Connection failed to close properly");
358memset(&
conn->meta, 0,
sizeof(
conn->meta));
367}
else if(!connector)
370 if(!x_conn && connector) {
390 switch(
conn->state) {
406 if(
conn->meta.open) {
416?
conn->meta.default_timeout
419status =
conn->meta.open(
conn->meta.c_open, timeout);
469 conn->magic = (
unsigned int)(-1);
476 static const STimeout* timeout = 0
;
512 return!
conn->meta.list || !
conn->meta.get_type
513? 0 :
conn->meta.get_type(
conn->meta.c_get_type);
522 return!
conn->meta.list || !
conn->meta.descr
523? 0 :
conn->meta.descr(
conn->meta.c_descr);
529 static const STimeout* timeout = 0
;
548sprintf(errbuf,
"Unknown direction #%u", (
unsigned int) event);
570 if(&
conn->oo_timeout != timeout)
571 conn->oo_timeout = *timeout;
572 conn->o_timeout = &
conn->oo_timeout;
574 conn->o_timeout = timeout;
579 if(&
conn->rr_timeout != timeout)
580 conn->rr_timeout = *timeout;
581 conn->r_timeout = &
conn->rr_timeout;
583 conn->r_timeout = timeout;
589 if(&
conn->ww_timeout != timeout)
590 conn->ww_timeout = *timeout;
591 conn->w_timeout = &
conn->ww_timeout;
593 conn->w_timeout = timeout;
597 if(&
conn->cc_timeout != timeout)
598 conn->cc_timeout = *timeout;
599 conn->c_timeout = &
conn->cc_timeout;
601 conn->c_timeout = timeout;
604sprintf(errbuf,
"Unknown event #%u", (
unsigned int) event);
625timeout =
conn->o_timeout;
630 "ReadWrite timeout requested", 0);
633timeout =
conn->r_timeout;
636timeout =
conn->w_timeout;
639timeout =
conn->c_timeout;
643sprintf(errbuf,
"Unknown event #%u", (
unsigned int) event);
678timeout =
conn->meta.default_timeout;
681status =
conn->meta.wait
682?
conn->meta.wait(
conn->meta.c_wait, event, timeout)
686 static const char* kErrMsg[] = {
"Read event failed",
687 "Write event failed"};
693 else if(timeout->
sec| timeout->
usec)
726 for(timeout = 0; ; timeout = 0) {
733 if(!(writefunc =
conn->meta.write)) {
739?
conn->meta.default_timeout
746 conn->w_status = status;
749 conn->w_pos += *n_written;
769 else if(!timeout
|| (timeout->
sec| timeout->
usec))
791 size_tx_written = 0;
793 size- *n_written, &x_written);
794*n_written += x_written;
798 if(*n_written ==
size)
889?
conn->meta.default_timeout
913 for(timeout = 0; ; timeout = 0) {
931 if(x_read && (*n_read ==
size|| !peek)) {
935 buf= (
char*)
buf+ x_read;
942 if(!(readfunc =
conn->meta.read)) {
953?
conn->meta.default_timeout
957status = readfunc(
conn->meta.c_read,
buf,
size- *n_read,
961 conn->r_status = status;
965 conn->r_pos += x_read;
971 "Cannot save peek data", 0);
988}
else if(
size&& status != eIO_Closed) {
992 else if(!timeout
|| (timeout->
sec| timeout->
usec))
1018 size- *n_read, &x_read, 0
);
1023 if(*n_read ==
size)
1052 returnstatus == eIO_Closed ?
eIO_Unknown: status;
1092 if(!
size|| !line)
1099 returnstatus == eIO_Closed ?
eIO_Unknown: status;
1106 size_t i,
x_size, x_read = 0;
1107 char* x_buf =
size-
len<
sizeof(w) ? w : line +
len;
1115 while(
i< x_read &&
len<
size) {
1116 charc = x_buf[
i++];
1136 static const STimeout* timeout = 0
;
1139 "Cannot pushback extra data", 0);
1147line[
len] =
'\0';
1182 return conn->r_status;
1186 return conn->w_status;
1192 return conn->meta.status
1193?
conn->meta.status(
conn->meta.c_status, dir)
1210 returnstatus == eIO_Closed ?
eIO_Success: status;
1225 static const STimeout* timeout = 0
;
1227sprintf(errbuf,
"Unknown callback type #%u", (
unsigned int)
type);
1234 if(newcb || oldcb) {
1237 conn->cb[idx] = *newcb;
1261x_conn =
conn->meta.list;
1266|| ((
type= strrchr(
type,
'/')) != 0
static CS_CONNECTION * conn
int BUF_Write(BUF *pBuf, const void *data, size_t size)
int BUF_Pushback(BUF *pBuf, const void *data, size_t size)
size_t BUF_Read(BUF buf, void *data, size_t size)
size_t BUF_Peek(BUF buf, void *data, size_t size)
void BUF_Destroy(BUF buf)
unsigned int TCONN_Flags
bitwise OR of ECONN_Flag
EIO_Status CONN_SetFlags(CONN conn, TCONN_Flags flags)
Set connection processing flags.
ECONN_Callback
Set user callback function to be invoked upon an event specified by the callback type.
EIO_Status CONN_SetUserData(CONN conn, void *data)
Associate an arbitraty user data pointer with the connection.
EIO_Status CONN_ReadLine(CONN conn, char *line, size_t size, size_t *n_read)
Read up to "size" bytes from connection into a string buffer pointed to by "line".
EIO_Status CONN_CreateEx(CONNECTOR connector, TCONN_Flags flags, CONN *connection)
Create all data necessary to establish a new connection (merely bind it to the specified CONNECTOR).
EIO_Status CONN_Read(CONN conn, void *buf, size_t size, size_t *n_read, EIO_ReadMethod how)
FConnectorGetType get_type
EIO_Status CONN_Flush(CONN conn)
Explicitly flush connection from any pending data written by CONN_Write().
void * CONN_GetUserData(CONN conn)
Get current value of the user's data pointer last associated with the connection, or NULL (if CONN is...
EIO_Status CONN_SetCallback(CONN conn, ECONN_Callback type, const SCONN_Callback *newcb, SCONN_Callback *oldcb)
unsigned int TCONN_Callback
TNCBI_BigCount CONN_GetPosition(CONN conn, EIO_Event event)
Get read ("event" == eIO_Read) or write ("event" == eIO_Write) position within the connection.
EIO_Status CONN_Write(CONN conn, const void *data, size_t size, size_t *n_written, EIO_WriteMethod how)
CONNECTOR next
linked list
EIO_Status(* FConnectorRead)(CONNECTOR connector, void *buf, size_t size, size_t *n_read, const STimeout *timeout)
Read from connector.
EIO_Status CONN_SetTimeout(CONN conn, EIO_Event event, const STimeout *timeout)
Specify timeout for the connection I/O, including "Connect" (aka "Open") and "Close".
EIO_Status(* FConnectorWrite)(CONNECTOR connector, const void *buf, size_t size, size_t *n_written, const STimeout *timeout)
Write to connector.
char * CONN_Description(CONN conn)
Return a human-readable description of the connection as a character '\0'-terminated string.
EIO_Status CONN_Create(CONNECTOR connector, CONN *conn)
Same as CONN_CreateEx() called with 0 in the "flags" parameter.
EIO_Status CONN_ReInit(CONN conn, CONNECTOR connector)
Reinit using new "connector".
EIO_Status(* FCONN_Callback)(CONN conn, TCONN_Callback type, void *data)
EIO_Status CONN_Wait(CONN conn, EIO_Event event, const STimeout *timeout)
Block on the connection until it becomes available for either reading or writing (depending on "event...
EIO_Status METACONN_Remove(SMetaConnector *meta, CONNECTOR connector)
Delete given "connector" all its descendants (all connectors if "connector" is NULL) from the connect...
EIO_Status METACONN_Insert(SMetaConnector *meta, CONNECTOR connector)
Insert a connector at the beginning of the connection's list of connectors.
void * handle
data handle of the connector
SMetaConnector * meta
back link to original meta
const char * CONN_GetType(CONN conn)
Get verbal representation of connection type as a character string.
EIO_Status CONN_Close(CONN conn)
Close the connection and destroy all relevant internal data.
EIO_Status CONN_GetSOCK(CONN conn, SOCK *sock)
Get an underlying SOCK handle for connection that is implemented as a socket.
const STimeout * CONN_GetTimeout(CONN conn, EIO_Event event)
Retrieve current timeout, return NULL(kInfiniteTimeout) if it is infinite.
TCONN_Flags CONN_GetFlags(CONN conn)
Get connection processing flags currently in effect.
EIO_Status CONN_Status(CONN conn, EIO_Event dir)
Obtain status of the last I/O operation.
EIO_Status CONN_Pushback(CONN conn, const void *data, size_t size)
Push "size" bytes from the buffer "data" back into connection.
@ eCONN_OnFlush
About to be flushed (NB: == eIO_ReadWrite)
@ eCONN_OnWrite
Write to CONNECTOR is about to occur.
@ eCONN_OnTimeout
CONNECTOR I/O has timed out.
@ eCONN_OnClose
NB: CONN has been flushed prior to the call.
@ eCONN_OnRead
Read from CONNECTOR is about to occur.
@ eCONN_OnOpen
Call prior to open (NB: "conn" still closed)
@ fCONN_Untie
do not call flush method prior to reading
@ fCONN_Supplement
supplement I/O with extended return codes
void Read(CObjectIStream &in, TObjectPtr object, const CTypeRef &type)
void Write(CObjectOStream &out, TConstObjectPtr object, const CTypeRef &type)
ELOG_Level
Log severity level.
unsigned int usec
microseconds (modulo 1,000,000)
EIO_ReadMethod
I/O read method.
EIO_WriteMethod
I/O write method.
EIO_Event
I/O event (or direction).
uint64_t TNCBI_BigCount
Big unsigned integer for file size and position.
@ eIO_Timeout
timeout expired before any I/O succeeded
@ eIO_Interrupt
signal arrival prevented any I/O to succeed
@ eIO_NotSupported
operation is not supported or is not available
@ eIO_Success
everything is fine, no error occurred
@ eIO_Reserved
reserved status code â DO NOT USE!
@ eIO_Unknown
unknown I/O error (likely fatal but can retry)
@ eIO_InvalidArg
bad argument / parameter value(s) supplied
@ eIO_ReadPlain
read readily available data only, wait if none
@ eIO_ReadPeek
do eIO_ReadPlain but leave data in input queue
@ eIO_ReadPersist
read exactly as much as requested, w/waits
@ eIO_WritePlain
write as much as possible, report back how much
@ eIO_WritePersist
write exactly as much as specified, w/waits
@ eIO_ReadWrite
eIO_Read | eIO_Write (also, eCONN_OnFlush)
@ eIO_Open
also serves as no-event indicator in SOCK_Poll
@ eIO_Close
also serves as an error indicator in SOCK_Poll
unsigned int
A callback function used to compare two keys in a database.
if(yy_accept[yy_current_state])
const struct ncbi::grid::netcache::search::fields::SIZE size
int strcmp(const char *str1, const char *str2)
#define CONN_NOT_NULL(s_c, f_n)
static EIO_Status s_CONN_Read(CONN conn, void *buf, const size_t size, size_t *n_read, int peek)
static EIO_Status s_Open(CONN conn)
static EIO_Status s_CONN_WritePersist(CONN conn, const void *data, const size_t size, size_t *n_written)
static size_t x_CB2IDX(ECONN_Callback type)
static EIO_Status s_CONN_Write(CONN conn, const void *data, const size_t size, size_t *n_written)
#define CONN_LOG(s_c, f_n, lvl, msg)
static EIO_Status s_CONN_ReadPersist(CONN conn, void *buf, const size_t size, size_t *n_read)
static EIO_Status x_CatchallCallback(CONN conn, TCONN_Callback type, void *data)
#define CONN_LOG_EX(subcode, func_name, level, message, status)
#define CONN_NOT_NULL_EX(subcode, func_name, retval)
#define CONN_CALLTRACE(func_name)
#define CONN_TRACE(f_n, msg)
static EIO_Status x_Callback(CONN conn, ECONN_Callback type, unsigned int flag)
static EIO_Status x_Flush(CONN conn, const STimeout *timeout, int isflush)
static EIO_Status x_ReInit(CONN conn, CONNECTOR connector, int close)
struct SConnectionTag SConnection
static size_t x_size(const char *dst, size_t len, const char *ptr)
const char g_kNcbiSockNameAbbr[]
string ReadLine(CNcbiIstream &in)
const STimeout * c_timeout
SCONN_Callback cb[CONN_N_CALLBACKS+1]
const STimeout * o_timeout
const STimeout * w_timeout
const STimeout * r_timeout
voidp calloc(uInt items, uInt size)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4