2008-09-13 15:35:27 +02:00
|
|
|
/* Copyright (C) 2002, 2006, 2008 Free Software Foundation, Inc.
|
2002-10-16 15:54:23 +00:00
|
|
|
*
|
2003-04-05 19:15:35 +00:00
|
|
|
* This library is free software; you can redistribute it and/or
|
2009-06-17 00:22:09 +01:00
|
|
|
* 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.
|
2002-10-16 15:54:23 +00:00
|
|
|
*
|
2009-06-17 00:22:09 +01:00
|
|
|
* This library is distributed in the hope that it will be useful, but
|
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
2003-04-05 19:15:35 +00:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
* Lesser General Public License for more details.
|
2002-10-16 15:54:23 +00:00
|
|
|
*
|
2003-04-05 19:15:35 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
* License along with this library; if not, write to the Free Software
|
2009-06-17 00:22:09 +01:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
|
|
|
* 02110-1301 USA
|
2003-04-05 19:15:35 +00:00
|
|
|
*/
|
2002-10-16 15:54:23 +00:00
|
|
|
|
2008-09-13 15:35:27 +02:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
# include <config.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include "libguile/_scm.h"
|
2002-10-16 15:54:23 +00:00
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
#if SCM_USE_NULL_THREADS
|
2002-10-16 15:54:23 +00:00
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
#include "libguile/null-threads.h"
|
2002-10-16 15:54:23 +00:00
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
static scm_i_pthread_key_t *all_keys = NULL;
|
2002-10-16 15:54:23 +00:00
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
static void
|
|
|
|
|
destroy_keys (void)
|
2002-10-16 15:54:23 +00:00
|
|
|
{
|
2005-03-02 20:42:01 +00:00
|
|
|
scm_i_pthread_key_t *key;
|
|
|
|
|
int again;
|
* null-threads.h (scm_null_mutex, scm_null_mutex_init,
scm_null_mutex_lock, scm_null_mutex_unlock,
scm_null_mutex_destroy, scm_null_condvar, scm_null_condvar_init,
scm_null_condvar_wait, scm_null_condvar_signal,
scm_null_condvar_destroy): Removed.
(scm_mutex_init, scm_mutex_lock, scm_mutex_unlock, scm_cond_init,
scm_cond_wait, scm_cond_signal, scm_cond_broadcast,
scm_cond_destory): Do not define, they are now deprecated and
handled by threads.{h,c}.
* null-threads.c (scm_null_mutex, scm_null_cond): Define here.
(scm_threads_init): Create smobs here, using the appropriate
sizes.
(block): Removed, now unused.
(scm_c_thread_exited_p): New.
(scm_null_mutex_init, scm_null_mutex_lock, scm_null_mutex_unlock,
scm_null_mutex_destroy, scm_null_condvar_init,
scm_null_condvar_wait, scm_null_condvar_signal,
scm_null_condvar_destroy): Removed and updated users to do their
task directly.
(scm_try_mutex, timeval_subtract,
scm_timed_wait_condition_variable,
scm_broadcast_condition_variable): New.
(scm_wait_condition_variable): Removed.
2002-10-27 20:12:27 +00:00
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
do {
|
|
|
|
|
again = 0;
|
|
|
|
|
for (key = all_keys; key; key = key->next)
|
|
|
|
|
if (key->value && key->destr_func)
|
* null-threads.h (scm_null_mutex, scm_null_mutex_init,
scm_null_mutex_lock, scm_null_mutex_unlock,
scm_null_mutex_destroy, scm_null_condvar, scm_null_condvar_init,
scm_null_condvar_wait, scm_null_condvar_signal,
scm_null_condvar_destroy): Removed.
(scm_mutex_init, scm_mutex_lock, scm_mutex_unlock, scm_cond_init,
scm_cond_wait, scm_cond_signal, scm_cond_broadcast,
scm_cond_destory): Do not define, they are now deprecated and
handled by threads.{h,c}.
* null-threads.c (scm_null_mutex, scm_null_cond): Define here.
(scm_threads_init): Create smobs here, using the appropriate
sizes.
(block): Removed, now unused.
(scm_c_thread_exited_p): New.
(scm_null_mutex_init, scm_null_mutex_lock, scm_null_mutex_unlock,
scm_null_mutex_destroy, scm_null_condvar_init,
scm_null_condvar_wait, scm_null_condvar_signal,
scm_null_condvar_destroy): Removed and updated users to do their
task directly.
(scm_try_mutex, timeval_subtract,
scm_timed_wait_condition_variable,
scm_broadcast_condition_variable): New.
(scm_wait_condition_variable): Removed.
2002-10-27 20:12:27 +00:00
|
|
|
{
|
2005-03-02 20:42:01 +00:00
|
|
|
void *v = key->value;
|
|
|
|
|
key->value = NULL;
|
|
|
|
|
key->destr_func (v);
|
|
|
|
|
again = 1;
|
* null-threads.h (scm_null_mutex, scm_null_mutex_init,
scm_null_mutex_lock, scm_null_mutex_unlock,
scm_null_mutex_destroy, scm_null_condvar, scm_null_condvar_init,
scm_null_condvar_wait, scm_null_condvar_signal,
scm_null_condvar_destroy): Removed.
(scm_mutex_init, scm_mutex_lock, scm_mutex_unlock, scm_cond_init,
scm_cond_wait, scm_cond_signal, scm_cond_broadcast,
scm_cond_destory): Do not define, they are now deprecated and
handled by threads.{h,c}.
* null-threads.c (scm_null_mutex, scm_null_cond): Define here.
(scm_threads_init): Create smobs here, using the appropriate
sizes.
(block): Removed, now unused.
(scm_c_thread_exited_p): New.
(scm_null_mutex_init, scm_null_mutex_lock, scm_null_mutex_unlock,
scm_null_mutex_destroy, scm_null_condvar_init,
scm_null_condvar_wait, scm_null_condvar_signal,
scm_null_condvar_destroy): Removed and updated users to do their
task directly.
(scm_try_mutex, timeval_subtract,
scm_timed_wait_condition_variable,
scm_broadcast_condition_variable): New.
(scm_wait_condition_variable): Removed.
2002-10-27 20:12:27 +00:00
|
|
|
}
|
2005-03-02 20:42:01 +00:00
|
|
|
} while (again);
|
2002-10-16 15:54:23 +00:00
|
|
|
}
|
|
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
int
|
|
|
|
|
scm_i_pthread_key_create (scm_i_pthread_key_t *key,
|
|
|
|
|
void (*destr_func) (void *))
|
2002-10-16 15:54:23 +00:00
|
|
|
{
|
2005-03-02 20:42:01 +00:00
|
|
|
if (all_keys == NULL)
|
|
|
|
|
atexit (destroy_keys);
|
2002-10-16 15:54:23 +00:00
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
key->next = all_keys;
|
|
|
|
|
all_keys = key;
|
|
|
|
|
key->value = NULL;
|
|
|
|
|
key->destr_func = destr_func;
|
* null-threads.h (scm_null_mutex, scm_null_mutex_init,
scm_null_mutex_lock, scm_null_mutex_unlock,
scm_null_mutex_destroy, scm_null_condvar, scm_null_condvar_init,
scm_null_condvar_wait, scm_null_condvar_signal,
scm_null_condvar_destroy): Removed.
(scm_mutex_init, scm_mutex_lock, scm_mutex_unlock, scm_cond_init,
scm_cond_wait, scm_cond_signal, scm_cond_broadcast,
scm_cond_destory): Do not define, they are now deprecated and
handled by threads.{h,c}.
* null-threads.c (scm_null_mutex, scm_null_cond): Define here.
(scm_threads_init): Create smobs here, using the appropriate
sizes.
(block): Removed, now unused.
(scm_c_thread_exited_p): New.
(scm_null_mutex_init, scm_null_mutex_lock, scm_null_mutex_unlock,
scm_null_mutex_destroy, scm_null_condvar_init,
scm_null_condvar_wait, scm_null_condvar_signal,
scm_null_condvar_destroy): Removed and updated users to do their
task directly.
(scm_try_mutex, timeval_subtract,
scm_timed_wait_condition_variable,
scm_broadcast_condition_variable): New.
(scm_wait_condition_variable): Removed.
2002-10-27 20:12:27 +00:00
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
return 0;
|
2002-10-16 15:54:23 +00:00
|
|
|
}
|
|
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
#endif /* SCM_USE_NULL_THREADS */
|
|
|
|
|
|
2002-10-16 15:54:23 +00:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Local Variables:
|
|
|
|
|
c-file-style: "gnu"
|
|
|
|
|
End:
|
|
|
|
|
*/
|