This file is indexed.

/usr/src/blcr-0.8.5/libcr/cr_pthread.c is in blcr-dkms 0.8.5-2.1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
/* 
 * Berkeley Lab Checkpoint/Restart (BLCR) for Linux is Copyright (c)
 * 2003, The Regents of the University of California, through Lawrence
 * Berkeley National Laboratory (subject to receipt of any required
 * approvals from the U.S. Dept. of Energy).  All rights reserved.
 *
 * Portions may be copyrighted by others, as may be noted in specific
 * copyright notices within specific files.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 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
 * Library 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * $Id: cr_pthread.c,v 1.31 2007/09/20 23:53:34 phargrov Exp $
 */

#include <string.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <errno.h>
#include "cr_private.h"

#if PIC && HAVE___REGISTER_ATFORK
// pthread_atfork() handling for shared objects
// glibc has started putting pthread_atfork() in libpthread_nonshared.a, which is causing
// problems when we call from a shared library.  The problem is that the code in the
// static lib gets pulled into libcr.so, but its was not PIC-compiled.
// Therefore, we use our own private re-implementation.
// This implementation is closely based on glibc-2.3.2-20030313/nptl/pthread_atfork.c
extern void *__dso_handle __attribute__((__weak__));
extern int __register_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void), void *dso_handle);
extern int
cri_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void))
{ 
  void *my_handle = &__dso_handle ? __dso_handle : NULL;
  return __register_atfork(prepare, parent, child, my_handle);
}
#endif

// Holds thread-specific data key for cri_info
pthread_key_t cri_info_key;

// atfork callback to reset the state
static void
child_reset(void)
{
    cri_rb_init(&cri_cs_lock);
    cri_atomic_write(&cri_live_count, 0);
    cri_info_free(cri_info_location());
}

#if !HAVE___REGISTER_ATFORK
// Interpose on fork() to ensure the pthreads version is called
// if the caller linked us, but not the pthreads library.
pid_t cri_fork(void)
{
  return __fork();
}
weak_alias(cri_fork,fork);
#endif

//
// Initialize pthread-dependent parts
//
void
cri_pthread_init(void)
{
    int rc;

  #if !HAVE___REGISTER_ATFORK
    // See bug #460
    {
	// dlopen will fail if this is a static exectuable.
	// If so, then the pthread library references must
	// have been resolved.
	void *handle = dlopen(NULL /* the executable */, RTLD_LAZY);
	if (handle) {
	    if (dlsym(handle, "__fork") == dlsym(handle, "__libc_fork")) {
		CRI_ABORT("Unable to ensure pthread_atfork() will run.\n"
			  "If you dlopen(libcr.so) or use some versions of the libraries/loaders, "
			  "then you may need to link libpthread explicitly (or use LD_PRELOAD).");
	    }
	    dlclose(handle);
	}
    }
  #endif /* !HAVE___REGISTER_ATFORK */

    // Install a atfork callback to cleanup state in children
    rc = cri_atfork(NULL, NULL, &child_reset);
    if (rc != 0) {
	CRI_ABORT("cri_atfork() returned %d", rc);
    }

    // Setup the thread-specific data for cri_info
    rc = pthread_key_create(&cri_info_key, &cri_info_free);
    if (rc != 0) {
	CRI_ABORT("pthread_key_create() returned %d", rc);
    }
}