Пример #1
0
Файл: pty.c Проект: myra/kmscon
void kmscon_pty_unref(struct kmscon_pty *pty)
{
	if (!pty || !pty->ref || --pty->ref)
		return;

	log_debug("free pty object");
	kmscon_pty_close(pty);
	kmscon_ring_free(pty->msgbuf);
	ev_eloop_unref(pty->eloop);
	free(pty);
}
Пример #2
0
Файл: main.c Проект: mdlh/kmscon
static void destroy_app(struct kmscon_app *app)
{
	kmscon_ui_free(app->ui);
	kmscon_input_unref(app->input);
	uterm_video_unref(app->video);
	kmscon_vt_unref(app->vt);
	ev_eloop_unregister_signal_cb(app->eloop, SIGINT, sig_generic, app);
	ev_eloop_unregister_signal_cb(app->eloop, SIGTERM, sig_generic, app);
	ev_eloop_rm_eloop(app->vt_eloop);
	ev_eloop_unref(app->eloop);
}
Пример #3
0
Файл: vt.c Проект: myra/kmscon
static void disconnect_eloop(struct kmscon_vt *vt)
{
	if (!vt)
		return;

	ev_eloop_rm_fd(vt->efd);
	ev_eloop_unregister_signal_cb(vt->eloop, SIGUSR2, vt_enter, vt);
	ev_eloop_unregister_signal_cb(vt->eloop, SIGUSR1, vt_leave, vt);
	ev_eloop_unref(vt->eloop);
	vt->efd = NULL;
	vt->eloop = NULL;
}
Пример #4
0
SHL_EXPORT
void uvt_ctx_unref(struct uvt_ctx *ctx)
{
	if (!ctx || !ctx->ref || --ctx->ref)
		return;

	llog_debug(ctx, "free ctx %p", ctx);

	shl_flagset_free(ctx->minors);
	free(ctx->cuse_file);
	ev_eloop_unref(ctx->eloop);
	free(ctx);
}
Пример #5
0
static void destroy_app(struct uvtd_app *app)
{
	ev_eloop_rm_fd(app->ctx_fd);
	uvt_ctx_unref(app->ctx);
	uterm_monitor_unref(app->mon);
	ev_eloop_unregister_signal_cb(app->eloop, SIGPIPE, app_sig_ignore,
				      app);
	ev_eloop_unregister_signal_cb(app->eloop, SIGINT, app_sig_generic,
				      app);
	ev_eloop_unregister_signal_cb(app->eloop, SIGTERM, app_sig_generic,
				      app);
	ev_eloop_unref(app->eloop);
}
Пример #6
0
SHL_EXPORT
int uvt_ctx_new(struct uvt_ctx **out, uvt_log_t log, void *log_data)
{
	struct uvt_ctx *ctx;
	int ret;

	if (!out)
		return llog_dEINVAL(log, log_data);

	ctx = malloc(sizeof(*ctx));
	if (!ctx)
		return llog_dENOMEM(log, log_data);
	memset(ctx, 0, sizeof(*ctx));
	ctx->ref = 1;
	ctx->llog = log;
	ctx->llog_data = log_data;

	/* Default major/minor uses the TTY_MAJOR number with an offset of 2^15
	 * to avoid ID-clashes with any in-kernel TTY driver. As kernel drivers
	 * use static IDs only, a lower number would be fine, too, but lets be
	 * safe and just use high numbers. */
	ctx->major = TTY_MAJOR;
	ctx->minor_offset = 16384;

	llog_debug(ctx, "new ctx %p", ctx);

	ret = ev_eloop_new(&ctx->eloop, ctx->llog, ctx->llog_data);
	if (ret)
		goto err_free;

	ctx->cuse_file = strdup("/dev/cuse");
	if (!ctx->cuse_file) {
		ret = llog_ENOMEM(ctx);
		goto err_eloop;
	}

	ret = shl_flagset_new(&ctx->minors);
	if (ret)
		goto err_file;

	*out = ctx;
	return 0;

err_file:
	free(ctx->cuse_file);
err_eloop:
	ev_eloop_unref(ctx->eloop);
err_free:
	free(ctx);
	return ret;
}
Пример #7
0
void uterm_vt_master_unref(struct uterm_vt_master *vtm)
{
	struct uterm_vt *vt;

	if (!vtm || !vtm->ref || --vtm->ref)
		return;

	while (vtm->vts.next != &vtm->vts) {
		vt = kmscon_dlist_entry(vtm->vts.next,
					struct uterm_vt,
					list);
		uterm_vt_deallocate(vt);
	}

	ev_eloop_unref(vtm->eloop);
	free(vtm);
}
Пример #8
0
void uterm_video_unref(struct uterm_video *video)
{
	struct uterm_display *disp;

	if (!video || !video->ref || --video->ref)
		return;

	log_info("free device %p", video);

	VIDEO_CALL(video->ops->destroy, 0, video);

	while ((disp = video->displays)) {
		video->displays = disp->next;
		disp->next = NULL;
		uterm_display_unref(disp);
	}

	shl_hook_free(video->hook);
	ev_eloop_unref(video->eloop);
	free(video);
}
Пример #9
0
SHL_EXPORT
void uterm_video_unref(struct uterm_video *video)
{
	struct uterm_display *disp;

	if (!video || !video->ref || --video->ref)
		return;

	log_info("free device %p", video);

	while (!shl_dlist_empty(&video->displays)) {
		disp = shl_dlist_entry(video->displays.prev,
				       struct uterm_display, list);
		uterm_display_unbind(disp);
	}

	VIDEO_CALL(video->ops->destroy, 0, video);
	shl_hook_free(video->hook);
	ev_eloop_unref(video->eloop);
	free(video);
}