Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

/*
 * Copyright 1995, Brown University, Providence, RI
 *
 * Permission to use and modify this software and its documentation for
 * any purpose other than its incorporation into a commercial product is
 * hereby granted without fee.  Permission to copy and distribute this
 * software and its documentation only for non-commercial use is also
 * granted without fee, provided, however, that the above copyright notice
 * appear in all copies, that both that copyright notice and this permission
 * notice appear in supporting documentation, that the name of Brown
 * University not be used in advertising or publicity pertaining to
 * distribution of the software without specific, written prior permission,
 * and that the person doing the distribution notify Brown University of
 * such distributions outside of his or her organization. Brown University
 * makes no representations about the suitability of this software for
 * any purpose.  It is provided "as is" without express or implied warranty.
 * Brown University requests notification of any modifications to this
 * software or its documentation.
 *
 * Send the following redistribution information:
 *
 *      Name:
 *      Organization:
 *      Address (postal and/or electronic):
 *
 * To:
 *      Software Librarian
 *      Computer Science Department, Box 1910
 *      Brown University
 *      Providence, RI 02912
 *
 *              or
 *
 *      brusd@cs.brown.edu
 *
 * We will acknowledge all electronic notifications.
 */


/* -------------------------------------------------------------------------
                       Public THREAD include file
   ------------------------------------------------------------------------- */


// Original code by Tom Meyer
// Altered by Loring Holden to work with MPEGmovie object

/* $Id: thread_m.h,v 1.1.1.1 2002-03-29 14:12:59 pj Exp $ */

#ifndef THREAD_MP_HAS_BEEN_INCLUDED
#define THREAD_MP_HAS_BEEN_INCLUDED

#if defined(sol)

#ifdef CPLPLTHREADS
#include "/pro/threadtools/C++_mon/include/c++thread.h"
#else
#include <unistd.h>
#include <thread.h>
#endif
#include <string.h>

#elif defined(hp)
     // No multithreading on the HPs
#elif defined(sgi)
#include <stdio.h>
#include <ulocks.h>
#include <sys/types.h>
#include <sys/resource.h>
#include <sys/prctl.h>
#endif
#include "queue_int.H"

#if defined(sgi)
void THREADprocessor_startup_func(void *proc);
#endif
#if defined(sol)
#ifndef CPLPLTHREADS
void *THREADprocessor_startup_func(void *proc);
#endif
#endif

#if defined(sol)
#if CPLPLTHREADS
class THREAD_processor : public Thread {
#else
class THREAD_processor {
#endif
#else
class THREAD_processor {
#endif
 private:
   void *(*_start_routine)(void *, void *);
   void *_arg, *_arg2;
 protected:
#if defined(sol)
#if CPLPLTHREADS
   Semaphore *sema,*semaDone;
#else
   thread_t thr;
   sema_t sema,semaDone;
#endif
#elif defined(sgi)
   pid_t pid;
   usema_t *_sema,*semaDone;
#else
#endif
  public:
   void startup();
#if defined(sol)
#ifndef CPLPLTHREADS
   virtual void startup_func();
   THREAD_processor();
#endif
#endif
   THREAD_processor(char *name = "", char *thrname = "");
   virtual ~THREAD_processor() {}

   virtual void start_execute(void *(*start_routine)(void *, void *),
                              void *arg, void *arg2);
   virtual int wait_for_done();
   virtual int still_running();
   int running;
};

class THREAD_mp_manager {
 protected:
   int num_procs() const;
   THREAD_mp_manager(int _procs = 0);
};


class THREADprocessor : public THREAD_processor {
 protected:
 public:
   THREADprocessor(char *name = "", char *thrname = "")
   : THREAD_processor(name, thrname) {};
   virtual ~THREADprocessor() {}
};

class THREADmp_manager : public THREAD_mp_manager {
   THREADprocessor **procs;
   int _num_procs;
   void THREADmp_initproc(int i);
   static int procNum;  // just for test
   QUEUEint queue;
 public:
   THREADmp_manager(int _procs = 0);
   virtual ~THREADmp_manager();
   void enqThread(int threadNumber);
   int deqThread();
   
   int num_processes() const { return _num_procs; }
   THREADprocessor *processor(int i) const { return procs[i]; }
   void THREADmp_newproc();
};

#endif