00001 /* 00002 ** Copyright (C) 2005 by Kevin L. Mitchell <klmitch@mit.edu> 00003 ** 00004 ** This program is free software; you can redistribute it and/or modify 00005 ** it under the terms of the GNU General Public License as published by 00006 ** the Free Software Foundation; either version 2 of the License, or 00007 ** (at your option) any later version. 00008 ** 00009 ** This program is distributed in the hope that it will be useful, 00010 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 ** GNU General Public License for more details. 00013 ** 00014 ** You should have received a copy of the GNU General Public License 00015 ** along with this program; if not, write to the Free Software 00016 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00017 ** 00018 ** @(#)$Id: signal_destroy.c,v 1.1 2005/09/15 18:14:11 klmitch Exp $ 00019 */ 00027 #include "engines_int.h" 00028 00029 RCSTAG("@(#)$Id: signal_destroy.c,v 1.1 2005/09/15 18:14:11 klmitch Exp $"); 00030 00031 ev_err_t 00032 signal_destroy(ev_ctx_t *ctx, ev_sig_t *sig) 00033 { 00034 ev_engine_t *eng; 00035 ev_err_t err = 0, err2; 00036 00037 ev_init(); /* make sure library is initialized... */ 00038 00039 /* sanity-check the arguments... */ 00040 if (!ec_verify(ctx) || !si_verify(sig) || eg_context(sig) != ctx) 00041 ev_return(EINVAL); 00042 00043 if (eg_flags(sig) & EV_GEN_DELETED) /* skip already deleted signals */ 00044 ev_return(0); 00045 00046 /* Walk through all the signal engines (last to first)... */ 00047 for (eng = ctx->ec_signal.el_last; eng; 00048 eng = eng->eng_signal.esi_active.el_prev) 00049 if ((err2 = eng_sig_rem(ctx, eng, sig)) && !err) /* remove the signal... */ 00050 err = err2; /* don't interrupt removal, but remember error code */ 00051 00052 eg_flags_set(sig, EV_GEN_DELETED); /* mark it as deleted */ 00053 00054 /* decrement the reference count */ 00055 eg_ref_dec(ctx, sig); 00056 00057 ev_return(err); 00058 }