The header file is included in all the program. Hope it will compile fine...



On Sat, 30 Aug 2008 John Matthews wrote :
>--- In [email protected], kumars <[EMAIL PROTECTED]> wrote:
> >
> >
> > Could anyone please spend their precious time to look into the
>problem I am
> > facing......
>
>How do you build it? For example, your main.c doesn't include any
>header files so doesn't compile as it is.
>
>John
>

  ----------

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/signal.h>


/********************* User Defined Data ***************/

#define MAX_THREAD_NUMBER       5000
#define MAX_WRITER_NUMBER       100
#define MAX_READER_NUMBER       400
#define DEFAULT_NUM_READERS     2
#define DEFAULT_NUM_WRITERS     2
#define SHMEM_MODE              (SHM_R | SHM_W)
#define DEFAULT_SHMEM_SIZE      20000
#define MB                      (1024*1024)
#define MAX_SHMEM_NUMBER        11



#define USAGE   "\nUsage: %s [-r num_readers] [-w num_writers] [-s shmem_size]\n
\n" \
                "\t-r num_readers  number of reader thread to create\n" \
                "\t-w num_writers  number of writer thread to create\n" \
                "\t-s buffer_size  size of shmem segments in bytes\n"   \
                "\t                must be less than 256MB\n\n"



/************ Global Functions ****************/

int  parse_args(int , char **);
int *reader(void *);
int *writer(void *);
int  error(const char *, int);
int  release();
/*int sys_error(const char *, int);*/


/************ Global Variables ****************/

pthread_t *writer_th;
pthread_t *reader_th;


int              thread_hold[MAX_WRITER_NUMBER];
pthread_mutex_t  cond_mutex[MAX_WRITER_NUMBER];
pthread_mutex_t  mutex_r[MAX_WRITER_NUMBER];
pthread_cond_t   cond_var[MAX_WRITER_NUMBER];


int           *read_count[MAX_WRITER_NUMBER];
char          *shmptr[MAX_WRITER_NUMBER];
unsigned long *checksum[MAX_WRITER_NUMBER];
unsigned long cksum[MAX_WRITER_NUMBER];


int      shmem_size = DEFAULT_SHMEM_SIZE;
pid_t    parent_pid;


int      num_readers = DEFAULT_NUM_READERS;
int      buffer_size = DEFAULT_SHMEM_SIZE;
int      num_writers = DEFAULT_NUM_WRITERS;
int      shmid[MAX_THREAD_NUMBER + MAX_WRITER_NUMBER];
  ----------

#include "header.h"


int main (int argc, char **argv)
{
        pthread_attr_t  newattr; 
        int     i;              
        int     j;              
        int     k;              
        size_t Size;            
        unsigned long *ulptr;   
        parse_args (argc, argv);
        printf ("%s: IPC Shared Memory TestSuite program\n", *argv);
        printf ("\tNumber of writers    = %d\n", num_writers);
        printf ("\tNumber of readers    = %d\n", num_readers);
        printf ("\tBytes per writer     = %d\n", buffer_size);
        for (i=0; i<num_writers; i++) 
        {j=i*3;
        Size=sizeof (int);
        if ((shmid[j] = shmget (IPC_PRIVATE, Size, SHMEM_MODE)) < 0)
        sys_error ("read_count shmget failed", __LINE__);
        if ((long)(read_count[i] = (int *) shmat (shmid[j], 0, 0)) == -1)
        sys_error ("shmat failed", __LINE__);
        *(read_count[i]) = 0;
        j++;
        Size=sizeof (unsigned long) * num_readers;
        if ((shmid[j] = shmget (IPC_PRIVATE, Size, SHMEM_MODE)) < 0)
        sys_error("checksum shmget failed", __LINE__);
        if ((long)(checksum[i] = (unsigned long *) shmat (shmid[j], 0, 0)) == 
-1)
        sys_error("shmat failed", __LINE__);
        ulptr=checksum[i];
        for (k=0; k < num_readers; k++)
        {
        *ulptr = 0;
        ulptr++;
        }

        Size=buffer_size;
        j++;

        if ((shmid[j] = shmget (IPC_PRIVATE, Size, SHMEM_MODE)) < 0)
                sys_error ("shmptr shmget failed", __LINE__);
        if ((long)(shmptr[i] = shmat (shmid[j], 0, 0)) == -1)
                sys_error ("shmat failed", __LINE__);
        }
        writer_th = (pthread_t *) malloc ((size_t) (num_writers \
                                                   * sizeof (pthread_t)));
        reader_th = (pthread_t *) malloc ((size_t) (num_writers \
                                     * num_readers * sizeof (pthread_t)));
        for (i=0; i<num_writers; i++) {
        if (pthread_mutex_init(&mutex_r[i] , (pthread_mutexattr_t *)NULL) != 0)
                sys_error ("Can't initialize mutex_r", __LINE__);
        if (pthread_mutex_init (&cond_mutex[i], (pthread_mutexattr_t *)NULL))
                sys_error ("Can't initialize cond_mutex", __LINE__);
        if (pthread_cond_init (&cond_var[i], (pthread_condattr_t *)NULL))
                sys_error ("cond_init(&cond_var) failed", __LINE__);
        thread_hold[i]=1;
        }
        if (pthread_attr_init(&newattr))
               sys_error ("attr_init(&newattr) failed", __LINE__);
#ifdef _LINUX_
        /* the DEFAULT state for linux pthread_create is to be 
        "undetatched" or joinable */

        /* if (pthread_attr_setdetachstate (&newattr, PTHREAD_CREATE_JOINABLE))
                sys_error ("attr_setdetachstate(&newattr) failed", __LINE__);*/
#else
        if (pthread_attr_setdetachstate (&newattr, PTHREAD_CREATE_UNDETACHED))
                sys_error ("attr_setdetachstate(&newattr) failed", __LINE__);
#endif
        for (i = 0; i < num_writers; i++)
        {
                if (pthread_create (&writer_th[i], &newattr, writer,\
                                                       (void *) (long)i))
                        sys_error ("writer: pthread_create failed",\
                                                                __LINE__);
        k=i*num_readers;
        for (j = k; j < (k + num_readers) ; j++)
        {
                if (pthread_create (&reader_th[j], &newattr, reader,\
                                                        (void *) (long)j))
                        sys_error ("reader: pthread_create failed",\
                                                                  __LINE__);
        }
        }


        for (i = 0; i < num_writers; i++)
        {
               if (pthread_join( writer_th[i], NULL)) {
                        printf("writer_th: pthread_join return: %d\n",i);
                        sys_error("pthread_join bad status", __LINE__);
                }
        k=i*num_readers;
        for (j = k; j < (k + num_readers) ; j++)
        {
               if (pthread_join( reader_th[j], NULL)) {
                        printf("reader_th: pthread_join return: %d\n",j);
                        sys_error("pthread_join bad status", __LINE__);
                }
        }
        }
        for (i = 0; i < num_writers; i++)
        {
        ulptr=checksum[i];
        for (j=0; j<num_readers; j++) {

                if (cksum[i] != *ulptr ) 
                        error ("checksums do not match", __LINE__); 
                
                }
        }
        printf ("\n\tMain: readers calculated segment successfully\n");

        release();
        printf ("\nsuccessful!\n");

        return (0);
}

  ----------

#include "header.h"


int parse_args (int argc, char **argv)
{
        int     i;
        int     errflag = 0;
        char    *program_name = *argv;
        extern char     *optarg;        /* Command line option */

        while ((i = getopt(argc, argv, "c:s:g:?")) != EOF) {
                switch (i) {
                        case 'c':
                                num_readers = atoi (optarg);
                                break;
                        case 's':
                                buffer_size = atoi (optarg);
                                break;
                        case 'g':               /* number of group */
                                num_writers = atoi (optarg);
                                break;
                        case '?':
                                errflag++;
                                break;
                }
        }
        if (num_writers >= MAX_WRITER_NUMBER) {
                errflag++;
                fprintf (stderr, "ERROR: num_writers must be less\ 
                                       than %d\n", MAX_WRITER_NUMBER);
        }
        if (num_readers >= MAX_READER_NUMBER) {
                errflag++;
                fprintf (stderr, "ERROR: num_readers must be less\
                                        than %d\n", MAX_READER_NUMBER);
        }
        i=num_readers*num_writers;
        if (i >= MAX_THREAD_NUMBER) {
                errflag++;
                fprintf (stderr, "ERROR: maximun threads number\
                         must be less than %d\n", MAX_THREAD_NUMBER);
        }

        if (errflag) {
                fprintf (stderr, USAGE, program_name);
                exit (2);
        }
}


int release ()
{
        int i;
        int j;
        for (i=0; i<num_writers; i++) {
        if (pthread_mutex_destroy(&cond_mutex[i]) != 0)
                sys_error ("Can't destroy cond_mutex", __LINE__);
        if (pthread_mutex_destroy(&mutex_r[i]) != 0)
                sys_error ("Can't destroy mutex_r", __LINE__);
        }


        for (i=0; i<num_writers; i++) {
        /*
         * Release shared memory regions
         */
        j=i*3;
        if (shmctl (shmid[j], IPC_RMID, 0) < 0)
                sys_error ("read_count shmctl failed", __LINE__);
        j++;
        if (shmctl (shmid[j], IPC_RMID, 0) < 0)
                sys_error ("checksum shmctl failed", __LINE__);
        j++;
        if (shmctl (shmid[j], IPC_RMID, 0) < 0)
                sys_error ("shmptr shmctl failed", __LINE__);

        }
}


int sys_error (const char *msg, int line)
{
        char syserr_msg [256];

        sprintf (syserr_msg, "%s: %s\n", msg, strerror (errno));
        error (syserr_msg, line);
}

int error (const char *msg, int line)
{
        fprintf (stderr, "ERROR [line: %d] %s\n", line, msg);
        if ( line >= 260 )
        release ();
        exit (-1);
}
  ----------

#include "header.h"


int *reader (int *parm)
{
        int num_p = (int) (long)parm;
        unsigned long cksum_r = 0;      /* Shared memory regions checksum */
        int     i;                      /* Misc index */
        int     num_r;                  /* Misc index */
        int     num_w;                  /* Misc index */
        char    * ptr;                  /* Misc pointer */
        unsigned long *ulptr_r;   /* Misc pointer */
        
        /*
         * Wait for a READ_COUNT lock on the shared memory segment, then
         * compute the checksum and release the READ_COUNT lock.      
         */

        num_r=num_p % num_readers;
        num_w=num_p - num_r;
        num_w=num_w / num_readers;
        ptr=shmptr[num_w];
        ulptr_r=checksum[num_w];

        if (pthread_mutex_lock (&cond_mutex[num_w]))
                sys_error ("Can't take cond lock", __LINE__);
        /*
         * Check to see if we need to wait: if yes, wait for the condition
         * variable (blocking wait).
         */
        while (thread_hold[num_w])
        {
                if (pthread_cond_wait (&cond_var[num_w], &cond_mutex[num_w]))
                        sys_error ("cond_wait failed", __LINE__);
        }
        if (pthread_mutex_unlock (&cond_mutex[num_w]))
                sys_error ("Can't release cond lock", __LINE__);

        if (pthread_mutex_lock(&mutex_r[num_w]))
                sys_error ("Can't take read lock", __LINE__);

        (*(read_count [num_w]))++;

        if (pthread_mutex_unlock(&mutex_r[num_w]))
                sys_error ("Can't release read lock", __LINE__);

        for (i=0; i<buffer_size; i++)
                cksum_r += *ptr++;

        if (pthread_mutex_lock(&mutex_r[num_w]))
                sys_error ("Can't take read lock", __LINE__);
        (*(read_count[num_w]))--;
        if (pthread_mutex_unlock(&mutex_r[num_w]))
                sys_error ("Can't release 1 read lock", __LINE__);

        /*
         * Store the resulting checksum and print out a message
         */
        
        *ulptr_r = cksum_r;
        printf ("\t\treader (%03d) of writer (%03d): checksum %08lx\n", \
                                                  num_r, num_w, cksum_r); 
        return NULL;
}
  ----------

#include "header.h"


int *writer (int *parm)
{
        int num_w = (int) (long)parm;
        unsigned long cksum_w = 0;
        char    data = 0;  
        char    *ptr;      

        data = num_w;

        for (ptr=shmptr[num_w]; ptr < (shmptr[num_w]+buffer_size); ptr++) {
                *ptr = data++;
                cksum_w += *ptr;
        }
        if (pthread_mutex_lock (&cond_mutex[num_w]))
                sys_error ("mutex_lock(&cond_mutex) failed", __LINE__);

        thread_hold[num_w]=0;

        if (pthread_cond_broadcast (&cond_var[num_w]))
                sys_error ("cond_signal(&cond_var) failed", __LINE__);
        if (pthread_mutex_unlock (&cond_mutex[num_w]))
                sys_error ("mutex_unlock(&cond_mutex) failed", __LINE__);


        cksum[num_w] = cksum_w;
        printf ("\t\twriter (%03d): shared memory checksum %08lx\n", \
                                                   num_w, cksum_w);

        return NULL;
}

[Non-text portions of this message have been removed]

Reply via email to