int read_wgdos_bitmaps(
  /* IN */
  char** data,                     /* PP field to read from */
  int ncols,                 /* Number of elements in row, >=0 */
  Boolean missing_data_present,  /* Is missing data bitmap present? */
  Boolean zeros_bitmap_present,  /* Is zeros bitmap present? */
  /* IN - Workspace supplied by caller */
  void *buffer,                /* Buffer at least 2*ncols bits, rounded */
                                   /* up to the next complete int, long  */
  /* OUT */
  Boolean *missing_data,          /* Missing data bitmap for row */
  Boolean *zero,                  /* Zeros bitmap for row */
  int *missing_data_count,    /* Num TRUE elements in missing_data,>=0 */
  int *zeros_count           /* Num TRUE elements in zero, >=0 */
)
{
  int nsus_to_read;      /* Number of numeric storage units occupied */
                          /* by bitmaps */
  int zeros_start_bit;   /* Bit number in buffer where zeros bitmap starts */
    
  /* Determine length of bitmaps in numeric storage units */
  nsus_to_read = (ncols*(missing_data_present + zeros_bitmap_present)+ PP_BITS_PER_NUMERIC - 1) / PP_BITS_PER_NUMERIC;

  if ( nsus_to_read > 0 ) {
    /* Read bitmaps */
    buffer = *data;
    *data = *data + sizeof(int)*nsus_to_read;
  }

  /* Unpack missing data bitmap */
  if ( missing_data_present ) {
    extract_bitmaps(buffer, 0, ncols, TRUE, missing_data);                    
    COUNTER(*missing_data_count, missing_data, ncols);
  } else {
    SET_FALSE(missing_data, ncols);
    *missing_data_count = 0;
  }

  /* Unpack zeros bitmap */
  if ( zeros_bitmap_present ) {
    zeros_start_bit = (missing_data_present ? ncols : 0);
    extract_bitmaps(buffer, zeros_start_bit, ncols, FALSE, zero);
    COUNTER(*zeros_count, zero, ncols);
  } else {
    SET_FALSE(zero, ncols);
    *zeros_count = 0;
  }
  return 0;
}
Exemple #2
0
/*
 * Exact matches can use bsearch.
 */
int
blist_match(BLIST * data, const char *name)
{
    int rc = -1;
    int last = blist_count(data);
    void *check;
    ToFind dummy;

    dummy.name = name;
    check = bsearch(&dummy, data->theList, (size_t) last, data->itemSize, exact_match);
    if (check != 0) {
	rc = (int) ItemToInx(data, check);
    }
    COUNTER(total_linear, rc + 1);
    COUNTER(total_limits, last);
    COUNTER(total_calls, 1);
    return rc;
}
Exemple #3
0
void pa_aupdate_read_end(pa_aupdate *a) {
    unsigned PA_UNUSED n;

    pa_assert(a);

    /* Decrease the lock counter */
    n = (unsigned) pa_atomic_dec(&a->read_lock);

    /* Make sure the counter was valid */
    pa_assert(COUNTER(n) > 0);

    /* Post the semaphore */
    pa_semaphore_post(a->semaphore);
}
Exemple #4
0
unsigned pa_aupdate_read_begin(pa_aupdate *a) {
    unsigned n;

    pa_assert(a);

    /* Increase the lock counter */
    n = (unsigned) pa_atomic_inc(&a->read_lock);

    /* When n is 0 we have about 2^31 threads running that all try to
     * access the data at the same time, oh my! */
    pa_assert(COUNTER(n)+1 > 0);

    /* The uppermost bit tells us which data to look at */
    return WHICH(n);
}
Exemple #5
0
int main()
{
	int temp = 0;
	temp = COUNTER();
	std::cout << "第" << temp << "次调用" << std::endl;
	temp = COUNTER();
	std::cout << "第" << temp << "次调用" << std::endl;
	temp = COUNTER();
	std::cout << "第" << temp << "次调用" << std::endl;
	temp = COUNTER();
	std::cout << "第" << temp << "次调用" << std::endl;
	temp = COUNTER();
	std::cout << "第" << temp << "次调用" << std::endl;
	temp = COUNTER();
	std::cout << "第" << temp << "次调用" << std::endl;
	temp = COUNTER();
	std::cout << "第" << temp << "次调用" << std::endl;
	temp = COUNTER();
	std::cout << "第" << temp << "次调用" << std::endl;
	return 0;
}
Exemple #6
0
unsigned pa_aupdate_write_swap(pa_aupdate *a) {
    unsigned n;

    pa_assert(a);

    for (;;) {
        n = (unsigned) pa_atomic_load(&a->read_lock);

        /* If the read counter is > 0 wait; if it is 0 try to swap the lists */
        if (COUNTER(n) > 0)
            pa_semaphore_wait(a->semaphore);
        else if (pa_atomic_cmpxchg(&a->read_lock, (int) n, (int) (n ^ MSB)))
            break;
    }

    a->swapped = true;

    return WHICH(n);
}
Exemple #7
0
/*
 * Given what may be part of the name (length in 'len'), look for a match.
 * If the result is ambiguous, do not match unless the given name exactly
 * matches one item.
 */
int
blist_pmatch(BLIST * data, const char *name, int len)
{
    int actual = (int) strlen(name);
    int rc = -1;
    int hi, lo, x0, x1, cmp;
    int last = blist_count(data);
    const char *item;
    const char *test;

    if (len < 0 || len > actual)
	len = actual;

    x1 = -1;
    hi = last - 1;
    lo = 0;
    do {
	x0 = x1;
	x1 = lo + (hi - lo) / 2;
	if (x0 == x1) {
	    if (++x1 > hi)
		break;
	}
	item = ItemOf(data, x1);
	cmp = strncmp(item, name, (size_t) len);
	if (cmp < 0) {
	    lo = (x1 == lo) ? (x1 + 1) : x1;
	} else if (cmp > 0) {
	    hi = (x1 == hi) ? (x1 - 1) : x1;
	} else {
	    rc = x1;

	    /*
	     * Check for an exact match...
	     */
	    COUNTER(total_compares, 1);
	    if (strcmp(item, name)) {
		if (x1 > lo) {
		    ToFind dummy;

		    dummy.name = name;
		    test = (const char *) bsearch(&dummy,
						  &ItemOf(data, lo),
						  (size_t) (x1 + 1 - lo),
						  (size_t) data->itemSize,
						  exact_match);
		    if (test) {
			rc = (int) ItemToInx(data, test);
			break;
		    }
		}
	    }

	    /*
	     * Now - if we have not found an exact match, check for ambiguity.
	     */
	    if (rc >= 0) {
		if (len > (int) strlen(item)) {
		    rc = -1;
		} else if (x1 < last - 1) {
		    COUNTER(total_compares, 2);
		    if (strcmp(item, name)
			&& !strncmp(ItemOf(data, x1 + 1), name, (size_t) len)) {
			rc = -1;
		    }
		}
	    }
	    break;
	}
    } while (hi >= lo);
    COUNTER(total_linear, rc + 2);
    COUNTER(total_limits, last);
    COUNTER(total_calls, 1);
    return rc;
}
Exemple #8
0
static int
exact_match(const void *keyobj, const void *arraymember)
{
    COUNTER(total_compares, 1);
    return strcmp(*(const char *const *) keyobj, (*(const char *const *) arraymember));
}