Add missing <pthread.h> include in rpmsq.h (ticket #87)
[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 <rpm/rpmsw.h>
10 #include <signal.h>
11 #if defined(_RPMSQ_INTERNAL)
12 #include <pthread.h>
13 #endif
14
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18
19 /** \ingroup rpmsq
20  */
21 typedef struct rpmsig_s * rpmsig;
22
23 /** \ingroup rpmsq
24  */
25 typedef struct rpmsqElem * rpmsq;
26
27 /** \ingroup rpmsq
28  * Default signal handler prototype.
29  * @param signum        signal number
30  * @param info          (siginfo_t) signal info
31  * @param context       signal context
32  */
33 #ifdef SA_SIGINFO
34 typedef void (*rpmsqAction_t) (int signum, void * info, void * context);
35 #else
36 typedef void (*rpmsqAction_t) (int signum);
37 #endif
38
39 extern int _rpmsq_debug;
40
41 /* XXX make this fully opaque? */
42 #if defined(_RPMSQ_INTERNAL)
43 /**
44  * SIGCHLD queue element.
45  */
46 struct rpmsqElem {
47     struct rpmsqElem * q_forw;  /*!< for use by insque(3)/remque(3). */
48     struct rpmsqElem * q_back;
49     pid_t child;                /*!< Currently running child. */
50     volatile pid_t reaped;      /*!< Reaped waitpid(3) return. */
51     volatile int status;        /*!< Reaped waitpid(3) status. */
52     struct rpmop_s op;          /*!< Scriptlet operation timestamp; */
53     rpmtime_t ms_scriptlets;    /*!< Accumulated script duration (msecs). */
54     int reaper;                 /*!< Register SIGCHLD handler? */
55     int pipes[2];               /*!< Parent/child interlock. */
56     void * id;                  /*!< Blocking thread id (pthread_t). */
57     pthread_mutex_t mutex;      /*!< Signal delivery to thread condvar. */
58     pthread_cond_t cond;
59 };
60 #endif /* _RPMSQ_INTERNAL */
61
62 /** \ingroup rpmsq
63  * Test if given signal has been caught (while signals blocked).
64  * Similar to sigismember() but operates on internal signal queue.
65  * @param signum        signal to test for
66  * @return              1 if caught, 0 if not and -1 on error
67  */
68 int rpmsqIsCaught(int signum);
69
70 /** \ingroup rpmsq
71  * Default signal handler.
72  * @param signum        signal number
73  * @param info          (siginfo_t) signal info
74  * @param context       signal context
75  */
76 #ifdef SA_SIGINFO
77 void rpmsqAction(int signum, void * info, void * context);
78 #else
79 void rpmsqAction(int signum);
80 #endif
81
82 /** \ingroup rpmsq
83  * Enable or disable a signal handler.
84  * @param signum        signal to enable (or disable if negative)
85  * @param handler       sa_sigaction handler (or NULL to use rpmsqHandler())
86  * @return              no. of refs, -1 on error
87  */
88 int rpmsqEnable(int signum, rpmsqAction_t handler);
89
90 /** \ingroup rpmsq
91  * Fork a child process.
92  * @param sq            scriptlet queue element
93  * @return              fork(2) pid
94  */
95 pid_t rpmsqFork(rpmsq sq);
96
97 /** \ingroup rpmsq
98  * Wait for child process to be reaped.
99  * @param sq            scriptlet queue element
100  * @return              reaped child pid
101  */
102 pid_t rpmsqWait(rpmsq sq);
103
104 /** \ingroup rpmsq
105  * Call a function in a thread.
106  * @param start         function
107  * @param arg           function argument
108  * @return              thread pointer (NULL on error)
109  */
110 void * rpmsqThread(void * (*start) (void * arg), void * arg);
111
112 /** \ingroup rpmsq
113  * Wait for thread to terminate.
114  * @param thread        thread
115  * @return              0 on success
116  */
117 int rpmsqJoin(void * thread);
118
119 /** \ingroup rpmsq
120  * Compare thread with current thread.
121  * @param thread        thread
122  * @return              0 if not equal
123  */
124 int rpmsqThreadEqual(void * thread);
125
126 /** \ingroup rpmsq
127  * Execute a command, returning its status.
128  */
129 int rpmsqExecve (const char ** argv);
130
131 #ifdef __cplusplus
132 }
133 #endif
134
135 #endif  /* H_RPMSQ */