dpull / skynet-mingw

对skynet无任何改动的windows版
http://blog.dpull.com/post/2015-11-08-skynet_mingw
MIT License
307 stars 126 forks source link

增加mingw64编译环境支持,以编译64位skynet #8

Closed lailongwei closed 3 years ago

lailongwei commented 7 years ago

集中于以下三个修改 所有修改都已在自身的mingw32、mingw64环境中测试通过

epoll增加64位兼容:

epoll.h/epoll.c:epoll_fd实现在32位下为将epoll_fd 强转为int返回,在64位下,会导致错误,代码中也有`assert(sizeof(struct epoll_fd ) <= sizeof(int))`判断,新的修改为增加一个映射数组,只在64位下启用,在epoll_create返回前,将epoll_fd放入到数组,只返回数组下标,即一个int类型。


编译Makefile修改:

64位的mingw环境为直接已经编译好的环境,编译时,发现缺少dlfcn动态库头文件及库文件,使用github中的三方封装完成,dlfcn-win32,直接在mingw64环境中./configure && make && make install即可。 修改后的Makefile会自动判别是编译64位的skynet还是32位的skynet,从而决定是否额外链接dl库及psapi库。


pthread_cond BUG修复:

64位的mingw环境中自带的libwinpthread库存在pthread_cond_signal死锁问题,网上无法找到比较新的代替品,使用自身库中的condition实现替代,在platform/skynet_condition.h platform/skynet_condition.c中实现,在32位下,不使用此实现,只在64位下使用这两个文件中的代码定义实现pthread_cond功能,新的cond类型为skynet_cond_t,对应的函数为skynet_cond_xxxx(),这个会修改skynet_start.c文件,已经在prepare.sh中自动完成注入及修改,不需要使用者关心有此修补包存在。


prepare.sh修改:

原有的ln -f xxx xxx的重复操作修改为直接定义一个数组,for each完成ln操作,增加对skynet_start.c代码的自动修改、注入代码(第三点有说明)。

dpull commented 7 years ago

赞,不过没办法自动合并,麻烦处理一下.

我在6月3日的时候有个对makefile的修改,导致冲突了

dpull commented 7 years ago

epoll增加64位兼容:

  1. 可以全部使用epoll_fd 转 指针的设计,无需用宏分开
  2. 建议使用循环数组,参考fd的设计,当释放后设置为NULL,创建时循环查询
  3. 初始epoll_fd数组不需要10,1个即可,通常应用里面不会有多个epoll

pthread_cond BUG修复:

  1. 建议修改pthread的部分函数实现,放入platform.dll,或者模仿pthread 实现一个lib,链接的时候使用自己实现的pthread lib
dpull commented 6 years ago

epoll支持64位代码已经合并了