13 typedef struct rpmsig_s * rpmsig;
17 typedef struct rpmsqElem * rpmsq;
20 * Default signal handler prototype.
21 * @param signum signal number
22 * @param info (siginfo_t) signal info
23 * @param context signal context
25 typedef void (*rpmsqAction_t) (int signum, void * info, void * context)
30 extern int _rpmsq_debug;
34 * SIGCHLD queue element.
37 struct rpmsqElem * q_forw; /*!< for use by insque(3)/remque(3). */
38 struct rpmsqElem * q_back;
39 pid_t child; /*!< Currently running child. */
40 volatile pid_t reaped; /*!< Reaped waitpid(3) return. */
41 volatile int status; /*!< Reaped waitpid(3) status. */
42 struct rpmop_s op; /*!< Scriptlet operation timestamp; */
43 rpmtime_t ms_scriptlets; /*!< Accumulated script duration (msecs). */
44 int reaper; /*!< Register SIGCHLD handler? */
45 int pipes[2]; /*!< Parent/child interlock. */
46 void * id; /*!< Blocking thread id (pthread_t). */
47 pthread_mutex_t mutex; /*!< Signal delivery to thread condvar. */
53 extern rpmsq rpmsqQueue;
57 extern sigset_t rpmsqCaught;
64 * Insert node into from queue.
65 * @param elem node to link
66 * @param prev previous node from queue
67 * @return 0 on success
70 int rpmsqInsert(/*@null@*/ void * elem, /*@null@*/ void * prev)
75 * Remove node from queue.
76 * @param elem node to link
77 * @return 0 on success
80 int rpmsqRemove(/*@null@*/ void * elem)
81 /*@globals fileSystem, internalState @*/
82 /*@modifies elem, fileSystem, internalState @*/;
86 * Default signal handler.
87 * @param signum signal number
88 * @param info (siginfo_t) signal info
89 * @param context signal context
92 void rpmsqAction(int signum, void * info, void * context)
93 /*@globals rpmsqCaught, errno, fileSystem @*/
94 /*@modifies rpmsqCaught, errno, fileSystem @*/;
98 * Enable or disable a signal handler.
99 * @param signum signal to enable (or disable if negative)
100 * @param handler sa_sigaction handler (or NULL to use rpmsqHandler())
101 * @return no. of refs, -1 on error
103 int rpmsqEnable(int signum, /*@null@*/ rpmsqAction_t handler)
104 /*@globals rpmsqCaught, fileSystem, internalState @*/
105 /*@modifies rpmsqCaught, fileSystem, internalState @*/;
108 * Fork a child process.
109 * @param sq scriptlet queue element
110 * @return fork(2) pid
112 pid_t rpmsqFork(rpmsq sq)
113 /*@globals fileSystem, internalState @*/
114 /*@modifies sq, fileSystem, internalState @*/;
117 * Wait for child process to be reaped.
118 * @param sq scriptlet queue element
119 * @return reaped child pid
121 pid_t rpmsqWait(rpmsq sq)
122 /*@globals fileSystem, internalState @*/
123 /*@modifies sq, fileSystem, internalState @*/;
126 * Call a function in a thread.
127 * @param start function
128 * @param arg function argument
129 * @return thread pointer (NULL on error)
131 void * rpmsqThread(void * (*start) (void * arg), void * arg)
132 /*@globals internalState @*/
133 /*@modifies internalState @*/;
136 * Wait for thread to terminate.
137 * @param thread thread
138 * @return 0 on success
140 int rpmsqJoin(/*@null@*/ void * thread)
141 /*@globals internalState @*/
142 /*@modifies internalState @*/;
145 * Compare thread with current thread.
146 * @param thread thread
147 * @return 0 if not equal
149 int rpmsqThreadEqual(/*@null@*/ void * thread)
150 /*@globals internalState @*/
151 /*@modifies internalState @*/;
154 * Execute a command, returning its status.
156 int rpmsqExecve (const char ** argv)
157 /*@globals fileSystem, internalState @*/
158 /*@modifies fileSystem, internalState @*/;