コード例 #1
0
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;
}
コード例 #2
0
ファイル: tbusapi.c プロジェクト: TracyHu/TSF4G
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;
	}
}
コード例 #3
0
ファイル: tconnd_listen.c プロジェクト: CuriousBoy0822/TSF4G
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;
}