Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

向下兼容 Windows XP系统, 使用vc141_xp平台工具集编译通过. #606

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions base/hatomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,14 @@ static inline bool atomic_flag_test_and_set(atomic_flag* p) {
return InterlockedCompareExchange((LONG*)&p->_Value, 1, 0);
}

#define ATOMIC_ADD InterlockedAdd
#define ATOMIC_SUB(p, n) InterlockedAdd(p, -n)
#if WINVER > 0x0600
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

严格来讲应该是>=0x0600,0x0600是Windows Vista,也是有InterlockedAdd的

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

嗯,了解, 但 vs 选择 vc141_xp 的时候, WINVER 的值就是 0x600 . 所以我取了这个值。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里暂时不合并吧, libhv 里面使用了太多的 windows xp没有的API函数。 要让其真正兼容windows xp 工作量不小。
本次虽然能在 vc141_xp 下编译通过,但在xp系统中运行 有很多函数都没有。
inet_ntop inet_pton GetTickCount64 SetFileCompletionNotificationModes InitializeSRWLock AcquireSRWLockShared ReleaseSRWLockShared AcquireSRWLockExclusive ReleaseSRWLockExclusive 等.

#define ATOMIC_ADD InterlockedAdd
#define ATOMIC_SUB(p, n) InterlockedAdd(p, -n)
#else
#define ATOMIC_ADD(p, n) (InterlockedExchangeAdd(p, n) + n)
#define ATOMIC_SUB(p, n) (InterlockedExchangeAdd(p, -n) - n)
#endif

#define ATOMIC_INC InterlockedIncrement
#define ATOMIC_DEC InterlockedDecrement

Expand Down
12 changes: 12 additions & 0 deletions event/wepoll/wepoll.c
Original file line number Diff line number Diff line change
Expand Up @@ -1552,15 +1552,23 @@ static void reflock__await_event(void* address) {
}

void reflock_ref(reflock_t* reflock) {
#if WINVER > 0x0600
long state = InterlockedAdd(&reflock->state, REFLOCK__REF);
#else
long state = InterlockedExchangeAdd(&reflock->state, REFLOCK__REF) + REFLOCK__REF;
#endif

/* Verify that the counter didn't overflow and the lock isn't destroyed. */
assert((state & REFLOCK__DESTROY_MASK) == 0);
unused_var(state);
}

void reflock_unref(reflock_t* reflock) {
#if WINVER > 0x0600
long state = InterlockedAdd(&reflock->state, -REFLOCK__REF);
#else
long state = InterlockedExchangeAdd(&reflock->state, -REFLOCK__REF) - REFLOCK__REF;
#endif

/* Verify that the lock was referenced and not already destroyed. */
assert((state & REFLOCK__DESTROY_MASK & ~REFLOCK__DESTROY) == 0);
Expand All @@ -1570,8 +1578,12 @@ void reflock_unref(reflock_t* reflock) {
}

void reflock_unref_and_destroy(reflock_t* reflock) {
#if WINVER > 0x0600
long state =
InterlockedAdd(&reflock->state, REFLOCK__DESTROY - REFLOCK__REF);
#else
long state = InterlockedExchangeAdd(&reflock->state, REFLOCK__DESTROY - REFLOCK__REF) + (REFLOCK__DESTROY - REFLOCK__REF);
#endif
long ref_count = state & REFLOCK__REF_MASK;

/* Verify that the lock was referenced and not already destroyed. */
Expand Down
Loading