~ubuntu-branches/debian/sid/gearmand/sid

« back to all changes in this revision

Viewing changes to libgearman-server/timer.cc

  • Committer: Package Import Robot
  • Author(s): Stig Sandbeck Mathisen
  • Date: 2012-05-01 20:43:47 UTC
  • mfrom: (1.1.8)
  • Revision ID: package-import@ubuntu.com-20120501204347-qaifvvjkktvc9upu
Tags: 0.32-1
* Imported Upstream version 0.32
* Remove spelling patch included upstream
* Remove documentation patch, we do not rebuild documentation
* Remove memcached patch, fixed upstream
* Use dh_autoreconf
* Use copyright format 1.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 
2
 * 
 
3
 *  Gearmand client and server library.
 
4
 *
 
5
 *  Copyright (C) 2012 Data Differential, http://datadifferential.com/ All
 
6
 *  rights reserved.
 
7
 *
 
8
 *  Redistribution and use in source and binary forms, with or without
 
9
 *  modification, are permitted provided that the following conditions are
 
10
 *  met:
 
11
 *
 
12
 *      * Redistributions of source code must retain the above copyright
 
13
 *  notice, this list of conditions and the following disclaimer.
 
14
 *
 
15
 *      * Redistributions in binary form must reproduce the above
 
16
 *  copyright notice, this list of conditions and the following disclaimer
 
17
 *  in the documentation and/or other materials provided with the
 
18
 *  distribution.
 
19
 *
 
20
 *      * The names of its contributors may not be used to endorse or
 
21
 *  promote products derived from this software without specific prior
 
22
 *  written permission.
 
23
 *
 
24
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
25
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 
26
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 
27
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 
28
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
29
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 
30
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
31
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
32
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
33
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 
34
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
35
 *
 
36
 */
 
37
 
 
38
#include <config.h>
 
39
 
 
40
#include <libgearman-server/common.h>
 
41
#include <libgearman-server/gearmand.h>
 
42
 
 
43
#include <libgearman-server/timer.h>
 
44
 
 
45
#include <cerrno>
 
46
#include <cstring>
 
47
#include <ctime>
 
48
#include <pthread.h>
 
49
#include <signal.h>
 
50
 
 
51
static pthread_once_t start_key_once= PTHREAD_ONCE_INIT;
 
52
static pthread_t thread_id;
 
53
 
 
54
static struct timeval current_epoch;
 
55
 
 
56
static void* current_epoch_handler(void*)
 
57
{
 
58
  gearmand_debug("staring up Epoch thread");
 
59
 
 
60
  pollfd fds[1];
 
61
  while (true)
 
62
  {
 
63
    memset(fds, 0, sizeof(pollfd));
 
64
    fds[0].fd= -1; //STDIN_FILENO;
 
65
    fds[0].events= POLLIN;
 
66
    fds[0].revents= 0;
 
67
 
 
68
    int error;
 
69
    if ((error= poll(fds, 1, 1000)) == -1)
 
70
    {
 
71
      switch (errno)
 
72
      {
 
73
      case EINTR: // Shutdown
 
74
        pthread_exit(NULL);
 
75
 
 
76
      default:
 
77
        gearmand_perror("poll");
 
78
      }
 
79
    }
 
80
    gettimeofday(&current_epoch, NULL);
 
81
  }
 
82
 
 
83
  pthread_exit(NULL);
 
84
}
 
85
 
 
86
static void startup(void)
 
87
{
 
88
  gettimeofday(&current_epoch, NULL);
 
89
 
 
90
  int error;
 
91
  if ((error= pthread_create(&thread_id, NULL, current_epoch_handler, NULL)))
 
92
  {
 
93
    fprintf(stderr, "pthread_create failed\n");
 
94
  }
 
95
}
 
96
 
 
97
namespace libgearman {
 
98
namespace server {
 
99
 
 
100
Epoch::Epoch()
 
101
{
 
102
  (void) pthread_once(&start_key_once, startup);
 
103
}
 
104
 
 
105
Epoch::~Epoch()
 
106
{
 
107
  gearmand_debug("shutting down Epoch thread");
 
108
  int error;
 
109
  if ((error= pthread_kill(thread_id, SIGTERM)) != 0)
 
110
  {
 
111
    errno= error;
 
112
    gearmand_perror("pthread_kill(thread_id, SIGTERM)");
 
113
  }
 
114
  pthread_join(thread_id, 0);
 
115
 
 
116
  gearmand_debug("shutdown of Epoch completed");
 
117
}
 
118
 
 
119
struct timeval Epoch::current()
 
120
{
 
121
  return current_epoch;
 
122
}
 
123
 
 
124
} // server
 
125
} // libgearman