[an error occurred while processing this directive]

HP OpenVMS Systems

Ask the Wizard
» 

HP OpenVMS Systems

OpenVMS information

» What's new on our site
» Upcoming events
» Configuration and buying assistance
» Send us your comments

HP OpenVMS systems

» OpenVMS software
» Supported Servers
» OpenVMS virtualization
» OpenVMS solutions and partners
» OpenVMS success stories
» OpenVMS service and support
» OpenVMS resources and information
» OpenVMS documentation
» Education and training

Quick Links

» Non-javascript page
» Ask the Wizard
» OpenVMS FAQ

Test Drive OpenVMS

» OpenVMS I64 test drive
» Java test drive

Other information resources available to you include:

» OpenVMS freeware
» ECO kits, software and hardware support, prior version support
» Alpha SRM, ARC, and AlphaBIOS firmware updates
» ENCOMPASS - HP user group
» OpenVMS software downloads, OpenVMS freeware CD-ROM
» OpenVMS firmware locations
» DECconnect passive adaptor charts
» Cables reference guide
» MicroVAX console commands
» OpenVMS student research

Select a topic below to see Questions Frequently Asked by partners

» Using the online documentation library(installing BNU from the asap SDK)
» Global sections(how to create and use.)
» xx$CREATE_BUFOBJ system service(usage)
» Ethernet address(methods of determination)
» Shareable images(cookbook approach to creating one)
» Sharing data/code at absolute addresses(a guide with examples)
» Determining the Alpha microprocessor
» Using GETSYI to get hardware status

Evolving business value

» Business Systems Evolution
» AlphaServer systems transition planning
» Alpha RetainTrust program

Related links

» HP Integrity servers
» HP Alpha systems
» HP storage
» HP software
» HP products and services
» HP solutions
» HP support
disaster proof
HP Integrity server animation
HP Integrity server animation
Content starts here

Ask the Wizard Questions

C program debugging

The Question is:

Why does the following C program that uses pthreads only
work if I define the mutex to be a fast mutex.  In this
particular case, if I use a nonrecursive mutex, the mutex
unlock routine returns a status of -1.  Any ideas?
==========================================================

#include 
#include 
#include 

static void mutex_init_c(pthread_mutex_t *mutex_handle,
                         int             *status)
{
   pthread_mutexattr_t attribute;

   *status = pthread_mutexattr_create (&attribute);
   *status = pthread_mutexattr_setkind_np (&attribute, MUTEX_NONRECURSIVE_NP);


   if (*status == 0)
   {
      *status =  pthread_mutex_init (mutex_handle, attribute);
   }

   return;
}
static int mutex_lock_c(pthread_mutex_t *mutex_handle)
{
   int status = 0;

   if (status = 0)
   {
      status = pthread_mutex_lock (mutex_handle);
   }

   return(status);
}


static int mutex_unlock_c(pthread_mutex_t *mutex_handle)
{
   int status = 0;

   status = pthread_mutex_unlock (mutex_handle);
   return(status);

}main()
{
   int             status = 0;
   pthread_mutex_t mutex;

   mutex_init_c(&mutex, &status);
   printf("The status for mutex init is : ");
   printf("%d \n",status);

   status = pthread_setasynccancel(CANCEL_OFF);
   status = mutex_lock_c(&mutex);
   printf("The status for mutex lock is : ");
   printf("%d \n",status);

   status = sleep(2);

   status = mutex_unlock_c(&mutex);
   printf("The status for mutex unlock is : ");
   printf("%d \n",status);

}


The Answer is:

>   if (status = 0)
>   {
>      status = pthread_mutex_lock (mutex_handle);
>   }

    pthread_mutex_lock will never be called !

    The code should probably have read 'if (status == 0)'.
    I dont see the point of testing the value of status, as it has just
    been set to 0 anyway.

    I suspect that the mutex_unlock_c will appear to work for a fast mutex as
    very few checks are made for fast mutexes, so it will not be noticed
    that the mutex was not previously locked.