/*
* Copyright (c) 1998-2014 Caucho Technology -- all rights reserved
*
* @author Scott Ferguson
*/
#ifdef WIN32
#ifndef _WINSOCKAPI_
#define _WINSOCKAPI_
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <MSWSock.h>
#include <io.h>
#else
#define _GNU_SOURCE
#include <sys/param.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/resource.h>
#include <dirent.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#ifdef EPOLL
#include <sys/epoll.h>
#endif
#ifdef POLL
#include <sys/poll.h>
#else
#include <sys/select.h>
#endif
#include <pwd.h>
#include <syslog.h>
#include <netdb.h>
#ifdef HAS_SENDFILE
#include <sys/sendfile.h>
#endif
#endif
#ifdef linux
#include <linux/version.h>
#endif
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
/* probably system-dependent */
#include <jni.h>
#include <fcntl.h>
#ifdef linux
#include <sys/uio.h>
#endif
#include "resin_os.h"
#define STACK_BUFFER_SIZE (16 * 1024)
void
cse_log(char *fmt, ...)
{
#ifdef DEBUG
va_list list;
va_start(list, fmt);
vfprintf(stderr, fmt, list);
va_end(list);
#endif
}
static char *
q_strdup(char *str)
{
size_t len = strlen(str);
char *dup = cse_malloc(len + 1);
strcpy(dup, str);
return dup;
}
JNIEXPORT jlong JNICALL
Java_com_caucho_vfs_JniSocketImpl_nativeAllocate(JNIEnv *env,
jobject obj)
{
connection_t *conn;
conn = (connection_t *) malloc(sizeof(connection_t));
memset(conn, 0, sizeof(connection_t));
conn->fd = -1;
conn->client_sin = (struct sockaddr *) conn->client_data;
conn->server_sin = (struct sockaddr *) conn->server_data;
conn->ops = &std_ops;
#ifdef WIN32
// conn->event = WSACreateEvent();
#endif
return (jlong) (PTR) conn;
}
static int
resin_get_byte_array_region(JNIEnv *env,
jbyteArray j_buf,
jint offset,
jint sublen,
char *c_buf)
{
/* JDK uses GetByteArrayRegion */
(*env)->GetByteArrayRegion(env, j_buf, offset, sublen, (void*) c_buf);
/*
jbyte *cBuf = (*env)->GetPrimitiveArrayCritical(env, j_buf, 0);
if (! cBuf)
return 0;
memcpy(c_buf, cBuf + offset, sublen);
(*env)->ReleasePrimitiveArrayCritical(env, j_buf, cBuf, 0);
*/
return 1;
}
static int
resin_tcp_nodelay(connection_t *conn)
{
int fd = conn->fd;
int flag = 1;
int result;
result = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY,
(char *) &flag, sizeof(int));
return result;
}
static int
resin_tcp_cork(connection_t *conn)
{
#ifdef TCP_CORK
int fd = conn->fd;
int flag = 1;
int result;
if (! conn->tcp_cork || conn->is_cork) {
return;
}
conn->is_cork = 1;
result = setsockopt(fd, IPPROTO_TCP, TCP_CORK,
(char *) &flag, sizeof(int));
return result;
#else
return 1;
#endif
}
static int
resin_tcp_uncork(connection_t *conn)
{
#ifdef TCP_CORK
int fd = conn->fd;
int flag = 0;
int result;
if (! conn->tcp_cork || ! conn->is_cork) {
return;
}
conn->is_cork = 0;
result = setsockopt(fd, IPPROTO_TCP, TCP_CORK,
(char *) &flag, sizeof(int));
return result;
#else
return 1;
#endif
}
JNIEXPORT jint JNICALL
Java_com_caucho_vfs_JniSocketImpl_readNative(JNIEnv *env,
jobject obj,
jlong conn_fd,
jbyteArray buf,
jint offset,
jint length,
jlong timeout_ms)
{
connection_t *conn = (connection_t *) (PTR) conn_fd;
int sublen;
char buffer[STACK_BUFFER_SIZE];
char *temp_buf;
if (! conn || conn->fd <= 0 || ! buf) {
return -1;
}
conn->jni_env = env;
if (length < STACK_BUFFER_SIZE)
sublen = length;
else
sublen = STACK_BUFFER_SIZE;
sublen = conn->ops->read(conn, buffer, sublen, (int) timeout_ms);
/* Should probably have a different response for EINTR */
if (sublen <= 0) {
return sublen;
}
if (length < sublen) {
sublen = length;
}
resin_set_byte_array_region(env, buf, offset, sublen, buffer);
return sublen;
}
JNIEXPORT jint JNICALL
Java_com_caucho_vfs_JniStream_readNonBlockNative(JNIEnv *env,
jobject obj,
jlong conn_fd,
jbyteArray buf,
jint offset,
jint length)
{
connection_t *conn = (connection_t *) (PTR) conn_fd;
int sublen;
char buffer[STACK_BUFFER_SIZE];
if (! conn || conn->fd <= 0 || ! buf) {
return -1;
}
conn->jni_env = env;
if (length < STACK_BUFFER_SIZE)
sublen = length;
else
sublen = STACK_BUFFER_SIZE;
sublen = conn->ops->read_nonblock(conn, buffer, sublen);
/* Should probably have a different response for EINTR */
if (sublen < 0)
return sublen;
resin_set_byte_array_region(env, buf, offset, sublen, buffer);
return sublen;
}
JNIEXPORT jint JNICALL
Java_com_caucho_vfs_JniSocketImpl_writeNative(JNIEnv *env,
jobject obj,
jlong conn_fd,
jbyteArray j_buf,
jint offset,
jint length)
{
connection_t *conn = (connection_t *) (PTR) conn_fd;
char buffer[STACK_BUFFER_SIZE];
char *c_buf;
int sublen;
int write_length = 0;
int result;
if (! conn || conn->fd <= 0 || ! j_buf) {
return -1;
}
conn->jni_env = env;
/*
resin_tcp_cork(conn);
*/
while (length > 0) {
jbyte *cBuf;
if (length < sizeof(buffer))
sublen = length;
else
sublen = sizeof(buffer);
resin_get_byte_array_region(env, j_buf, offset, sublen, buffer);
result = conn->ops->write(conn, buffer, sublen);
if (result == length) {
return result + write_length;
}
else if (result < 0) {
/*
fprintf(stdout, "write-ops: write result=%d errno=%d\n",
result, errno);
fflush(stdout);
*/
return result;
}
length -= result;
offset += result;
write_length += result;
}
return write_length;
}
#undef HAS_SPLICE
#ifdef HAS_SPLICE
static int
write_splice(connection_t *conn,
jlong mmap_address,
int sublen)
{
struct iovec io;
int result;
int fd = conn->fd;
int write_len = 0;
if (fd < 0) {
return -1;
}
if (conn->ssl_sock) {
return conn->ops->write(conn,
(void*) (PTR) (mmap_address),
sublen);
}
io.iov_base = (void*) (mmap_address);
io.iov_len = sublen;
if (conn->pipe[0] <= 0) {
if (pipe(conn->pipe) < 0) {
fprintf(stderr, "BADPIPE\n");
}
}
sublen = vmsplice(conn->pipe[1], &io, 1, SPLICE_F_MOVE);
if (sublen < 0) {
if (errno != EAGAIN && errno != ECONNRESET && errno != EPIPE) {
fprintf(stderr, "vmsplice addr:%lx result:%d %d\n",
mmap_address,
sublen, errno);
}
return -1;
}
write_len = 0;
while (write_len < sublen) {
int delta = sublen - write_len;
result = splice(conn->pipe[0], 0, fd, 0, delta,
SPLICE_F_MOVE|SPLICE_F_MORE);
if (result <= 0) {
if (errno != EAGAIN && errno != ECONNRESET && errno != EPIPE) {
fprintf(stderr, "splice result:%d pipe:%d fd:%d addr:%lx errno:%d\n",
result, conn->pipe[0], fd, mmap_address, errno);
}
return -1;
}
write_len += result;
}
return sublen;
}
#else
static int
write_splice(connection_t *conn,
long mmap_address,
int sublen)
{
return conn->ops->write(conn,
(void*) (PTR) (mmap_address),
sublen);
}
#endif
JNIEXPORT jint JNICALL
Java_com_caucho_vfs_JniSocketImpl_writeMmapNative(JNIEnv *env,
jobject obj,
jlong conn_fd,
jlong mmap_address,
jlongArray mmap_blocks_arr,
关于泛微ecology9 Resin4
需积分: 0 116 浏览量
更新于2023-07-19
收藏 22.65MB ZIP 举报
泛微 Ecology9 是一款企业级协同办公系统,它集成了工作流、知识管理、报表分析等多种功能,旨在提升企业的效率和协作能力。Resin 4 是一个高性能的Java应用服务器,常被用作Web服务器和应用服务器,尤其在处理大量并发请求时表现出色。在泛微 Ecology9 中,Resin 4 被用作运行环境,为系统提供稳定、高效的运行平台。
Resin 4 的主要特性包括:
1. **高性能**: Resin 4 采用高效的线程模型和内存管理机制,能够处理高并发请求,确保在繁忙的工作环境中仍然保持快速响应。
2. **内置HTTP服务器**: Resin 4 内置了HTTP服务器,可以快速部署和管理Web应用程序,支持静态内容的高效服务。
3. **JSP/Servlet 支持**: 它完全兼容JSP 2.0和Servlet 2.5规范,提供对Java Web应用的强大支持。
4. **缓存技术**: Resin 4 引入了智能缓存系统,可以缓存静态资源和动态内容,减少数据库访问,提高响应速度。
5. **集群和负载均衡**: 支持集群部署,通过负载均衡策略分发请求,增强系统的可用性和容错性。
6. **安全管理**: 提供多种安全控制机制,如SSL加密、身份验证和授权,保障企业应用的安全运行。
7. **性能监控**: 内置的管理工具和日志系统,可以帮助管理员实时监控服务器状态,及时发现和解决问题。
在泛微 Ecology9 中,Resin 4 的作用如下:
1. **应用容器**: 作为Ecology9的运行环境,Resin 4 提供了一个平台来运行和管理系统的Java组件,如服务、控制器等。
2. **Web服务**: 提供Web服务器功能,使得用户可以通过浏览器访问和交互Ecology9的各种功能。
3. **数据处理**: 与数据库进行交互,处理业务逻辑,实现数据的存储和查询。
4. **负载均衡**: 在多实例部署的情况下,Resin 4 可以实现负载均衡,保证系统的稳定运行。
5. **故障恢复**: 当单个节点出现故障时,集群中的其他节点可以接管工作,保证服务不间断。
在部署和维护泛微 Ecology9 时,了解并掌握Resin 4 的配置、优化和故障排查技巧至关重要。这包括但不限于调整线程池大小、优化缓存设置、监控资源消耗以及正确配置集群策略等。熟悉这些知识将有助于确保Ecology9系统的高效、稳定运行,为企业带来更好的协同办公体验。
jackleeonlyone
- 粉丝: 75
- 资源: 10
最新资源
- 脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果 bldc控制器方案,无刷电机 提供源码,原理图
- Matlab Simulink#直驱永磁风电机组并网仿真模型 基于永磁直驱式风机并网仿真模型 采用背靠背双PWM变流器,先整流,再逆变 不仅实现电机侧的有功、无功功率的解耦控制和转速调节,而且能实
- 157389节奏盒子地狱模式第三阶段7.apk
- 操作系统实验ucore lab3
- DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题 下面我将对程序进行详
- final_work_job1(1).sql
- 区块链与联邦学习结合:FedChain项目详细复现指南
- 西门子S7 和 S7 Plus 协议开发示例
- 模块化多电平变流器 MMC 的VSG控制 同步发电机控制 MATLAB–Simulink仿真模型 5电平三相MMC,采用VSG控制 受端接可编辑三相交流源,直流侧接无穷大电源提供调频能量 设置频率
- 基于小程序的智慧校园管理系统源代码(java+小程序+mysql+LW).zip