class PollArrayWrapper {
//用户存储文件描述符数组的native空间
private AllocatedNativeObject pollArray;
//上述内存空间的地址
long pollArrayAddress;
//每条记录所占空间大小为8个字节
static short SIZE_POLLFD = 8;
//每条记录中文件描述符的相对起始偏移量
private static final short FD_OFFSET = 0;
//每条记录中事件掩码的相对起始偏移量
private static final short EVENT_OFFSET = 4;
//数组大小
private int size;
...
}
pollArrayWrapper对象使用使用native数组存放文件描述符和事件掩码,并将这块内存的地址保存到pollArrayAddress中,在调用poll时将该地址传递给JNI。
对象对外提供了有关FD、Event方法。
每个文件8字节
//添加文件描述符
void putDescriptor(int var1, int var2) {
this.pollArray.putInt(SIZE_POLLFD * var1 + 0, var2);
}
//添加事件掩码
void putEventOps(int var1, int var2) {
this.pollArray.putShort(SIZE_POLLFD * var1 + 4, (short)var2);
}
//获取事件掩码
int getEventOps(int var1) {
return this.pollArray.getShort(SIZE_POLLFD * var1 + 4);
}
//获取文件描述符
int getDescriptor(int var1) {
return this.pollArray.getInt(SIZE_POLLFD * var1 + 0);
}
在pollArray中,每条记录占8个字节,前四个字节存放文件描述符,接着使用两个字节存放等待事件的掩码,最后两个字节存放事件发生事件的掩码(目前未使用)
事件掩码
AllocatedNativeObject
NativeObject![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/27d94aebbf9d41e8ee0efd51cba9da33.png)
addWakeupSocket
把wakeupSourceFd加到PoolWrapper中。至此selector创建完毕。