/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : semtest.cc                                                    */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <stdio.h>
#include <semaphore.h>
#include <malloc.h>
#include <unistd.h>
#include <errno.h>

/*
El lame-o maximo program to determine number of semaphores in use.
*/

int main(int argc, char **argv)
{
  int maxSemaphores = 128;
  int napTime = 2;

  sem_t *sem = (sem_t *)malloc(maxSemaphores * sizeof(sem_t));

  if (!sem) {
    fprintf(stderr, "Couldn't malloc %d semaphores\n", maxSemaphores);
    return 1;
  }

  while (1) {

    int nFree;
 
    for (nFree = 0; ; nFree++) {

      if (sem_init(&sem[nFree], 0, 0) == -1) {
	if (errno == EAGAIN)
	  // Out of semaphores
	  break;
	else {
	  perror("sem_init()");
	  return 1;
	}
      }
    }
    
    fprintf(stdout, "%d semaphores in use\n", maxSemaphores - nFree);

    for (int i = 0; i < nFree; i++) {
      sem_destroy(&sem[i]);
    }

    sleep(napTime);
  }
}
