AS 'MODULE_PATHNAME' LANGUAGE C STRICT;
CREATE FUNCTION get(pages pg_catalog.int8) RETURNS pg_catalog.int8
AS 'MODULE_PATHNAME' LANGUAGE C STRICT;
+CREATE FUNCTION inquire_largest() RETURNS pg_catalog.int8
+ AS 'MODULE_PATHNAME' LANGUAGE C STRICT;
CREATE FUNCTION put(first_page pg_catalog.int8, npages pg_catalog.int8)
RETURNS pg_catalog.void AS 'MODULE_PATHNAME' LANGUAGE C STRICT;
CREATE FUNCTION dump() RETURNS pg_catalog.text
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(init);
PG_FUNCTION_INFO_V1(get);
+PG_FUNCTION_INFO_V1(inquire_largest);
PG_FUNCTION_INFO_V1(put);
PG_FUNCTION_INFO_V1(dump);
Datum init(PG_FUNCTION_ARGS);
Datum get(PG_FUNCTION_ARGS);
+Datum inquire_largest(PG_FUNCTION_ARGS);
Datum put(PG_FUNCTION_ARGS);
Datum dump(PG_FUNCTION_ARGS);
PG_RETURN_INT64(first_page);
}
+Datum
+inquire_largest(PG_FUNCTION_ARGS)
+{
+ if (fpm == NULL)
+ PG_RETURN_NULL();
+
+ PG_RETURN_INT64(FreePageManagerInquireLargest(fpm));
+}
+
Datum
put(PG_FUNCTION_ARGS)
{
return result;
}
+/*
+ * Return the size of the largest run of pages that the user could
+ * succesfully get.
+ */
+Size
+FreePageManagerInquireLargest(FreePageManager *fpm)
+{
+ LWLock *lock = fpm_lock(fpm);
+ char *base = fpm_segment_base(fpm);
+ Size largest = 0;
+
+ if (lock != NULL)
+ LWLockAcquire(lock, LW_EXCLUSIVE);
+
+ if (!relptr_is_null(fpm->freelist[FPM_NUM_FREELISTS - 1]))
+ {
+ FreePageSpanLeader *candidate;
+
+ candidate = relptr_access(base, fpm->freelist[FPM_NUM_FREELISTS - 1]);
+ do
+ {
+ if (candidate->npages > largest)
+ largest = candidate->npages;
+ candidate = relptr_access(base, candidate->next);
+ } while (candidate != NULL);
+ }
+ else
+ {
+ Size f = FPM_NUM_FREELISTS - 1;
+
+ do
+ {
+ --f;
+ if (!relptr_is_null(fpm->freelist[f]))
+ largest = f + 1;
+ } while (f > 0);
+ }
+
+ if (lock != NULL)
+ LWLockRelease(lock);
+
+ return largest;
+}
+
/*
* Transfer a run of pages to the free page manager.
*/
Size *first_page);
extern void FreePageManagerPut(FreePageManager *fpm, Size first_page,
Size npages);
+extern Size FreePageManagerInquireLargest(FreePageManager *fpm);
extern char *FreePageManagerDump(FreePageManager *fpm);
#endif /* FREEPAGE_H */