// XtratuM
// version: 0.1
//
// (c) 2004, Miguel Masmano <mimastel@doctor.upv.es>
// Released under the terms of GPL License v2

#ifndef _BITMAP_H_
#define _BITMAP_H_

#include <XtratuM_config.h>
#include <arch/XtratuM_asm.h>
#include <linux/string.h>


#if MAX_EVENTS > 32 
#error MAX_EVENTS CAN NOT BE GREATER THAN 32 due to efficience reasons
#endif

/*
#define BITMAP_SIZE (MAX_EVENTS / ULONG_BITS)

typedef unsigned long bitmap_t [BITMAP_SIZE];

#define set_bit(bitmap, pos) \
  bitmap [pos/ULONG_BITS] |= (1 << (pos % ULONG_BITS))

#define clear_bit(bitmap, pos) \
  bitmap [pos/ULONG_BITS] &= ~(1 << (pos % ULONG_BITS))

#define is_bit_set(bitmap, pos) \
  (bitmap [pos/ULONG_BITS] & (1 << (pos % ULONG_BITS)))

#define clear_bitmap(bitmap) \
  memset((char *) bitmap, 0, BITMAP_SIZE * sizeof (unsigned long))

#define set_bitmap(bitmap) \
  memset((char *) bitmap, (~0), BITMAP_SIZE  * sizeof (unsigned long))

#define is_some_bit_set(bitmap) ({\
  unsigned int set = 0, n; \
  for (n = 0; n < BITMAP_SIZE; n++) set |= bitmap[n]; \
  set; \
})

#define get_next_set_bit_and_clear(bitmap) ({ \
  unsigned int pos = -1, n; \
  for (n = 0; n < BITMAP_SIZE; n++) \
    if (bitmap [n]) {\
      pos =  XtratuM_ffs(bitmap[n]); \
      clear_bit(bitmap, pos); \
      break; \
    } \
  pos; \
})

#else
*/
#define BITMAP_SIZE 1

typedef unsigned long bitmap_t;

// Remember to make all these operations atomically

#define set_bit(bitmap, pos) bitmap |= (1 << pos)

#define clear_bit(bitmap, pos) bitmap &= ~(1 << pos)

#define is_bit_set(bitmap, pos) (bitmap & (1 << pos))

#define clear_bitmap(bitmap) bitmap = 0

#define set_bitmap(bitmap) bitmap = (~0)

#define is_some_bit_set(bitmap) bitmap

#define get_domain_pending_events(pending, mask) (~mask & pending)

#define get_next_set_bit_and_clear(pending, mask) ({ \
  unsigned int pos = xm_ffs(get_domain_pending_events (pending, mask)); \
  if (pos != -1) { \
    clear_bit (pending, pos); \
  } \
  pos; \
})

//#endif

#endif
