X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/7dc6e7547ac790e76dd56aebf630a9780c31c883..53befeb700c31dec58cec2c8f6f34535541a2f39:/libguile/async.h diff --git a/libguile/async.h b/libguile/async.h dissimilarity index 95% index 5c7053ba7..427d9b4c8 100644 --- a/libguile/async.h +++ b/libguile/async.h @@ -1,81 +1,98 @@ -/* classes: h_files */ - -#ifndef ASYNCH -#define ASYNCH -/* Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307 USA - * - * As a special exception, the Free Software Foundation gives permission - * for additional uses of the text contained in its release of GUILE. - * - * The exception is that, if you link the GUILE library with other files - * to produce an executable, this does not by itself cause the - * resulting executable to be covered by the GNU General Public License. - * Your use of that executable is in no way restricted on account of - * linking the GUILE library code into it. - * - * This exception does not however invalidate any other reasons why - * the executable file might be covered by the GNU General Public License. - * - * This exception applies only to the code released by the - * Free Software Foundation under the name GUILE. If you copy - * code from other Free Software Foundation releases into a copy of - * GUILE, as the General Public License permits, the exception does - * not apply to the code that you add in this way. To avoid misleading - * anyone as to the status of such modified files, you must delete - * this exception notice from them. - * - * If you write modifications of your own for GUILE, it is your choice - * whether to permit this exception to apply to your modifications. - * If you do not wish that, delete this exception notice. */ - - -#include "libguile/__scm.h" - - - -#define SCM_ASYNCP(X) (scm_tc16_async == SCM_GCTYP16 (X)) -#define SCM_ASYNC(X) ((struct scm_async *)SCM_CDR (X)) - -struct scm_async -{ - int got_it; /* needs to be delivered? */ - SCM thunk; /* the handler. */ -}; - - - -extern unsigned int scm_mask_ints; -extern SCM scm_gc_async; - - -extern int scm_asyncs_pending SCM_P ((void)); -extern void scm_async_click SCM_P ((void)); -extern void scm_switch SCM_P ((void)); -extern SCM scm_async SCM_P ((SCM thunk)); -extern SCM scm_system_async SCM_P ((SCM thunk)); -extern SCM scm_async_mark SCM_P ((SCM a)); -extern SCM scm_system_async_mark SCM_P ((SCM a)); -extern SCM scm_run_asyncs SCM_P ((SCM list_of_a)); -extern SCM scm_noop SCM_P ((SCM args)); -extern SCM scm_set_tick_rate SCM_P ((SCM n)); -extern SCM scm_set_switch_rate SCM_P ((SCM n)); -extern SCM scm_unmask_signals SCM_P ((void)); -extern SCM scm_mask_signals SCM_P ((void)); -extern void scm_init_async SCM_P ((void)); - -#endif /* ASYNCH */ +/* classes: h_files */ + +#ifndef SCM_ASYNC_H +#define SCM_ASYNC_H + +/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2004, 2005, 2006, 2008 Free Software Foundation, Inc. + * + * This library 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 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + + +#include "libguile/__scm.h" +#include "libguile/root.h" +#include "libguile/threads.h" + + + +#define scm_mask_ints (SCM_I_CURRENT_THREAD->block_asyncs != 0) + + + +SCM_API void scm_async_click (void); +SCM_API void scm_switch (void); +SCM_API SCM scm_async (SCM thunk); +SCM_API SCM scm_async_mark (SCM a); +SCM_API SCM scm_system_async_mark (SCM a); +SCM_API SCM scm_system_async_mark_for_thread (SCM a, SCM thread); +SCM_INTERNAL void scm_i_queue_async_cell (SCM cell, scm_i_thread *); +SCM_INTERNAL int scm_i_setup_sleep (scm_i_thread *, + SCM obj, scm_i_pthread_mutex_t *m, + int fd); +SCM_INTERNAL void scm_i_reset_sleep (scm_i_thread *); +SCM_API SCM scm_run_asyncs (SCM list_of_a); +SCM_API SCM scm_noop (SCM args); +SCM_API SCM scm_call_with_blocked_asyncs (SCM proc); +SCM_API SCM scm_call_with_unblocked_asyncs (SCM proc); +void *scm_c_call_with_blocked_asyncs (void *(*p) (void *d), void *d); +void *scm_c_call_with_unblocked_asyncs (void *(*p) (void *d), void *d); +void scm_dynwind_block_asyncs (void); +void scm_dynwind_unblock_asyncs (void); + +/* Critical sections */ + +/* XXX - every critical section needs to be examined whether the + requirements for SCM_CRITICAL_SECTION_START/END are fulfilled. See + the manual. +*/ + +/* Defined in threads.c. scm_i_critical_section_level is only used + for error checking and will go away eventually. */ +extern scm_i_pthread_mutex_t scm_i_critical_section_mutex; +extern int scm_i_critical_section_level; + +#define SCM_CRITICAL_SECTION_START \ + do { \ + scm_i_pthread_mutex_lock (&scm_i_critical_section_mutex);\ + SCM_I_CURRENT_THREAD->block_asyncs++; \ + scm_i_critical_section_level++; \ + } while (0) +#define SCM_CRITICAL_SECTION_END \ + do { \ + scm_i_critical_section_level--; \ + SCM_I_CURRENT_THREAD->block_asyncs--; \ + scm_i_pthread_mutex_unlock (&scm_i_critical_section_mutex); \ + scm_async_click (); \ + } while (0) + +SCM_INTERNAL void scm_init_async (void); + +#if (SCM_ENABLE_DEPRECATED == 1) + +SCM_API SCM scm_system_async (SCM thunk); +SCM_API SCM scm_unmask_signals (void); +SCM_API SCM scm_mask_signals (void); + +#endif + +#endif /* SCM_ASYNC_H */ + +/* + Local Variables: + c-file-style: "gnu" + End: +*/