1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
#ifndef H_RPMSQ
#define H_RPMSQ
/** \ingroup rpmio
* \file rpmio/rpmsq.h
*
*/
#include <rpmsw.h>
/**
*/
typedef struct rpmsig_s * rpmsig;
/**
*/
typedef struct rpmsqElem * rpmsq;
/**
* Default signal handler prototype.
* @param signum signal number
* @param info (siginfo_t) signal info
* @param context signal context
*/
typedef void (*rpmsqAction_t) (int signum, void * info, void * context)
/*@*/;
/*@-redecl@*/
/*@unchecked@*/
extern int _rpmsq_debug;
/*@=redecl@*/
/**
* SIGCHLD queue element.
*/
struct rpmsqElem {
struct rpmsqElem * q_forw; /*!< for use by insque(3)/remque(3). */
struct rpmsqElem * q_back;
pid_t child; /*!< Currently running child. */
volatile pid_t reaped; /*!< Reaped waitpid(3) return. */
volatile int status; /*!< Reaped waitpid(3) status. */
struct rpmop_s op; /*!< Scriptlet operation timestamp; */
rpmtime_t ms_scriptlets; /*!< Accumulated script duration (msecs). */
int reaper; /*!< Register SIGCHLD handler? */
int pipes[2]; /*!< Parent/child interlock. */
/*@shared@*/
void * id; /*!< Blocking thread id (pthread_t). */
pthread_mutex_t mutex; /*!< Signal delivery to thread condvar. */
pthread_cond_t cond;
};
/*@-exportlocal@*/
/*@unchecked@*/
extern rpmsq rpmsqQueue;
/*@=exportlocal@*/
/*@unchecked@*/
extern sigset_t rpmsqCaught;
#ifdef __cplusplus
extern "C" {
#endif
/**
* Insert node into from queue.
* @param elem node to link
* @param prev previous node from queue
* @return 0 on success
*/
/*@-exportlocal@*/
int rpmsqInsert(/*@null@*/ void * elem, /*@null@*/ void * prev)
/*@globals systemState @*/
/*@modifies elem, prev, systemState @*/;
/*@=exportlocal@*/
/**
* Remove node from queue.
* @param elem node to link
* @return 0 on success
*/
/*@-exportlocal@*/
int rpmsqRemove(/*@null@*/ void * elem)
/*@globals fileSystem, internalState @*/
/*@modifies elem, fileSystem, internalState @*/;
/*@=exportlocal@*/
/**
* Default signal handler.
* @param signum signal number
* @param info (siginfo_t) signal info
* @param context signal context
*/
/*@-exportlocal@*/
void rpmsqAction(int signum, void * info, void * context)
/*@globals rpmsqCaught, rpmsqQueue, errno, fileSystem @*/
/*@modifies rpmsqCaught, rpmsqQueue, errno, fileSystem @*/;
/*@=exportlocal@*/
/**
* Enable or disable a signal handler.
* @param signum signal to enable (or disable if negative)
* @param handler sa_sigaction handler (or NULL to use rpmsqHandler())
* @return no. of refs, -1 on error
*/
int rpmsqEnable(int signum, /*@null@*/ rpmsqAction_t handler)
/*@globals rpmsqCaught, rpmsqQueue, fileSystem, internalState @*/
/*@modifies rpmsqCaught, rpmsqQueue, fileSystem, internalState @*/;
/**
* Fork a child process.
* @param sq scriptlet queue element
* @return fork(2) pid
*/
pid_t rpmsqFork(rpmsq sq)
/*@globals fileSystem, internalState @*/
/*@modifies sq, fileSystem, internalState @*/;
/**
* Wait for child process to be reaped.
* @param sq scriptlet queue element
* @return reaped child pid
*/
pid_t rpmsqWait(rpmsq sq)
/*@globals fileSystem, internalState @*/
/*@modifies sq, fileSystem, internalState @*/;
/**
* Call a function in a thread.
* @param start function
* @param arg function argument
* @return thread pointer (NULL on error)
*/
void * rpmsqThread(void * (*start) (void * arg), void * arg)
/*@globals internalState @*/
/*@modifies internalState @*/;
/**
* Wait for thread to terminate.
* @param thread thread
* @return 0 on success
*/
int rpmsqJoin(/*@null@*/ void * thread)
/*@globals internalState @*/
/*@modifies internalState @*/;
/**
* Compare thread with current thread.
* @param thread thread
* @return 0 if not equal
*/
int rpmsqThreadEqual(/*@null@*/ void * thread)
/*@globals internalState @*/
/*@modifies internalState @*/;
/**
* Execute a command, returning its status.
*/
int rpmsqExecve (const char ** argv)
/*@globals fileSystem, internalState @*/
/*@modifies fileSystem, internalState @*/;
#ifdef __cplusplus
}
#endif
#endif /* H_RPMSQ */
|