Repair rdtsc stopwatch, use gettimeofday(3) for now.
[platform/upstream/rpm.git] / rpmio / rpmsq.h
1 #ifndef H_RPMSQ
2 #define H_RPMSQ
3
4 /** \ingroup rpmio
5  * \file rpmio/rpmsq.h
6  *
7  */
8
9 #include <pthread.h>
10 #include <signal.h>
11 #include <sys/signal.h>
12 #include <search.h>             /* XXX insque(3)/remque(3) protos. */
13
14 #include <rpmsw.h>
15
16 typedef struct rpmsig_s * rpmsig;
17
18 typedef struct rpmsqElem * rpmsq;
19
20 typedef void (*rpmsqAction_t) (int signum, siginfo_t *info, void *context)
21         /*@*/;
22
23 /*@-redecl@*/
24 /*@unchecked@*/
25 extern int _rpmsq_debug;
26 /*@=redecl@*/
27
28 /**
29  * SIGCHLD queue element.
30  */
31 struct rpmsqElem {
32     struct rpmsqElem * q_forw;  /*!< for use by insque(3)/remque(3). */
33     struct rpmsqElem * q_back;
34     pid_t child;                /*!< Currently running child. */
35     volatile pid_t reaped;      /*!< Reaped waitpid(3) return. */
36     volatile int status;        /*!< Reaped waitpid(3) status. */
37     struct rpmsw_s begin;       /*!< Start time. */
38     rpmtime_t msecs;            /*!< Instance duration (msecs). */
39     rpmtime_t script_msecs;     /*!< Accumulated script duration (msecs). */
40     int reaper;                 /*!< Register SIGCHLD handler? */
41     int pipes[2];               /*!< Parent/child interlock. */
42     void * id;                  /*!< Blocking thread id (pthread_t). */
43     pthread_mutex_t mutex;      /*!< Signal delivery to thread condvar. */
44     pthread_cond_t cond;
45 };
46
47 /*@unchecked@*/
48 extern rpmsq rpmsqQueue;
49
50 /*@unchecked@*/
51 extern sigset_t rpmsqCaught;
52
53 #ifdef __cplusplus
54 {
55 #endif
56
57 /**
58  */
59 int rpmsqInsert(/*@null@*/ void * elem, /*@null@*/ void * prev)
60         /*@globals rpmsqQueue @*/
61         /*@modifies elem, rpmsqQueue @*/;
62
63 /**
64  */
65 int rpmsqRemove(/*@null@*/ void * elem)
66         /*@modifies elem @*/;
67
68 /**
69  */
70 void rpmsqAction(int signum, siginfo_t * info, void * context)
71         /*@globals rpmsqCaught, fileSystem @*/
72         /*@modifies rpmsqCaught, fileSystem @*/;
73
74 /**
75  * Enable or disable a signal handler.
76  * @param signum        signal to enable (or disable if negative)
77  * @param handler       sa_sigaction handler (or NULL to use rpmsqHandler())
78  * @return              no. of refs, -1 on error
79  */
80 int rpmsqEnable(int signum, /*@null@*/ rpmsqAction_t handler)
81         /*@globals rpmsqCaught, fileSystem, internalState @*/
82         /*@modifies rpmsqCaught, fileSystem, internalState @*/;
83
84 /**
85  * Fork a child process.
86  * @param sq            scriptlet queue element
87  * @return              fork(2) pid
88  */
89 pid_t rpmsqFork(rpmsq sq)
90         /*@globals fileSystem, internalState @*/
91         /*@modifies sq, fileSystem, internalState @*/;
92
93 /**
94  * Wait for child process to be reaped.
95  * @param sq            scriptlet queue element
96  * @return              reaped child pid
97  */
98 pid_t rpmsqWait(rpmsq sq)
99         /*@globals fileSystem, internalState @*/
100         /*@modifies sq, fileSystem, internalState @*/;
101
102 /**
103  * Call a function in a thread synchronously.
104  * @param start         function
105  * @param arg           function argument
106  * @return              0 on success
107  */
108 int rpmsqThread(void * (*start) (void * arg), void * arg)
109         /*@globals fileSystem, internalState @*/
110         /*@modifies fileSystem, internalState @*/;
111
112 /**
113  * Execute a command, returning its status.
114  */
115 int rpmsqExecve (const char ** argv)
116         /*@*/;
117
118 #ifdef __cplusplus
119 }
120 #endif
121
122 #endif  /* H_RPMSQ */