Back to index

lightning-sunbird  0.9+nobinonly
Defines | Functions | Variables
attach.c File Reference
#include "nspr.h"
#include "pprthred.h"
#include "plgetopt.h"
#include <stdio.h>

Go to the source code of this file.

Defines

#define DEFAULT_COUNT   1000

Functions

static void AttachDetach (void)
static void Measure (void(*func)(void), const char *msg)
static voidthreadStartFunc (void *arg)
int main (int argc, char **argv)
 The Xalan testcases app.

Variables

PRIntn failed_already = 0
PRIntn debug_mode
int count

Define Documentation

#define DEFAULT_COUNT   1000

Definition at line 91 of file attach.c.


Function Documentation

static void AttachDetach ( void  ) [static]

Definition at line 100 of file attach.c.

{
    PRThread *me;
    PRInt32 index;

    for (index=0;index<count; index++) {
        me = PR_AttachThread(PR_USER_THREAD, 
                             PR_PRIORITY_NORMAL,
                             NULL);
 
        if (!me) {
            fprintf(stderr, "Error attaching thread %d: PR_AttachThread failed\n",
                  count);
              failed_already = 1;
              return;
        }
        PR_DetachThread();
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

int main ( int  argc,
char **  argv 
)

The Xalan testcases app.

Definition at line 163 of file attach.c.

{
#ifdef _PR_PTHREADS
    int rv;
    pthread_t threadID;
    pthread_attr_t attr;
#elif defined(SOLARIS)
    int rv;
    thread_t threadID;
#elif defined(WIN32)
    DWORD rv;
    unsigned threadID;
    HANDLE hThread;
#elif defined(IRIX)
    int rv;
    int threadID;
#elif defined(OS2)
    int rv;
    TID threadID;
#elif defined(XP_BEOS)
       thread_id threadID;
       int32 threadRV;
       status_t waitRV;
#endif

       /* The command line argument: -d is used to determine if the test is being run
       in debug mode. The regress tool requires only one line output:PASS or FAIL.
       All of the printfs associated with this test has been handled with a if (debug_mode)
       test.
       Usage: test_name [-d] [-c n]
       */
       PLOptStatus os;
       PLOptState *opt = PL_CreateOptState(argc, argv, "dc:");
       while (PL_OPT_EOL != (os = PL_GetNextOpt(opt)))
    {
              if (PL_OPT_BAD == os) continue;
        switch (opt->option)
        {
        case 'd':  /* debug mode */
                     debug_mode = 1;
            break;
        case 'c':  /* loop count */
                     count = atoi(opt->value);
            break;
         default:
            break;
        }
    }
       PL_DestroyOptState(opt);

#if defined(WIN16)
    printf("attach: This test is not valid for Win16\n");
    goto exit_now;
#endif

       if(0 == count) count = DEFAULT_COUNT;     

    /*
     * To force the implicit initialization of nspr20
     */
    PR_SetError(0, 0);
    PR_STDIO_INIT();

    /*
     * Platform-specific code to create a native thread.  The native
     * thread will repeatedly call PR_AttachThread and PR_DetachThread.
     * The primordial thread waits for this new thread to finish.
     */

#ifdef _PR_PTHREADS

    rv = _PT_PTHREAD_ATTR_INIT(&attr);
    if (debug_mode) PR_ASSERT(0 == rv);
       else if (0 != rv) {
              failed_already=1;
              goto exit_now;
       }
       
#ifndef _PR_DCETHREADS
    rv = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    if (debug_mode) PR_ASSERT(0 == rv);
       else if (0 != rv) {
              failed_already=1;
              goto exit_now;
       }
#endif  /* !_PR_DCETHREADS */
    rv = _PT_PTHREAD_CREATE(&threadID, attr, threadStartFunc, NULL);
    if (rv != 0) {
                     fprintf(stderr, "thread creation failed: error code %d\n", rv);
                     failed_already=1;
                     goto exit_now;
       }
       else {
              if (debug_mode)
                     printf ("thread creation succeeded \n");

       }
    rv = _PT_PTHREAD_ATTR_DESTROY(&attr);
    if (debug_mode) PR_ASSERT(0 == rv);
       else if (0 != rv) {
              failed_already=1;
              goto exit_now;
       }
    rv = pthread_join(threadID, NULL);
    if (debug_mode) PR_ASSERT(0 == rv);
       else if (0 != rv) {
              failed_already=1;
              goto exit_now;
       }

#elif defined(SOLARIS)

    rv = thr_create(NULL, 0, threadStartFunc, NULL, 0, &threadID);
    if (rv != 0) {
       if(!debug_mode) {
              failed_already=1;
              goto exit_now;
       } else 
              fprintf(stderr, "thread creation failed: error code %d\n", rv);
    }
    rv = thr_join(threadID, NULL, NULL);
    if (debug_mode) PR_ASSERT(0 == rv);
       else if (0 != rv)
       {
              failed_already=1;
              goto exit_now;
       }


#elif defined(WIN32)

    hThread = (HANDLE) _beginthreadex(NULL, 0, threadStartFunc, NULL,
            0, &threadID); 
    if (hThread == 0) {
        fprintf(stderr, "thread creation failed: error code %d\n",
                GetLastError());
              failed_already=1;
              goto exit_now;
    }
    rv = WaitForSingleObject(hThread, INFINITE);
    if (debug_mode)PR_ASSERT(rv != WAIT_FAILED);
       else if (rv == WAIT_FAILED) {
              failed_already=1;
              goto exit_now;
       }

#elif defined(IRIX)

    threadID = sproc(threadStartFunc, PR_SALL, NULL);
    if (threadID == -1) {

                     fprintf(stderr, "thread creation failed: error code %d\n",
                                   errno);
                     failed_already=1;
                     goto exit_now;
       
       }
       else {
              if (debug_mode) 
                     printf ("thread creation succeeded \n");
              sleep(3);
              goto exit_now;
       }
    rv = waitpid(threadID, NULL, 0);
    if (debug_mode) PR_ASSERT(rv != -1);
       else  if (rv != -1) {
              failed_already=1;
              goto exit_now;
       }

#elif defined(OS2)

# ifdef __EMX__
    threadID = (TID) _beginthread((void *)threadStartFunc, NULL,
            32768, NULL); 
# else
    threadID = (TID) _beginthread((void(* _Optlink)(void*))threadStartFunc, NULL,
            32768, NULL); 
# endif
    if (threadID == -1) {
        fprintf(stderr, "thread creation failed: error code %d\n", errno);
        failed_already=1;
        goto exit_now;
    }
    rv = DosWaitThread(&threadID, DCWW_WAIT);
    if (debug_mode) {
        PR_ASSERT(rv == NO_ERROR);
    } else if (rv != NO_ERROR) {
        failed_already=1;
        goto exit_now;
    }

#elif defined(XP_BEOS)
       
       threadID = spawn_thread(threadStartFunc, NULL, B_NORMAL_PRIORITY, NULL);
       if (threadID <= B_ERROR) {
              fprintf(stderr, "thread creation failed: error code %08lx\n", threadID);
              failed_already = 1;
              goto exit_now;
       }
       if (resume_thread(threadID) != B_OK) {
              fprintf(stderr, "failed starting thread: error code %08lx\n", threadID);
              failed_already = 1;
              goto exit_now;
       }

       waitRV = wait_for_thread(threadID, &threadRV);
       if (debug_mode)
              PR_ASSERT(waitRV == B_OK);
       else if (waitRV != B_OK) {
              failed_already = 1;
              goto exit_now;
       }
       
#else
       if (!debug_mode)
              failed_already=1;
       else   
              printf("The attach test does not apply to this platform because\n"
           "either this platform does not have native threads or the\n"
           "test needs to be written for this platform.\n");
       goto exit_now;
#endif

exit_now:
   if(failed_already)       
              return 1;
       else
              return 0;
}

Here is the call graph for this function:

static void Measure ( void(*)(void func,
const char *  msg 
) [static]

Definition at line 122 of file attach.c.

{
    PRIntervalTime start, stop;
    double d;

    start = PR_IntervalNow();
    (*func)();
    stop = PR_IntervalNow();

    d = (double)PR_IntervalToMicroseconds(stop - start);
       if (debug_mode)
    printf("%40s: %6.2f usec\n", msg, d / count);
}

Here is the caller graph for this function:

static void* threadStartFunc ( void arg) [static]

Definition at line 143 of file attach.c.

{
#ifdef _PR_DCETHREADS
    {
        int rv;
        pthread_t self = pthread_self();
        rv = pthread_detach(&self);
        if (debug_mode) PR_ASSERT(0 == rv);
              else if (0 != rv) failed_already=1;
    }
#endif

    Measure(AttachDetach, "Attach/Detach");

#ifndef IRIX
    return 0;
#endif
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

Definition at line 96 of file attach.c.

PRIntn debug_mode

Definition at line 93 of file attach.c.

PRIntn failed_already = 0

Definition at line 92 of file attach.c.