MODULE = ZMQ::Raw               PACKAGE = ZMQ::Raw::Context

SV *
new (class)
	SV *class

	PREINIT:
		int i;
		zmq_raw_context *ctx = NULL;

	CODE:
		Newxz (ctx, 1, zmq_raw_context);
		ctx->mutex = zmq_raw_mutex_create();
		ctx->context = zmq_ctx_new();
		ctx->reference_count = 1;
		ctx->timers = NULL;

		ZMQ_NEW_REFCOUNTED_OBJ (RETVAL, "ZMQ::Raw::Context",
			ctx, zmq_raw_ctx_dup);

	OUTPUT: RETVAL

void
set (self, option, value)
	SV *self
	int option
	int value

	PREINIT:
		int rc;
		zmq_raw_context *ctx;

	CODE:
		ctx = ZMQ_SV_TO_PTR (Context, self);
		rc = zmq_ctx_set (ctx->context, option, value);
		zmq_raw_check_error (rc);

void
shutdown (self)
	SV *self

	PREINIT:
		int rc;
		zmq_raw_context *ctx;

	CODE:
		ctx = ZMQ_SV_TO_PTR (Context, self);
		rc = zmq_ctx_shutdown (ctx->context);
		zmq_raw_check_error (rc);

void
DESTROY(self)
	SV *self

	PREINIT:
		zmq_raw_context *ctx;

	CODE:
		ctx = ZMQ_SV_TO_PTR (Context, self);

		zmq_raw_mutex_lock (ctx->mutex);
		if (--ctx->reference_count > 0)
		{
			zmq_raw_mutex_unlock (ctx->mutex);
			XSRETURN (0);
		}

		if (ctx->timers)
			zmq_raw_timers_destroy (ctx->timers);

		zmq_ctx_term (ctx->context);
		zmq_raw_mutex_unlock (ctx->mutex);
		zmq_raw_mutex_destroy (ctx->mutex);
		Safefree (ctx);