void tlog_appender_shm_log(tlog_appender_shm_t *self, const tlog_config_appender_shm_t *config, const tlog_message_t *message) { tbus_atomic_size_t tbus_writer_size; char *ptr; tlibc_binary_writer_t bwriter; tbus_writer_size = tbus_send_begin(self->otb, &ptr); if(tbus_writer_size < sizeof(tlog_message_t)) { fprintf(stderr, "shm_log[%d] throw the log: %s\n", config->output_tbuskey, message->msg); goto done; } tlibc_binary_writer_init(&bwriter, ptr, tbus_writer_size); if(tlibc_write_tlog_message(&bwriter.super, message) != E_TLIBC_NOERROR) { goto done; } tbus_send_end(self->otb, bwriter.offset); return; done: return; }
bool tbusapi_send(tbusapi_t *self, const void *data) { char *buf = NULL; tbus_atomic_size_t buf_size; tbus_atomic_size_t code_size; buf_size = tbus_send_begin(self->otb, &buf); code_size = (tbus_atomic_size_t)self->encode(data, buf, buf + buf_size); if(code_size > 0) { tbus_send_end(self->otb, code_size); return true; } else { return false; } }
tlibc_error_code_t tconnd_listen() { int ret = E_TLIBC_NOERROR; tconnd_socket_t *conn_socket; int socketfd; socklen_t cnt_len; struct sockaddr_in sockaddr; tbus_atomic_size_t tbus_writer_size; sip_req_t *pkg; int nb; //1, 检查tbus是否能发送新的连接包 tbus_writer_size = tbus_send_begin(g_output_tbus, (char**)&pkg); if(tbus_writer_size < sizeof(sip_req_t)) { // WARN_LOG("tbus_send_begin return E_TLIBC_TBUS_NOT_ENOUGH_SPACE"); ret = E_TLIBC_TBUS_NOT_ENOUGH_SPACE; goto done; } //2, 检查是否能分配socket if(tlibc_mempool_over(&g_socket_pool)) { ERROR_LOG("g_socket_pool.sn [%"PRIu64"] == tm_invalid_id", g_socket_pool.sn); ret = E_TLIBC_ERROR; goto done; } if(tlibc_mempool_empty(&g_socket_pool)) { ret = E_TLIBC_TOO_MANY_SOCKET; goto done; } memset(&sockaddr, 0, sizeof(struct sockaddr_in)); cnt_len = sizeof(struct sockaddr_in); again: socketfd = accept(g_listen.socketfd, (struct sockaddr *)&sockaddr, &cnt_len); if(socketfd == -1) { switch(errno) { case EAGAIN: break; case EINTR: goto again; default: ERROR_LOG("accept errno[%d], %s.", errno, strerror(errno)); break; } ret = E_TLIBC_ERRNO; goto done; } nb = 1; if(ioctl(socketfd, FIONBIO, &nb) == -1) { ret = E_TLIBC_ERRNO; goto close_socket; } conn_socket = tconnd_socket_new(); conn_socket->socketfd = socketfd; conn_socket->pending_ticks = g_cur_ticks + g_config.accept_ticks_limit; tlibc_list_add_tail(&conn_socket->g_pending_socket_list, &g_pending_socket_list); conn_socket->status = e_tconnd_socket_status_syn_sent; //5, 发送连接的通知 pkg->cmd = e_sip_req_cmd_connect; pkg->cid.sn = conn_socket->mempool_entry.sn; pkg->cid.id = conn_socket->id; pkg->size = 0; conn_socket->status = e_tconnd_socket_status_syn_sent; tbus_send_end(g_output_tbus, sizeof(sip_req_t)); DEBUG_LOG("[%u, %"PRIu64"] connect.", pkg->cid.id, pkg->cid.sn); done: return ret; close_socket: if(close(socketfd) != 0) { ERROR_LOG("close [%d] return errno [%d], %s.", socketfd, errno, strerror(errno)); } return ret; }