kernel/smp: change CPUSet::SetBit() and CPUSet::ClearBit() bit order
add CPUSet::And() and CPUSet::Matches(). Change-Id: I210c900527f6ee246916d5eb4547d8003c2bc631 Reviewed-on: https://review.haiku-os.org/c/haiku/+/7673 Reviewed-by: waddlesplash <[email protected]> Tested-by: Commit checker robot <[email protected]> Haiku-Format: Haiku-format Bot <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
75a70554d9
commit
1dde4c4b94
@@ -55,10 +55,15 @@ public:
|
|||||||
|
|
||||||
inline bool GetBit(int32 cpu) const;
|
inline bool GetBit(int32 cpu) const;
|
||||||
|
|
||||||
|
inline bool Matches(const CPUSet& mask) const;
|
||||||
|
inline CPUSet And(const CPUSet& mask) const;
|
||||||
|
|
||||||
inline bool IsEmpty() const;
|
inline bool IsEmpty() const;
|
||||||
|
|
||||||
|
inline uint32 Bits(uint32 index) const { return fBitmap[index];}
|
||||||
private:
|
private:
|
||||||
static const int kArraySize = ROUNDUP(SMP_MAX_CPUS, 32) / 32;
|
static const int kArrayBits = 32;
|
||||||
|
static const int kArraySize = ROUNDUP(SMP_MAX_CPUS, kArrayBits) / kArrayBits;
|
||||||
|
|
||||||
uint32 fBitmap[kArraySize];
|
uint32 fBitmap[kArraySize];
|
||||||
};
|
};
|
||||||
@@ -125,40 +130,62 @@ CPUSet::SetAll()
|
|||||||
inline void
|
inline void
|
||||||
CPUSet::SetBit(int32 cpu)
|
CPUSet::SetBit(int32 cpu)
|
||||||
{
|
{
|
||||||
int32* element = (int32*)&fBitmap[cpu % kArraySize];
|
int32* element = (int32*)&fBitmap[cpu / kArrayBits];
|
||||||
*element |= 1u << (cpu / kArraySize);
|
*element |= 1u << (cpu % kArrayBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
CPUSet::ClearBit(int32 cpu)
|
CPUSet::ClearBit(int32 cpu)
|
||||||
{
|
{
|
||||||
int32* element = (int32*)&fBitmap[cpu % kArraySize];
|
int32* element = (int32*)&fBitmap[cpu / kArrayBits];
|
||||||
*element &= ~uint32(1u << (cpu / kArraySize));
|
*element &= ~uint32(1u << (cpu % kArrayBits));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
CPUSet::SetBitAtomic(int32 cpu)
|
CPUSet::SetBitAtomic(int32 cpu)
|
||||||
{
|
{
|
||||||
int32* element = (int32*)&fBitmap[cpu % kArraySize];
|
int32* element = (int32*)&fBitmap[cpu / kArrayBits];
|
||||||
atomic_or(element, 1u << (cpu / kArraySize));
|
atomic_or(element, 1u << (cpu % kArrayBits));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
CPUSet::ClearBitAtomic(int32 cpu)
|
CPUSet::ClearBitAtomic(int32 cpu)
|
||||||
{
|
{
|
||||||
int32* element = (int32*)&fBitmap[cpu % kArraySize];
|
int32* element = (int32*)&fBitmap[cpu / kArrayBits];
|
||||||
atomic_and(element, ~uint32(1u << (cpu / kArraySize)));
|
atomic_and(element, ~uint32(1u << (cpu % kArrayBits)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
CPUSet::GetBit(int32 cpu) const
|
CPUSet::GetBit(int32 cpu) const
|
||||||
{
|
{
|
||||||
int32* element = (int32*)&fBitmap[cpu % kArraySize];
|
int32* element = (int32*)&fBitmap[cpu / kArrayBits];
|
||||||
return ((uint32)atomic_get(element) & (1u << (cpu / kArraySize))) != 0;
|
return ((uint32)atomic_get(element) & (1u << (cpu % kArrayBits))) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline CPUSet
|
||||||
|
CPUSet::And(const CPUSet& mask) const
|
||||||
|
{
|
||||||
|
CPUSet andSet;
|
||||||
|
for (int i = 0; i < kArraySize; i++)
|
||||||
|
andSet.fBitmap[i] = fBitmap[i] & mask.fBitmap[i];
|
||||||
|
return andSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
CPUSet::Matches(const CPUSet& mask) const
|
||||||
|
{
|
||||||
|
for (int i = 0; i < kArraySize; i++) {
|
||||||
|
if ((fBitmap[i] & mask.fBitmap[i]) != 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user