64 lines
2.4 KiB
C
64 lines
2.4 KiB
C
/*
|
|
* Copyright (C) 2016 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef _ATOMIC_BITSET_H_
|
|
#define _ATOMIC_BITSET_H_
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <cpu/atomicBitset.h>
|
|
|
|
struct AtomicBitset;
|
|
|
|
//static size calc:
|
|
// ATOMIC_BITSET_SZ(numbits)
|
|
//static alloc
|
|
// ATOMIC_BITSET_DECL(nam, numbits, [static]);
|
|
//dynamic init:
|
|
// uint32_t sz = atomicBitsetSize(uint32_t numBits);
|
|
// struct AtomicBitset *set = (struct AtomicBitset*)heapAlloc(sz);
|
|
// atomicBitsetInit(set, numBits);
|
|
|
|
|
|
void atomicBitsetInit(struct AtomicBitset *set, uint32_t numBits); //inited state is all zeroes
|
|
uint32_t atomicBitsetGetNumBits(const struct AtomicBitset *set);
|
|
bool atomicBitsetGetBit(const struct AtomicBitset *set, uint32_t num);
|
|
void atomicBitsetClearBit(struct AtomicBitset *set, uint32_t num);
|
|
void atomicBitsetSetBit(struct AtomicBitset *set, uint32_t num);
|
|
|
|
//find a clear bit and set it atomically.
|
|
// returns bit number or negative if none.
|
|
// only one pass is attempted so if index 0 is cleared after we've looked at it, too bad
|
|
int32_t atomicBitsetFindClearAndSet(struct AtomicBitset *set);
|
|
|
|
//swap the bitsets in atomicallyAccessedSet and otherSet
|
|
// returns false if the size of the bitsets are different.
|
|
// otherwise atomically copies the bitset in otherSet into atomicallyAccessedSet
|
|
// and returns the previous value of atomicallyAccessedSet in otherSet
|
|
// NOTE: the copy back to otherSet is not atomic
|
|
bool atomicBitsetXchg(struct AtomicBitset *atomicallyAccessedSet, struct AtomicBitset *otherSet);
|
|
|
|
//read the bits in set into an array of uint32_t's
|
|
// returns false if the number of bits in set is not numBits
|
|
// otherwise atomically read a uint32_t at a time from the bitset in set into
|
|
// dest
|
|
// NOTE: if bitset is not a multiple of 32, the remaining bits up to 32 in the
|
|
// last uint32_t will contain undefined values
|
|
bool atomicBitsetBulkRead(struct AtomicBitset *set, uint32_t *dest, uint32_t numBits);
|
|
|
|
#endif
|
|
|