eventq.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 115 行
C
115 行
/*************************************************************************** begin : Thu Jun 24 2004 copyright : (C) 2004 - 2005 by Alper Akcan email : distchx@yahoo.com ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of the * * License, or (at your option) any later version. * * * ***************************************************************************/#include "xynth_.h"int s_eventq_init (s_window_t *window){ window->eventq = (s_eventq_t *) s_calloc(1, sizeof(s_eventq_t)); window->eventq->queue = (s_list_t *) s_calloc(1, sizeof(s_list_t)); if (s_thread_cond_init(&window->eventq->cond)) { goto err0; } if (s_thread_mutex_init(&window->eventq->mut)) { goto err1; } return 0;err1: s_thread_cond_destroy(window->eventq->cond);err0: s_free(window->eventq->queue); s_free(window->eventq); return 1;}int s_eventq_uninit (s_window_t *window){ s_event_t *e; s_thread_mutex_destroy(window->eventq->mut); s_thread_cond_destroy(window->eventq->cond); while (!s_list_eol(window->eventq->queue, 0)) { e = (s_event_t *) s_list_get(window->eventq->queue, 0); s_list_remove(window->eventq->queue, 0); s_event_uninit(e); } s_free(window->eventq->queue); s_free(window->eventq); return 0;}int s_eventq_add (s_window_t *window, s_event_t *event){ int ret; s_thread_mutex_lock(window->eventq->mut); ret = s_list_add(window->eventq->queue, event, -1); s_thread_cond_signal(window->eventq->cond); s_thread_mutex_unlock(window->eventq->mut); return ret;}int s_eventq_get (s_window_t *window, s_event_t **event){ int ret; s_event_t *e; s_thread_mutex_lock(window->eventq->mut); e = (s_event_t *) s_list_get(window->eventq->queue, 0); if (e == NULL) { ret = 1; } else { s_list_remove(window->eventq->queue, 0); *event = e; ret = 0; } s_thread_mutex_unlock(window->eventq->mut); return ret;}int s_eventq_wait (s_window_t *window, s_event_t **event){ int ret; s_event_t *e; s_thread_mutex_lock(window->eventq->mut); while (window->eventq->queue->nb_elt <= 0) { if (s_thread_cond_wait(window->eventq->cond, window->eventq->mut)) { debugf(DSYS, "s_thread_cond_wait failed"); return -1; } } e = (s_event_t *) s_list_get(window->eventq->queue, 0); if (e == NULL) { ret = -1; } else { s_list_remove(window->eventq->queue, 0); *event = e; ret = 0; } s_thread_mutex_unlock(window->eventq->mut); return ret;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?