StreamBatch *StreamBatchCreate(Bitmapset *readers, int num_tuples) { char *ptr = ShmemDynAlloc0(sizeof(StreamBatch) + BITMAPSET_SIZE(readers->nwords) + (bms_num_members(readers) * sizeof(int))); StreamBatch *batch = (StreamBatch *) ptr; int cq_id; int i = 0; batch->id = rand() ^ (int) MyProcPid; batch->num_tups = num_tuples; batch->num_wtups = bms_num_members(readers) * num_tuples; SpinLockInit(&batch->mutex); ptr += sizeof(StreamBatch); batch->readers = (Bitmapset *) ptr; memcpy(batch->readers, readers, BITMAPSET_SIZE(readers->nwords)); ptr += BITMAPSET_SIZE(readers->nwords); batch->proc_runs = (int *) ptr; readers = bms_copy(readers); while ((cq_id = bms_first_member(readers)) != -1) { CQProcEntry *pentry = GetCQProcEntry(cq_id); batch->proc_runs[i] = Max(pentry->proc_runs, pentry->pg_size); i++; } pfree(readers); return batch; }
/* * bms_add_member - add a specified member to set * * Input set is modified or recycled! */ Bitmapset * bms_add_member(Bitmapset *a, int x) { int wordnum, bitnum; if (x < 0) elog(ERROR, "negative bitmapset member not allowed"); if (a == NULL) return bms_make_singleton(x); wordnum = WORDNUM(x); bitnum = BITNUM(x); /* enlarge the set if necessary */ if (wordnum >= a->nwords) { int oldnwords = a->nwords; int i; a = (Bitmapset *) repalloc(a, BITMAPSET_SIZE(wordnum + 1)); a->nwords = wordnum + 1; /* zero out the enlarged portion */ for (i = oldnwords; i < a->nwords; i++) a->words[i] = 0; } a->words[wordnum] |= ((bitmapword) 1 << bitnum); return a; }
/* * bms_copy - make a palloc'd copy of a bitmapset */ Bitmapset * bms_copy(const Bitmapset *a) { Bitmapset *result; size_t size; if (a == NULL) return NULL; size = BITMAPSET_SIZE(a->nwords); result = (Bitmapset *) palloc(size); memcpy(result, a, size); return result; }
/* * bms_make_singleton - build a bitmapset containing a single member */ Bitmapset * bms_make_singleton(int x) { Bitmapset *result; int wordnum, bitnum; if (x < 0) elog(ERROR, "negative bitmapset member not allowed"); wordnum = WORDNUM(x); bitnum = BITNUM(x); result = (Bitmapset *) palloc0(BITMAPSET_SIZE(wordnum + 1)); result->nwords = wordnum + 1; result->words[wordnum] = ((bitmapword) 1 << bitnum); return result; }