C++程序  |  64行  |  2.44 KB

/*
 * 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