Fork.cpp 3.11 KB
Newer Older
1 2
/**************************************************************************/
/*                                                                        */
3 4 5 6 7 8
/* Copyright (c) 2001, 2011 NoMachine (http://www.nomachine.com)          */
/* Copyright (c) 2008-2014 Oleksandr Shneyder <o.shneyder@phoca-gmbh.de>  */
/* Copyright (c) 2014-2016 Ulrich Sibiller <uli42@gmx.de>                 */
/* Copyright (c) 2014-2016 Mihai Moldovan <ionic@ionic.de>                */
/* Copyright (c) 2011-2016 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>*/
/* Copyright (c) 2015-2016 Qindel Group (http://www.qindel.com)           */
9 10
/*                                                                        */
/* NXCOMP, NX protocol compression and NX extensions to this software     */
11
/* are copyright of the aforementioned persons and companies.             */
12
/*                                                                        */
13 14 15
/* Redistribution and use of the present software is allowed according    */
/* to terms specified in the file LICENSE.nxcomp which comes in the       */
/* source distribution.                                                   */
16 17 18
/*                                                                        */
/* All rights reserved.                                                   */
/*                                                                        */
19 20 21 22 23
/* NOTE: This software has received contributions from various other      */
/* contributors, only the core maintainers and supporters are listed as   */
/* copyright holders. Please contact us, if you feel you should be listed */
/* as copyright holder, as well.                                          */
/*                                                                        */
24 25
/**************************************************************************/

26 27 28 29
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

30 31
#include <unistd.h>

32
#include "Fork.h"
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
#include "Misc.h"
#include "Timestamp.h"

//
// Set the verbosity level.
//

#define PANIC
#define WARNING
#undef  TEST
#undef  DEBUG

//
// Only on Cygwin, retry n times waiting a
// given amount of milliseconds after each
// attempt.
//

#define RETRY_LIMIT    30
#define RETRY_TIMEOUT  1000

int Fork()
{
  #ifdef __CYGWIN32__

  int limit   = RETRY_LIMIT;
  int timeout = RETRY_TIMEOUT;

  #else

  int limit   = 1;
  int timeout = 0;

  #endif

  int pid = 0;

  for (int i = 0; i < limit; i++)
  {
    #ifdef TEST
    *logofs << "Fork: Trying at " << strMsTimestamp()
            << ".\n" << logofs_flush;
    #endif

    //
    // It could optionally try again only if the
    // error code is 11, 'Resource temporarily
    // unavailable'.
    //

    if ((pid = fork()) >= 0)
    {
      break;
    }
    else if (i < limit - 1)
    {
      #ifdef WARNING
      *logofs << "Fork: WARNING! Function fork failed. "
              << "Error is " << EGET() << " '" << ESTR()
              << "'. Retrying...\n" << logofs_flush;
      #endif

      usleep(timeout * 1000);
    }
  }

  #ifdef TEST

  if (pid <= 0)
  {
    *logofs << "Fork: Returning at " << strMsTimestamp()
            << ".\n" << logofs_flush;
  }

  #endif

  return pid;
}