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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 ANdN!< literal 0 KcmV+b0RR6000031 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 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 BKD__{ literal 0 KcmV+b0RR6000031 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 KcmV+b0RR6000031 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 }