-#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_SB_LUTEX)
-/* saving lutexes in the core */
-static void **lutex_addresses;
-static long n_lutexes = 0;
-static long max_lutexes = 0;
-
-static long
-default_scan_action(lispobj *obj)
-{
- return (sizetab[widetag_of(*obj)])(obj);
-}
-
-static long
-lutex_scan_action(lispobj *obj)
-{
- /* note the address of the lutex */
- if(n_lutexes >= max_lutexes) {
- max_lutexes *= 2;
- lutex_addresses = realloc(lutex_addresses, max_lutexes * sizeof(void *));
- gc_assert(lutex_addresses);
- }
-
- lutex_addresses[n_lutexes++] = obj;
-
- return (*sizetab[widetag_of(*obj)])(obj);
-}
-
-typedef long (*scan_table[256])(lispobj *obj);
-
-static void
-scan_objects(lispobj *start, long n_words, scan_table table)
-{
- lispobj *end = start + n_words;
- lispobj *object_ptr;
- long n_words_scanned;
- for (object_ptr = start;
- object_ptr < end;
- object_ptr += n_words_scanned) {
- lispobj obj = *object_ptr;
-
- n_words_scanned = (table[widetag_of(obj)])(object_ptr);
- }
-}
-
-static void
-scan_for_lutexes(lispobj *addr, long n_words)
-{
- static int initialized = 0;
- static scan_table lutex_scan_table;
-
- if (!initialized) {
- int i;
-
- /* allocate a little space to get started */
- lutex_addresses = malloc(16*sizeof(void *));
- gc_assert(lutex_addresses);
- max_lutexes = 16;
-
- /* initialize the mapping table */
- for(i = 0; i < ((sizeof lutex_scan_table)/(sizeof lutex_scan_table[0])); ++i) {
- lutex_scan_table[i] = default_scan_action;
- }
-
- lutex_scan_table[LUTEX_WIDETAG] = lutex_scan_action;
-
- initialized = 1;
- }
-
- /* do the scan */
- scan_objects(addr, n_words, lutex_scan_table);
-}
-#endif
-