From 1b2b28c09532481cb18d43a6764001dd85576126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=AE=E5=B8=8C=E5=A4=B7?= <63851587@qq.com> Date: Thu, 9 Dec 2021 06:49:06 +0000 Subject: [PATCH] =?UTF-8?q?!16=20=E5=85=BC=E5=AE=B9Windows=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=20*=20add=20PHP=20extension=20Win=20DLL=20*=20?= =?UTF-8?q?=E5=85=BC=E5=AE=B9Windows=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP/Release/php7.3nts-vc15-php_snowdrift.zip | Bin 0 -> 8882 bytes PHP/Release/php7.4nts-vc15-php_snowdrift.zip | Bin 0 -> 8883 bytes PHP/Release/php8.0nts-vs16-php_snowdrift.zip | Bin 0 -> 9176 bytes PHP/config.w32 | 13 +- PHP/snowdrift.c | 6 +- PHP/src/snowflake/shm.c | 116 +++-- PHP/src/snowflake/snowflake.c | 459 ++++++++++--------- PHP/src/snowflake/spinlock.c | 96 ++-- 8 files changed, 380 insertions(+), 310 deletions(-) create mode 100644 PHP/Release/php7.3nts-vc15-php_snowdrift.zip create mode 100644 PHP/Release/php7.4nts-vc15-php_snowdrift.zip create mode 100644 PHP/Release/php8.0nts-vs16-php_snowdrift.zip diff --git a/PHP/Release/php7.3nts-vc15-php_snowdrift.zip b/PHP/Release/php7.3nts-vc15-php_snowdrift.zip new file mode 100644 index 0000000000000000000000000000000000000000..3eb07efebe2646e32bf4e44b77c6c61074ace1a3 GIT binary patch literal 8882 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 literal 0 HcmV?d00001 diff --git a/PHP/Release/php7.4nts-vc15-php_snowdrift.zip b/PHP/Release/php7.4nts-vc15-php_snowdrift.zip new file mode 100644 index 0000000000000000000000000000000000000000..c34673b291f42fe418da7ae39d6fa2fdfb27eb14 GIT binary patch literal 8883 zcmZ{KWl$VU5M^+82yVfh;ETH^XmEFTcXxLP8rCA+2g#J|!eU13pMtnh)bof)5`h1AO~QQZR0!Ii`O0 zS`BMAPh;2e*)p$g96@@!ytZk}2646n691u5;<*(wpCU4Gyuq9jZR%<{+SNx`>K)e z!d4t^*{bwKbVzcgEAI z_^&UqTyzoG@#K_oW)igcNhxyC3^;!z$(`)9qPFG6tje}P459?zx1^*6?<^?}A~U3Q z7Zk?i$=0bwoyJ!c5e~&MQtQz)=tgUV(v1lL`M0gokkyef6wq1*d@H8ko%758rVEFu zOi`vPhmL8{XEUf#Je7a3P50o;QDI?Sp;P;jI3kPFZj0@wR<8$=0BV%QR2MEyj+Ir^ zkekrQ36RZTyv)-+>e#8{B)V+UJa#%ac~wnA;E<|Dbd-Wg1WLER-LXK9qQm+@G_vIf z2mt1upoF;%Y!+OE<0;m;aps6m16s(utYFD#MnE%=F2rj1!Vh@Mm3=|@8gqf3_34mW zk)CoG)v8bvBCyxwufE93SqLYqrUA@@^nWvc6@OVEPv=NEw4BNc2hWs1ykaVGg46Z`E;D>^|91`Yd8!U7tvBn744 zU&z?%bdgW&Vr)ZFx$5wZe@2uHP!p`?eHjZ@O-l6Tw+RY_i2&aQXeq|@_FoaTk%l`E zE^mavc#auBSbVYsjCl`z!n}VxoAY2k^h8{A44ZVs>TDm}P~72RzWM?N6=fJ)9XR`4{m7EjPZ3 z2K53M;A0dJQjG>v@wSU56-no+c7gyPBWq_+;Tc`Id@jhfY(|m(qAVe~yCX^( zcuR0`8Q_XcG6m4>g`UX$3`K}AibUH;{ii*x4nD!B8c}a#9O+}iTCA zLbw3p@5}g*CPy(1LY(|q+}kb#pX|6>N;YuU1{W3^4>$kE^!$Ep>WF^i{tgj=zr2DQ z%f5CY12zX>P70JYC(?!KIl_Lwa^loFwK;Rc0;BGOzzclC`!E%`A6F1AU@obM9*272 zdSvJ4F!x9hNs(RHBDE6hcmr_cANFZueEnDrg`6|v^%tMZs3Y`WSpQka2tSrZ91yoK zdr8AL_ZVyG=*tE^4?0TC;SsACW=%n@aO*X*WSWtR*SPWcS(G3073@R?r{-CT=C2?UMU^==tjw~b%c8*ntT!?|7o!^%UJ6Qf!N1gHQ+WXe zg=STMymo>XOJvuBFgM9s=(j>5hZA;H`SSAteLu%kw$Q#m=AfR4cMF}ON;eheY5NxR zmK$IdNk5+USmjxPE*1UMaf|-KLDp$O{y6TG9ZARb<}-ail}xw|V}XWPF810eM#NTI z?8R77blraFwG%hA(7Jp_^i->4!N~cl^DjuZ{$qU`a(ol5LAL)$h(g{ji}J6xhjB$P z+?eIOLeQ!<2Un(gHzG!!V5oZc4~p`-XfI0}t-42NkpPo-Nu3-|n!g{N2soBZCdhYW zbr2F~YNv_9N(rCY6EpAVHZr^u?fRxAY?QhPbo7hUNk97BVZ^E0We1$_MV$`A4?4IQ z)k`Q>M$LMYv0@EzR1zk2PV`Qo@3Y~M42PdN!}aG6`PYDKO)r8kkv4O z&W-UujYQ@$K9iZ-9SIc|1%5d9VZjwn3S;S{eEAt|xVsA6r4mQM;r^4E8E5;w`vah!5^YsL2WRJ!oc#_$5*0aM5)EHAsW_yBm!>yofV)3A%W2 zwIpj!Nd7 zKpdVv)s)^M;8}^)8dghd=m1z0@!Ebl@iWO>DerNv6g^O-vzXzRZr8{NE-JsD$dp_0 zMd9j7I=xt7n-Gg>2)ERCy4P+0eDu*pb$- z8i{0n4d9wr)<<~2OJT{ZQop{QXYlUMQz##`ifmdpDgTXGS&oKHWz6)!DJC~xgjM=5 z%M1;u_4--Ml|9B+)brMwu<-V%f2^Rk6Pq3YwCx@SGhBMm1W;Rvk#YzcS1 zC9K>-Kx*RN-eB_jRyd{O>25H&t0PS>)}RX z@i&xUS%Y{f7ZH6N06NLiS7Py|uiUgNT#lhHfpWTF(>|e1KYEk=sZ=#1i|%kH#VMA< zy&{EAZ{qzg@06-cd!FF)&Qv+}YP(#Da@B#qdd3)nuPTPNMn zCSFSrpcGwluUoCO29-shqeK!&Wde*RG{niQp_ii_Kd+qKpHz0t%0@MUs0 zhQ46)!H;^%E)w+(;E1^Po#yqYY9A60C}hp>J7_HZbV&ZED$V_b@)DdZHKHAt{{P+6gpGw&=G_RJfTd^Mq6Bd!d(Z=xKZv~QCX)EeJ{5qhV z!^&Bq-1C+2@m%48t_*NXyj?^SXZpm(7-Y+Pp+``?0`!7s(JK&dxZhy06lq|8m2mJo z+DxHZ;!Qn^d7)eQ9Qy|k2CfS|(5a})#w8RLG`xx9eD6i6gkL7Q@2oQ_YxfFN3d&oZ z&KAU3R@T$>8VnkHVR2HC*%Y-ZVe+<^bT8Ci?u~gP_SqLZ5&N3kdmphclP|W%$%PB* z{eun%V?N0eK36S3;PYHXcJrICJ|X-{9(Jb?Mt9YDr1cRGgj*aqz0F)+PNDU)?db;? z)3Pk5tf&mf)#^FSMc@3vuV$71_Pk&dQ;33NE0<84^i5Q$1~NT)_`I~J-CYiHQ8y*2XL*2(L!X{GG?sXjC$GS2If zkU~u-)vK0jg-cO2@! z%nyd-*%CQ!LEPWWSUmLWzzZS5L55B`g+F%kVvA{=em!2=P6xYs98_E1lRA2FxT*yvS2Ow6MVJY5yoIuaLrA;rNKiMavj@ z%J8uo*~sbh_=IdM`6Mt6Lg2h*9j7KS%U-E-a}Copxg%hH?t$cNi^dW?pGzobBypUHYIqX9iowL*JU{Hz%@49-*b zAssfw_NJ}*^K2HCuBbzHXDI>Z9ky2na}8fBf|-ZC={{r_yxh0Z7PI1=@4HE9+g!v| zy7Xz=94{A)BOYoDF5!Y$%Mb-&#JlxRzuQ)Pccox$;0CaIva9r^5fX2x(6 zRr`f{5c${ug(j|05+(K-k(cs%N?-{H-LVr>_$#UMZ z5DiI6eo%#}|9&nKx(av;xQWXDje1cg2v-6b9_NAGN~~ooPZ1g-BW1qTw!0_WSm6~0UT7@pP2&}#YEVuv^spydVMRZ!Mj zUlk|@=D$GJNKQkR-XY2=7-l$btV!o>;>_I*Au64Sf6~KDX^t4kmeu3~ZWN_K{cRWA z^}il!2n=Ts=O6Sm29Xx9)We^7eKNp5yzZJ${K? zDU{{deLxTPVmEs_CZha!|J@QFHgJgiNxt=_$AtsZk*Ua^-wvfQcBJ2DkcSoE3dV%| zK|ON3EwTTBS)K7gk%luE$0Sq2Y~=Pm%!Il#`4pY@OX*~pelsY`HPm<^%ydr`tK!dL zqh@>$`|)1o&A3>4cyyA3oO4r1WdUVZsb^bA*fp)8lv@#lr0t1`4?SsgP8CFTn#?E#vyz83TME*f~m|E|V zmFaxx-k13KZ@|;iKxLdT%zmBJv|^ypH_k%eZ8+U|ZOhj_ihT<6*mBuCG`%)*au_hv zjTL11ZsdFnkAq8=EV#a#%2QwyS-?KK@1PqD0}nDC9Nslv$C2#e1N<&I^x zB%;}Y!sY9mM#g33Pi8GM5*|yr=tD2`qo>1F3pi%c1bTKVeE0CelZu>mOH}Z=k%&P4 zAoJMpF3a1^**|f+fr~@enwMMSXLHqd!%fks- zToT;ZNO|IN;T-Ib!aPeO^{NJ(*SubR29I9Em(A&T-Di;y$5_C+J?}%Gt?t6JjB+R} zW)r^JnRra6nu(rB?xT6W;p)L?mq{7O?~W8H}E>MHUE0BH_B37>s-GP=gkbM;6lm)cUS3NG|gF{`3#7r zt_>1QhTG4q#-K;|v-||V|1NqHGiZH6?6}KPj{jH`RH*`@Kw>rA@zewT zY4+{Rx|U24Pc!Kx{wG$4sLx`@<6r>dljNxX?wM>177B^~!!QGH%2KZ%AtwsWZ9-2s z%U3oh)sw??n3saH?`L9e?R5z4gZEN$_{5pAPka&l-@^;4!Dl&W|*C=eCG7~Qahc^Oo zpQF!`yNJzizReB~gvE{%xYfm`Y~^tfH&ae^T!H3zQ66V+qN>|fuR8o@IqZ$Cs>~5* zE#9@?dh6cjy{Sv|x*wgDpX-96)Ab7B?o&d11{>i=gmgVAtcuB6uv>O0+o*tjeG=X^ zIJgq(kjYPR*1LqcbjbUUT6Bl5cO`pW**l3VjJPJJVGg3 z=e;6I{5?|d|7@dbeAW-cXHlc15Ht0#AFivy2t7_)&KfMe%1#|GUXv>fw9T5kL zaes{rquZGUVvP@1_~zw>TIaWjjJnW91i4L@`EQ@ff4`|Xv^Gfh^u~tGv-&O$w@84(s`gF098LQ z+tIvfVjth4{fH%9VbLFN|JDA>sfYgYNfVX2&nMc(P$%iky^ktt1bXf>ExH-gYJdt` z77!o1RS^s^OsWjVjS8pz$N(zPe#8LTvHeAEHKTe|^O=FnHbxfw zf544BMCjyjExwQi)1RG}8sfH#0J0cbB*9l}5eueq9EKsHh*x2Ez&iyB7!J91H~F;H z>)AJMJTJuq+rL@y;vjv6%}2&`4u!F0A8m8lE$7V}#wK^G6Gw;?xs3GWfNy1DCvNQK z8s+~A{Aniqza8>mHAQ=Bq?|XN&cS#dFFKB+>epxE|wux~`lPC2?H|O^^0z_xrbUb3Q!&BgUhIdJd zSNI->aakHW-{ULp4Zg<0g+h(75ZdQIP*-90C#4-3^S2iF-%;!Jk9jq|eW|(WS@Lsk z7&>-KH0tvg;iOE(mB+RW`$a;L`l$fZx;1a$s9D+GPQ|ExUT2_pR0ozY zymxA3Ypfj~ADb8(!&9>_9&FBa#b?s6ZURfF%?zzux2-$utRPpak8HcyrCPj9#VVSX zm)a4ZV@`%W=^Hi2)8=tkb#3l-)#tk605)|J2aS)1co$d;UOa5FRf*0wW7;)V4VuwA zOXC<#3EStMSy6pMlM+G7TKZN~6JyzV--RfwK?`>cYYb6r$Dt!l;ZT$IgR~GnrK7q8*bqwT8HxNdWDv)OJvmgRj=>%CVn|U1w#}JbU>x%bb~MqVsFw zs5HK^o*_DPIe4@(P@Xl{R zsw>!VDGmS5!rw#}O-|H<6=dzP27P)V0}^$R;#5nxhIws`H&lmO0FdAng1wWZ!u&}X z8Q4>Xy8yix<2#HjUKj2ki@l$^=jlAtVKCMeL|@%v|0)lzYo=#9w=Jiz67_h;Jjq)s8lSnSg88c!cNt(Vt(F0Lb zC0fIs+KZ&{fWZid(rq5lCEmeEZCpYhR@MeB>L)x#4__;JPe>&+Wv|1CpPno}vPF7K zNtqHyvENYi@XW*Jr|Hu>fv;W882iWXdCJn!WSyp-@>CT^iCF&In;GUELp&_cxvp4cL8;vMVoj*{SX$)fpr5l$ltB{B+IrVJ3$2gZ>7Ws zjAaO`W#R+;R=Pa$6QR@_%B?5Px)1W6eEC+9i)cxy)B?pz$U~ZkBT+k#)K6x&pQj3r z@-^aq9;o&KEk_LSo<7aegSP1++Vo;R8n9Yv&|XtAlrox*#T+?!Vwi=mfN$^`5=C0S2?83=rph9n7mvCG-?kggIf z8`&meoWowX$to5c(&nwTMoqzt;q9u%x4~Yri=aAx*_l-{<7kg~yOdmpy9H;-)CYd2 zhLn$AvZb=8>cz)N{w$RC05m~_#AYy1>+<$Y9ftfNk4zNZi_5Fo&E;#ud&=Gp0zD0u z6X1C%mdPZ;KekCxOj<5l+M0|X_SRQeKkP;a$rnOgO_&GSk!J4fmuOsbf}tPhf*HJh zbHoEKx?rFO>0Ga9#%>`?kn{zIs4`g(ahW?TIUnmM<_XpSSHu%U4y3ml+%0mx*-at$ zOW50z^iDVO=WB;_Z&7=yc3pybo&%2pMk_1>_I;VK&L0qg?fO1*NPB=c=*>n92fW3!gzfZ zr5iG?r7nUNg&blCJPNwbLi~4Q@f+XxJ&(Y&Led!5fIIXg@*b#@JTfA?;m>4=FP%PE@7QenG`~3B+b@myL z>3i;-Mzc@$qDL4g5DTa!}3liUM-BuM5#EOJEFhen3uUGokt)WlNH z=JMOSc)=&td@$w~-8>)Fx}R{7T(L`g3wOB8+9+9kDkA**(RIt84>*OvMLSlvXv8B5b@gUjs6iH`B6 zXp78IL90{h(BU(;^(n%z!w;E*(Z3x;C^$C8IOhjdsC+|X^u>+K2(FdHIP$pg>iv7I z;yBG!YXco)(}n4fxNWR4dPhf7&;9cg^Kv4HqTA@jj=?q{f|TUsr2#GYrj9hh2TDO@ z6X!O~5u4UkjXOBg$hG!?39d~I-)@`*-HJm{haq6AXl!^u#}M+2H?TD~A@e(TolfHD zA*5hB&2vbkQvoZ8u@&9NGqnS}LbTd&RnwlqXXi+-W*C zi?)`{#0+L}SKLy)t6kb4oG}iL1dbhzwrO>Xn(C5ryKcx-kPkQ9#LljXM5u-aUWc(* zC`t*Mn*4mjq1;N|Jy8S0&nB=QQ0>WfFWVEVrdZ1>665>E|DspMP-~0VWfJU z33<6gV>8ZQHNqMMlN4F{3L=n|b?oS{+NxnSufy>25>^sZOVe-L<=DM%%X;>%fD2bf zzt1%Gs<6R0rwC{GCn-$LOl6toQN2*PC>>b?)p}JDJMlt%vgqhaR%aLCMX~az4gTed zM;st+sc;QmB{>gmC2<8-<05bAj6i9>RUVY>QQw5iOugyMcs7NlwRroa@v#B0ppr4V zdwj5iE2W{vD!g*Wrq<|G%8wP$SfCcp)B8NX%^2E$CRskrnCzM}d9kht?F^(wE&g7W z#)fqg&@XZ8Z=CMf@~tr$>L)HBz?DL3dw@TAuzq{LOK(BGKF8UX>_C7~)6mtCq|vsW z7&=@qD^;>JQ1`gJ+)%fec{w&2U6H9ZdU8yeXuWY|@s#QSRTY0SRuc@XJKKgOAg{B_ zFfP!iul0$#@>qpWh4R>lW1T*Siwv~WmibrTg&{!;$&-Be6}tgLJ?$w5d%w}1TnmwL z#7@Qc^NrEIL_Y7xlOOqnCQRQAyr_-ouWFbtE=TKk;ue|COiM2|fat?vbOwT&4i8sm z$A2ycRZ{)+ky19$|9yQh9t*J0QpSl9LF4LzE zUX~pl{Q{hQ&De5vK4)KS+LhO+?9bE2*dnZ3u(}7Nk52EMGB|cVXt$Z_%WjCsaq}oL zGqj4xip52DPeXOrr75R3Z(A8#Yq+XAi6R-4;u5dwoa8aFIz-K)%XEw$oR z^+V-_MYNjNj?5OD)TMaay)N|bYDuV7KK}0Y|5>j=Jw?I%?}fvIl^4BP0sQRLa=Tn@ zwpKS#pRGym4C)-a3fU^}Ty)31GIOh4*X``Ibf3H;?sUIIy|`NQb#iy$UQ4c{aaDND z9T1qxRrR)d;<&V2Yc!s%5h(Z0>`wLG09~zj+S?o0&u;g0hvX7GcTRv>dRmfg(bt$i zb9c_&1IJG4FrUlrR4S DuY^9m literal 0 HcmV?d00001 diff --git a/PHP/Release/php8.0nts-vs16-php_snowdrift.zip b/PHP/Release/php8.0nts-vs16-php_snowdrift.zip new file mode 100644 index 0000000000000000000000000000000000000000..639b86ac013194b7fce06bc0f58e9040ec5b7586 GIT binary patch literal 9176 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 literal 0 HcmV?d00001 diff --git a/PHP/config.w32 b/PHP/config.w32 index 8d6432e..4a8ded4 100644 --- a/PHP/config.w32 +++ b/PHP/config.w32 @@ -1,18 +1,13 @@ -// $Id$ // vim:ft=javascript -// If your extension references something external, use ARG_WITH -// ARG_WITH("snowdrift", "for snowdrift support", "no"); - -// Otherwise, use ARG_ENABLE -ARG_ENABLE("snowdrift", "enable snowdrift support", "no"); +ARG_ENABLE('snowdrift', 'snowdrift support', 'no'); if (PHP_SNOWDRIFT != "no") { + AC_DEFINE('HAVE_SNOWDRIFT', 1, 'snowdrift support enabled'); snowdrift_source_file="snowdrift.c\ src/snowflake/snowflake.c\ src/snowflake/shm.c\ - src/snowflake/spinlock.c - " - EXTENSION("snowdrift", $snowdrift_source_file, PHP_EXTNAME_SHARED, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"); + src/snowflake/spinlock.c" + EXTENSION("snowdrift", snowdrift_source_file, null, '/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1'); } diff --git a/PHP/snowdrift.c b/PHP/snowdrift.c index 94749bc..8cd13e7 100644 --- a/PHP/snowdrift.c +++ b/PHP/snowdrift.c @@ -66,9 +66,8 @@ static int snowdrift_init() shmctx.size = wid_num * sizeof(snowflake); if (shm_alloc(&shmctx) == -1) { - return FAILURE; + return FAILURE; } - bzero(shmctx.addr, wid_num * sizeof(snowflake)); sf = (snowflake *)shmctx.addr; int i; for (i = 0; i < wid_num; i++) @@ -92,7 +91,6 @@ static int snowdrift_init() { return FAILURE; } - bzero(shmctx.addr, sizeof(snowflake)); sf = (snowflake *)shmctx.addr; sf->Method = SD_G(Method); sf->BaseTime = SD_G(BaseTime); @@ -138,7 +136,7 @@ PHP_METHOD(snowdrift, NextNumId) { zend_long num = 1; zend_long wid = SD_G(WorkerId); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l", &num, &wid) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ll", &num, &wid) == FAILURE) { RETURN_FALSE; } diff --git a/PHP/src/snowflake/shm.c b/PHP/src/snowflake/shm.c index 942e5bb..cf3496a 100644 --- a/PHP/src/snowflake/shm.c +++ b/PHP/src/snowflake/shm.c @@ -1,65 +1,105 @@ #include #include #include +#ifdef WIN32 +#include "windows.h" +#else #include +#endif #include "shm.h" -#ifdef MAP_ANON +#ifdef WIN32 +#define NAME "SnowDrift" +static HANDLE hMapFile; -int shm_alloc(struct shm *shm) -{ - shm->addr = (void *)mmap(NULL, shm->size, - PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_SHARED, -1, 0); +int shm_alloc(struct shm* shm) { + hMapFile = CreateFileMapping( + INVALID_HANDLE_VALUE, + NULL, + PAGE_READWRITE, + 0, + shm->size, + NAME + ); + + if (hMapFile == NULL) + { + return 0; + } + + LPVOID pBuffer = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, shm->size); + + if (pBuffer == NULL) + { + CloseHandle(hMapFile); + return 0; + } + memset((char*)pBuffer, 0, shm->size); + shm->addr = (void*)pBuffer; + return 1; +} + +void shm_free(struct shm* shm) { + UnmapViewOfFile(shm->addr); + CloseHandle(hMapFile); +} - if (shm->addr == NULL) - { - return -1; - } +#elif defined(MAP_ANON) - return 0; +int shm_alloc(struct shm* shm) +{ + shm->addr = (void*)mmap(NULL, shm->size, + PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_SHARED, -1, 0); + + if (shm->addr == NULL) + { + return -1; + } + bzero(shm->addr, shm->size); + return 0; } -void shm_free(struct shm *shm) +void shm_free(struct shm* shm) { - if (shm->addr) - { - munmap((void *)shm->addr, shm->size); - } + if (shm->addr) + { + munmap((void*)shm->addr, shm->size); + } } #else -int shm_alloc(struct shm *shm) +int shm_alloc(struct shm* shm) { - int fd; - - fd = open("/dev/zero", O_RDWR); - if (fd == -1) - { - return -1; - } + int fd; - shm->addr = (void *)mmap(NULL, shm->size, - PROT_READ | PROT_WRITE, - MAP_SHARED, fd, 0); + fd = open("/dev/zero", O_RDWR); + if (fd == -1) + { + return -1; + } - close(fd); + shm->addr = (void*)mmap(NULL, shm->size, + PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); - if (shm->addr == NULL) - { - return -1; - } + close(fd); - return 0; + if (shm->addr == NULL) + { + return -1; + } + bzero(shm->addr, shm->size); + return 0; } -void shm_free(struct shm *shm) +void shm_free(struct shm* shm) { - if (shm->addr) - { - munmap((void *)shm->addr, shm->size); - } + if (shm->addr) + { + munmap((void*)shm->addr, shm->size); + } } #endif diff --git a/PHP/src/snowflake/snowflake.c b/PHP/src/snowflake/snowflake.c index ff875ea..d4325cc 100644 --- a/PHP/src/snowflake/snowflake.c +++ b/PHP/src/snowflake/snowflake.c @@ -1,125 +1,127 @@ +#ifdef WIN32 +#include "windows.h" +#include +#else #include #include +#endif #include #include #include "snowflake.h" #include "spinlock.h" -#if defined(WIN32) -#include "windows.h" -#endif - // static void EndOverCostAction(uint64_t useTimeTick, snowflake *flake); -static inline uint64_t NextOverCostId(snowflake *flake); -static inline uint64_t NextNormalId(snowflake *flake); -static inline uint64_t GetCurrentTimeTick(snowflake *flake); -static inline uint64_t GetNextTimeTick(snowflake *flake); -static inline uint64_t CalcId(snowflake *flake); -static inline uint64_t CalcTurnBackId(snowflake *flake); -static inline uint64_t GetCurrentTime(); +static inline uint64_t NextOverCostId(snowflake* flake); +static inline uint64_t NextNormalId(snowflake* flake); +static inline uint64_t GetCurrentTimeTick(snowflake* flake); +static inline uint64_t GetNextTimeTick(snowflake* flake); +static inline uint64_t CalcId(snowflake* flake); +static inline uint64_t CalcTurnBackId(snowflake* flake); +static inline uint64_t GetSysCurrentTime(); int ncpu; uint16_t spin = 2048; uint32_t pid = 0; -void Config(snowflake *flake) +void Config(snowflake* flake) { - if (pid == 0) - { - pid = (uint32_t)getpid(); -#if defined(WIN32) - SYSTEM_INFO sysInfo; - GetSystemInfo(&sysInfo); - ncpu = sysInfo.dwNumberOfProcessors; + if (pid == 0) + { +#ifdef WIN32 + pid = (uint32_t)GetCurrentProcessId(); + SYSTEM_INFO sysInfo; + GetSystemInfo(&sysInfo); + ncpu = sysInfo.dwNumberOfProcessors; #else - ncpu = sysconf(_SC_NPROCESSORS_ONLN); + pid = (uint32_t)getpid(); + ncpu = sysconf(_SC_NPROCESSORS_ONLN); #endif - if (ncpu <= 0) - { - ncpu = 1; - } - } - if (flake->BaseTime == 0) - { - flake->BaseTime = 1582136402000; - } - else if (flake->BaseTime < 631123200000 || flake->BaseTime > GetCurrentTime()) - { - perror("BaseTime error."); - exit(1); - } + if (ncpu <= 0) + { + ncpu = 1; + } + } + if (flake->BaseTime == 0) + { + flake->BaseTime = 1582136402000; + } + else if (flake->BaseTime < 631123200000 || flake->BaseTime > GetSysCurrentTime()) + { + perror("BaseTime error."); + exit(1); + } - // 2.WorkerIdBitLength - if (flake->WorkerIdBitLength <= 0) - { - perror("WorkerIdBitLength error.(range:[1, 21])"); - exit(1); - } - if (flake->SeqBitLength + flake->WorkerIdBitLength > 22) - { - perror("error:WorkerIdBitLength + SeqBitLength <= 22"); - exit(1); - } - else - { - flake->WorkerIdBitLength = flake->WorkerIdBitLength <= 0 ? 6 : flake->WorkerIdBitLength; - } + // 2.WorkerIdBitLength + if (flake->WorkerIdBitLength <= 0) + { + perror("WorkerIdBitLength error.(range:[1, 21])"); + exit(1); + } + if (flake->SeqBitLength + flake->WorkerIdBitLength > 22) + { + perror("error:WorkerIdBitLength + SeqBitLength <= 22"); + exit(1); + } + else + { + flake->WorkerIdBitLength = flake->WorkerIdBitLength <= 0 ? 6 : flake->WorkerIdBitLength; + } - // 3.WorkerId - uint32_t maxWorkerIdNumber = (1 << flake->WorkerIdBitLength) - 1; - if (maxWorkerIdNumber == 0) - { - maxWorkerIdNumber = 63; - } - if (flake->WorkerId < 0 || flake->WorkerId > maxWorkerIdNumber) - { - perror("WorkerId error. (range:[0, {2^WorkerIdBitLength-1]}"); - exit(1); - } + // 3.WorkerId + uint32_t maxWorkerIdNumber = (1 << flake->WorkerIdBitLength) - 1; + if (maxWorkerIdNumber == 0) + { + maxWorkerIdNumber = 63; + } + if (flake->WorkerId < 0 || flake->WorkerId > maxWorkerIdNumber) + { + perror("WorkerId error. (range:[0, {2^WorkerIdBitLength-1]}"); + exit(1); + } - // 4.SeqBitLength - if (flake->SeqBitLength < 2 || flake->SeqBitLength > 21) - { - perror("SeqBitLength error. (range:[2, 21])"); - exit(1); - } - else - { - flake->SeqBitLength = flake->SeqBitLength <= 0 ? 6 : flake->SeqBitLength; - } + // 4.SeqBitLength + if (flake->SeqBitLength < 2 || flake->SeqBitLength > 21) + { + perror("SeqBitLength error. (range:[2, 21])"); + exit(1); + } + else + { + flake->SeqBitLength = flake->SeqBitLength <= 0 ? 6 : flake->SeqBitLength; + } - // 5.MaxSeqNumber - uint32_t maxSeqNumber = (1 << flake->SeqBitLength) - 1; - if (maxSeqNumber == 0) - { - maxSeqNumber = 63; - } - if (flake->MaxSeqNumber > maxSeqNumber) - { - perror("MaxSeqNumber error. (range:[1, {2^SeqBitLength-1}]"); - exit(1); - } - else - { - flake->MaxSeqNumber = flake->MaxSeqNumber <= 0 ? maxSeqNumber : flake->MaxSeqNumber; - } + // 5.MaxSeqNumber + uint32_t maxSeqNumber = (1 << flake->SeqBitLength) - 1; + if (maxSeqNumber == 0) + { + maxSeqNumber = 63; + } + if (flake->MaxSeqNumber > maxSeqNumber) + { + perror("MaxSeqNumber error. (range:[1, {2^SeqBitLength-1}]"); + exit(1); + } + else + { + flake->MaxSeqNumber = flake->MaxSeqNumber <= 0 ? maxSeqNumber : flake->MaxSeqNumber; + } - // 6.MinSeqNumber - if (flake->MinSeqNumber < 5 || flake->MinSeqNumber > maxSeqNumber) - { - perror("MinSeqNumber error. (range:[5, {MinSeqNumber}]"); - exit(1); - } - else - { - flake->MinSeqNumber = flake->MinSeqNumber <= 0 ? 5 : flake->MinSeqNumber; - } + // 6.MinSeqNumber + if (flake->MinSeqNumber < 5 || flake->MinSeqNumber > maxSeqNumber) + { + perror("MinSeqNumber error. (range:[5, {MinSeqNumber}]"); + exit(1); + } + else + { + flake->MinSeqNumber = flake->MinSeqNumber <= 0 ? 5 : flake->MinSeqNumber; + } - // 7.Others - flake->TopOverCostCount = flake->TopOverCostCount <= 0 ? 2000 : flake->TopOverCostCount; - flake->_TimestampShift = flake->WorkerIdBitLength + flake->SeqBitLength; - flake->_CurrentSeqNumber = flake->MinSeqNumber; - flake->Method = flake->Method; + // 7.Others + flake->TopOverCostCount = flake->TopOverCostCount <= 0 ? 2000 : flake->TopOverCostCount; + flake->_TimestampShift = flake->WorkerIdBitLength + flake->SeqBitLength; + flake->_CurrentSeqNumber = flake->MinSeqNumber; + flake->Method = flake->Method; } // static inline void EndOverCostAction(uint64_t useTimeTick, snowflake *flake) @@ -130,160 +132,169 @@ void Config(snowflake *flake) // } // } -static inline uint64_t NextOverCostId(snowflake *flake) +static inline uint64_t NextOverCostId(snowflake* flake) { - uint64_t currentTimeTick = GetCurrentTimeTick(flake); - if (currentTimeTick > flake->_LastTimeTick) - { - // EndOverCostAction(currentTimeTick, flake); - flake->_LastTimeTick = currentTimeTick; - flake->_CurrentSeqNumber = flake->MinSeqNumber; - flake->_IsOverCost = 0; - flake->_OverCostCountInOneTerm = 0; - // flake->_GenCountInOneTerm = 0; - return CalcId(flake); - } - if (flake->_OverCostCountInOneTerm > flake->TopOverCostCount) - { - // EndOverCostAction(currentTimeTick, flake); - flake->_LastTimeTick = GetNextTimeTick(flake); - flake->_CurrentSeqNumber = flake->MinSeqNumber; - flake->_IsOverCost = 0; - flake->_OverCostCountInOneTerm = 0; - // flake->_GenCountInOneTerm = 0; - return CalcId(flake); - } - if (flake->_CurrentSeqNumber > flake->MaxSeqNumber) - { - flake->_LastTimeTick++; - flake->_CurrentSeqNumber = flake->MinSeqNumber; - flake->_IsOverCost = 1; - flake->_OverCostCountInOneTerm++; - // flake->_GenCountInOneTerm++; - return CalcId(flake); - } + uint64_t currentTimeTick = GetCurrentTimeTick(flake); + if (currentTimeTick > flake->_LastTimeTick) + { + // EndOverCostAction(currentTimeTick, flake); + flake->_LastTimeTick = currentTimeTick; + flake->_CurrentSeqNumber = flake->MinSeqNumber; + flake->_IsOverCost = 0; + flake->_OverCostCountInOneTerm = 0; + // flake->_GenCountInOneTerm = 0; + return CalcId(flake); + } + if (flake->_OverCostCountInOneTerm > flake->TopOverCostCount) + { + // EndOverCostAction(currentTimeTick, flake); + flake->_LastTimeTick = GetNextTimeTick(flake); + flake->_CurrentSeqNumber = flake->MinSeqNumber; + flake->_IsOverCost = 0; + flake->_OverCostCountInOneTerm = 0; + // flake->_GenCountInOneTerm = 0; + return CalcId(flake); + } + if (flake->_CurrentSeqNumber > flake->MaxSeqNumber) + { + flake->_LastTimeTick++; + flake->_CurrentSeqNumber = flake->MinSeqNumber; + flake->_IsOverCost = 1; + flake->_OverCostCountInOneTerm++; + // flake->_GenCountInOneTerm++; + return CalcId(flake); + } - // flake->_GenCountInOneTerm++; - return CalcId(flake); + // flake->_GenCountInOneTerm++; + return CalcId(flake); } -static inline uint64_t NextNormalId(snowflake *flake) +static inline uint64_t NextNormalId(snowflake* flake) { - uint64_t currentTimeTick = GetCurrentTimeTick(flake); - if (currentTimeTick < flake->_LastTimeTick) - { - if (flake->_TurnBackTimeTick < 1) - { - flake->_TurnBackTimeTick = flake->_LastTimeTick - 1; - flake->_TurnBackIndex++; - if (flake->_TurnBackIndex > 4) - { - flake->_TurnBackIndex = 1; - } - } - return CalcTurnBackId(flake); - } - if (flake->_TurnBackTimeTick > 0) - { - flake->_TurnBackTimeTick = 0; - } - if (currentTimeTick > flake->_LastTimeTick) - { - flake->_LastTimeTick = currentTimeTick; - flake->_CurrentSeqNumber = flake->MinSeqNumber; - return CalcId(flake); - } - if (flake->_CurrentSeqNumber > flake->MaxSeqNumber) - { - // flake->_TermIndex++; - flake->_LastTimeTick++; - flake->_CurrentSeqNumber = flake->MinSeqNumber; - flake->_IsOverCost = 1; - flake->_OverCostCountInOneTerm = 1; - // flake->_GenCountInOneTerm = 1; - return CalcId(flake); - } - return CalcId(flake); + uint64_t currentTimeTick = GetCurrentTimeTick(flake); + if (currentTimeTick < flake->_LastTimeTick) + { + if (flake->_TurnBackTimeTick < 1) + { + flake->_TurnBackTimeTick = flake->_LastTimeTick - 1; + flake->_TurnBackIndex++; + if (flake->_TurnBackIndex > 4) + { + flake->_TurnBackIndex = 1; + } + } + return CalcTurnBackId(flake); + } + if (flake->_TurnBackTimeTick > 0) + { + flake->_TurnBackTimeTick = 0; + } + if (currentTimeTick > flake->_LastTimeTick) + { + flake->_LastTimeTick = currentTimeTick; + flake->_CurrentSeqNumber = flake->MinSeqNumber; + return CalcId(flake); + } + if (flake->_CurrentSeqNumber > flake->MaxSeqNumber) + { + // flake->_TermIndex++; + flake->_LastTimeTick++; + flake->_CurrentSeqNumber = flake->MinSeqNumber; + flake->_IsOverCost = 1; + flake->_OverCostCountInOneTerm = 1; + // flake->_GenCountInOneTerm = 1; + return CalcId(flake); + } + return CalcId(flake); } -static inline uint64_t GetCurrentTime() +static inline uint64_t GetSysCurrentTime() { - struct timeval t; - gettimeofday(&t, NULL); - return (uint64_t)(t.tv_sec * 1000 + t.tv_usec / 1000); +#ifdef WIN32 + FILETIME file_time; + GetSystemTimeAsFileTime(&file_time); + uint64_t time = ((uint64_t)file_time.dwLowDateTime) + ((uint64_t)file_time.dwHighDateTime << 32); + static const uint64_t EPOCH = ((uint64_t)116444736000000000ULL); + return (uint64_t)((time - EPOCH) / 10000LL); +#else + struct timeval t; + gettimeofday(&t, NULL); + return (uint64_t)(t.tv_sec * 1000 + t.tv_usec / 1000); +#endif + } -static inline uint64_t GetCurrentTimeTick(snowflake *flake) +static inline uint64_t GetCurrentTimeTick(snowflake* flake) { - return GetCurrentTime() - flake->BaseTime; + return GetSysCurrentTime() - flake->BaseTime; } -static inline uint64_t GetNextTimeTick(snowflake *flake) +static inline uint64_t GetNextTimeTick(snowflake* flake) { - uint64_t tempTimeTicker = GetCurrentTimeTick(flake); - while (tempTimeTicker <= flake->_LastTimeTick) - { - tempTimeTicker = GetCurrentTimeTick(flake); - } - return tempTimeTicker; + uint64_t tempTimeTicker = GetCurrentTimeTick(flake); + while (tempTimeTicker <= flake->_LastTimeTick) + { + tempTimeTicker = GetCurrentTimeTick(flake); + } + return tempTimeTicker; } -static inline uint64_t CalcId(snowflake *flake) +static inline uint64_t CalcId(snowflake* flake) { - uint64_t result = (flake->_LastTimeTick << flake->_TimestampShift) + (flake->WorkerId << flake->SeqBitLength) + (flake->_CurrentSeqNumber); - flake->_CurrentSeqNumber++; - return result; + uint64_t result = (flake->_LastTimeTick << flake->_TimestampShift) + (flake->WorkerId << flake->SeqBitLength) + (flake->_CurrentSeqNumber); + flake->_CurrentSeqNumber++; + return result; } -static inline uint64_t CalcTurnBackId(snowflake *flake) +static inline uint64_t CalcTurnBackId(snowflake* flake) { - uint64_t result = (flake->_LastTimeTick << flake->_TimestampShift) + (flake->WorkerId << flake->SeqBitLength) + (flake->_TurnBackTimeTick); - flake->_TurnBackTimeTick--; - return result; + uint64_t result = (flake->_LastTimeTick << flake->_TimestampShift) + (flake->WorkerId << flake->SeqBitLength) + (flake->_TurnBackTimeTick); + flake->_TurnBackTimeTick--; + return result; } -static inline uint64_t NextSonwId(snowflake *flake) +static inline uint64_t NextSonwId(snowflake* flake) { - uint64_t currentTimeTick = GetCurrentTimeTick(flake); - if (flake->_LastTimeTick == currentTimeTick) - { - flake->_CurrentSeqNumber++; - if (flake->_CurrentSeqNumber > flake->MaxSeqNumber) - { - flake->_CurrentSeqNumber = flake->MinSeqNumber; - currentTimeTick = GetNextTimeTick(flake); - } - } - else - { - flake->_CurrentSeqNumber = flake->MinSeqNumber; - } - flake->_LastTimeTick = currentTimeTick; - return (uint64_t)((currentTimeTick << flake->_TimestampShift) | (flake->WorkerId << flake->SeqBitLength) | flake->_CurrentSeqNumber); + uint64_t currentTimeTick = GetCurrentTimeTick(flake); + if (flake->_LastTimeTick == currentTimeTick) + { + flake->_CurrentSeqNumber++; + if (flake->_CurrentSeqNumber > flake->MaxSeqNumber) + { + flake->_CurrentSeqNumber = flake->MinSeqNumber; + currentTimeTick = GetNextTimeTick(flake); + } + } + else + { + flake->_CurrentSeqNumber = flake->MinSeqNumber; + } + flake->_LastTimeTick = currentTimeTick; + return (uint64_t)((currentTimeTick << flake->_TimestampShift) | (flake->WorkerId << flake->SeqBitLength) | flake->_CurrentSeqNumber); } -static inline uint64_t GetId(snowflake *flake) +static inline uint64_t GetId(snowflake* flake) { - return flake->Method == 1 ? (flake->_IsOverCost != 0 ? NextOverCostId(flake) : NextNormalId(flake)) : NextSonwId(flake); + return flake->Method == 1 ? (flake->_IsOverCost != 0 ? NextOverCostId(flake) : NextNormalId(flake)) : NextSonwId(flake); } -uint64_t NextId(snowflake *flake) +uint64_t NextId(snowflake* flake) { - spin_lock(&flake->_Lock, pid); - uint64_t id = GetId(flake); - spin_unlock(&flake->_Lock, pid); - return id; + spin_lock(&flake->_Lock, pid); + uint64_t id = GetId(flake); + spin_unlock(&flake->_Lock, pid); + return id; } -uint64_t *NextNumId(snowflake *flake, uint32_t num) +uint64_t* NextNumId(snowflake* flake, uint32_t num) { - uint64_t *arr = (uint64_t *)malloc(sizeof(uint64_t) * num); - spin_lock(&flake->_Lock, pid); - uint32_t i; - for (i = 0; i < num; i++) - { - arr[i] = GetId(flake); - } - spin_unlock(&flake->_Lock, pid); - return arr; + uint64_t* arr = (uint64_t*)malloc(sizeof(uint64_t) * num); + spin_lock(&flake->_Lock, pid); + uint32_t i; + for (i = 0; i < num; i++) + { + arr[i] = GetId(flake); + } + spin_unlock(&flake->_Lock, pid); + return arr; } diff --git a/PHP/src/snowflake/spinlock.c b/PHP/src/snowflake/spinlock.c index 7a2de49..977a409 100644 --- a/PHP/src/snowflake/spinlock.c +++ b/PHP/src/snowflake/spinlock.c @@ -1,47 +1,73 @@ #include +#ifdef WIN32 +#include "windows.h" +#else #include +#endif + #include "spinlock.h" extern int ncpu; extern int spin; -void spin_lock(atomic_t *lock, uint32_t pid) +void spin_lock(atomic_t* lock, uint32_t pid) { - int i, n; - - for (;;) - { - - if (*lock == 0 && - __sync_bool_compare_and_swap(lock, 0, pid)) - { - return; - } - - if (ncpu > 1) - { - - for (n = 1; n < spin; n <<= 1) - { - - for (i = 0; i < n; i++) - { - __asm("pause"); - } - - if (*lock == 0 && - __sync_bool_compare_and_swap(lock, 0, pid)) - { - return; - } - } - } - - sched_yield(); - } + int i, n; + + for (;;) + { + + if (*lock == 0 && +#ifdef WIN32 + InterlockedCompareExchange(lock, pid, 0) == 0 +#else + __sync_bool_compare_and_swap(lock, 0, pid) +#endif + ) + { + return; + } + + if (ncpu > 1) + { + + for (n = 1; n < spin; n <<= 1) + { + + for (i = 0; i < n; i++) + { +#ifdef WIN32 + MemoryBarrier(); +#else + __asm("pause"); +#endif + } + + if (*lock == 0 && +#ifdef WIN32 + InterlockedCompareExchange(lock, pid, 0) == 0 +#else + __sync_bool_compare_and_swap(lock, 0, pid) +#endif + ) + { + return; + } + } + } +#ifdef WIN32 + SwitchToThread(); +#else + sched_yield(); +#endif + } } -void spin_unlock(atomic_t *lock, uint32_t pid) +void spin_unlock(atomic_t* lock, uint32_t pid) { - __sync_bool_compare_and_swap(lock, pid, 0); +#ifdef WIN32 + InterlockedCompareExchange(lock, 0, pid); +#else + __sync_bool_compare_and_swap(lock, pid, 0); +#endif }