queue_finalizer.c   [plain text]


#include <dispatch/dispatch.h>
#include <unistd.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "dispatch_test.h"

int main(void) {
	long res;

	test_start("Dispatch Queue Finalizer");

#ifdef __LP64__
	void* ctxt_magic = (void*)((uintptr_t)arc4random() << 32 | arc4random());
#else
	void* ctxt_magic = (void*)arc4random();
#endif

	dispatch_queue_attr_t attr = dispatch_queue_attr_create();
	test_ptr_notnull("dispatch_queue_attr_create", attr);

	__block long finalizer_ran = 0;

	res = dispatch_queue_attr_set_finalizer(attr, ^(dispatch_queue_t dq) {
		void* ctxt = dispatch_queue_get_context(dq);
		test_ptr("dispatch_queue_get_context", ctxt, ctxt_magic);
		test_ptr_notnull("finalizer ran", dq);
		test_stop();
	});
	test_long("dispatch_queue_attr_set_finalizer", res, 0);

	dispatch_queue_t q = dispatch_queue_create(NULL, attr);
	test_ptr_notnull("dispatch_queue_new", q);

	dispatch_queue_set_context(q, ctxt_magic);

	dispatch_release(attr);

	dispatch_release(q);

	dispatch_main();
	
	return 0;
}