ftp.nice.ch/Attic/openStep/implementation/gnustep/sources/alpha-snapshots/pthreads.0.9.2.tgz#/pthreads-0.9.2/stdlib/c_r.c

This is c_r.c in view mode; [Download] [Up]

#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include "utils.h"

static pthread_attr_t attr;
static pthread_once_t once_init = PTHREAD_ONCE_INIT;

static void
init_attr( void )
{
	pthread_attr_init( &attr );
	(void) pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE );
}

char *h1 = "  Timer          Preemptions     Elapsed Time";
char *h2 = "Interrupts    Async       Sync    Secs:Usec";
char *h3 = "----------    ----------------  --------------";

/*
 * Conditionalize print_system_counters() so that the "printf" functions
 * DO NOT get interpreted as "printf_r".  Since we're going to call printf
 * 6 times in a row, we can take out a single global lock and protect all
 * six calls.  Otherwise, we would take out the global lock everytime a
 * call to printf_r is made.
 */
#ifdef _THREAD_SAFE_
#undef _THREAD_SAFE_
#endif

void
print_system_counters( void )
{
   unsigned long cpu_intr_count, cpu_ctxsw_count, cpu_elapsed_usec,
                 cpu_async_count, seconds, usec;

   (void) system_get_state( &cpu_intr_count, 
                            &cpu_ctxsw_count, 
                            &cpu_async_count,
                            &cpu_elapsed_usec, 
                            NULL );

   seconds = cpu_elapsed_usec / 1000000;
   usec = cpu_elapsed_usec % 1000000;

   pthread_lock_global_np();
   
   printf("\n");
   printf("\t  *** PTHREADS RUNTIME STATS ***\n\n");
   printf("%s\n", h1 );
   printf("%s\n", h2 );
   printf("%s\n", h3 );
   printf("%5ld   %10ld  %8ld %7ld:%ld\n", cpu_intr_count, 
                                           cpu_async_count,
                                           cpu_ctxsw_count, 
                                           seconds, usec );
   printf("\n");

   pthread_unlock_global_np();
}

#define _THREAD_SAFE_ 1

int 
stat_r(const char *file_name, struct stat *buf)
{
   int st;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   st = stat( file_name, buf );
   pthread_unlock_global_np();

   return( st );
}

int
fstat_r(int filedes, struct stat *buf)
{
   int st;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   st = fstat( filedes, buf );
   pthread_unlock_global_np();

   return( st );
}

int 
lstat_r(const char *file_name, struct stat *buf)
{
   int st;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   st = lstat( file_name, buf );
   pthread_unlock_global_np();

   return( st );
}

void
error_msg( const char *msg )
{
   int err;

	(void) pthread_once( &once_init, init_attr );

   (void) pthread_get_errno_np( NULL, &err );
   pthread_lock_global_np();
   fprintf( stderr, ">> %s failed: %s\n", msg, sys_errlist[err] );
   pthread_unlock_global_np();
}   

int
create_joinable( pthread_t *th, thread_proc_t proc, void *arg )
{
	int status;

	(void) pthread_once( &once_init, init_attr );
	status = pthread_create( th, &attr, proc, arg );
	return( status );
}

void *
malloc_r( size_t nbytes )
{
	void *ptr;

	(void) pthread_once( &once_init, init_attr );

	pthread_lock_global_np();
	ptr = malloc( nbytes );
	pthread_unlock_global_np();

	return( ptr );
}

void
free_r( void *ptr )
{
	(void) pthread_once( &once_init, init_attr );

	pthread_lock_global_np();
	free( ptr );
	pthread_unlock_global_np();
}


int
output_r( FILE *stream, const char *string )
{
	int nchars;

	(void) pthread_once( &once_init, init_attr );

	pthread_lock_global_np();
	nchars = fprintf( stream, "%s\n", string );
	pthread_unlock_global_np();

	return( nchars );
}

int
fprintf_r( FILE *fp, const char *fmt, ...)
{
   int ret;
   va_list ap;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();

   va_start(ap, fmt);
   ret = vfprintf(fp, fmt, ap);
   va_end(ap);

   pthread_unlock_global_np();
   return (ret);
}

int
printf_r( const char *fmt, ...)
{
   int ret;
   va_list ap;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();

   va_start(ap, fmt);
   ret = vfprintf(stdout, fmt, ap);
   va_end(ap);

   pthread_unlock_global_np();
   return (ret);
}

struct dirent *
readdir_r( DIR *dir )
{
   struct dirent *dent;

   (void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   dent = readdir( dir );
   pthread_unlock_global_np();

   return( dent );
}

DIR *
opendir_r( const char *name )
{
   DIR *dp;

   (void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   dp = opendir( name );
   pthread_unlock_global_np();

   return( dp );
}

int
closedir_r( DIR *dir )
{
   int st;

   (void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   st = closedir( dir );
   pthread_unlock_global_np();

   return( st );
}
   
char *
strchr_r( const char *s, int c )
{
   char *ch;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   ch = strchr(s,c);
   pthread_unlock_global_np();

   return( ch );
}

char *
strrchr_r( const char *s, int c )
{
   char *ch;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   ch = strrchr(s,c);
   pthread_unlock_global_np();

   return( ch );
}

char *
strcpy_r( char *dest, const char *src )
{
	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   strcpy( dest, src );
   pthread_unlock_global_np();

   return( dest );
}

char *
strncpy_r( char *dest, const char *src, size_t n )
{
	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   strncpy( dest, src, n );
   pthread_unlock_global_np();

   return( dest );
}

size_t
strlen_r( const char *s )
{
   size_t len;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   len = strlen( s );
   pthread_unlock_global_np();

   return( len );
}

int
strcmp_r( const char *s1, const char *s2 )
{
   int n;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   n = strcmp( s1, s2 );
   pthread_unlock_global_np();

   return( n );
}

int
strncmp_r( const char *s1, const char *s2, size_t p )
{
   int n;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   n = strncmp( s1, s2, p );
   pthread_unlock_global_np();

   return( n );
}

long
strtol_r( const char *nptr, char **endptr, int base )
{
   long n;

	(void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   n = strtol( nptr, endptr, base );
   pthread_unlock_global_np();

   return( n );
}

char *
strerror_r( int errno )
{
   char *err;

   (void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   err = strerror( errno );
   pthread_unlock_global_np();

   return( err );
}

char *
strcat_r( char *dest, const char *src )
{
   (void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   strcat( dest, src );
   pthread_unlock_global_np();

   return( dest );
}

char *
strncat_r( char *dest, const char *src, size_t n )
{
   (void) pthread_once( &once_init, init_attr );

   pthread_lock_global_np();
   strncat( dest, src, n );
   pthread_unlock_global_np();

   return( dest );
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.