121
BIF_RETTYPE port_command_2(BIF_ALIST_2)
121
#define ERTS_PORT_COMMAND_FLAG_FORCE (((Uint32) 1) << 0)
122
#define ERTS_PORT_COMMAND_FLAG_NOSUSPEND (((Uint32) 1) << 1)
124
static BIF_RETTYPE do_port_command(Process *BIF_P,
155
162
ERTS_BIF_PREP_RET(res, am_true);
157
if (p->status & ERTS_PORT_SFLG_PORT_BUSY) {
158
erts_suspend(BIF_P, ERTS_PROC_LOCK_MAIN, p);
159
if (erts_system_monitor_flags.busy_port) {
160
monitor_generic(BIF_P, am_busy_port, p->id);
162
ERTS_BIF_PREP_YIELD2(res, bif_export[BIF_port_command_2], BIF_P,
163
BIF_ARG_1, BIF_ARG_2);
164
if ((flags & ERTS_PORT_COMMAND_FLAG_FORCE)
165
&& !(p->drv_ptr->flags & ERL_DRV_FLAG_SOFT_BUSY)) {
166
ERTS_BIF_PREP_ERROR(res, BIF_P, EXC_NOTSUP);
168
else if (!(flags & ERTS_PORT_COMMAND_FLAG_FORCE)
169
&& p->status & ERTS_PORT_SFLG_PORT_BUSY) {
170
if (flags & ERTS_PORT_COMMAND_FLAG_NOSUSPEND) {
171
ERTS_BIF_PREP_RET(res, am_false);
174
erts_suspend(BIF_P, ERTS_PROC_LOCK_MAIN, p);
175
if (erts_system_monitor_flags.busy_port) {
176
monitor_generic(BIF_P, am_busy_port, p->id);
178
ERTS_BIF_PREP_YIELD3(res, bif_export[BIF_port_command_3], BIF_P,
179
BIF_ARG_1, BIF_ARG_2, BIF_ARG_3);
166
183
erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);
215
BIF_RETTYPE port_command_2(BIF_ALIST_2)
217
return do_port_command(BIF_P, BIF_ARG_1, BIF_ARG_2, NIL, 0);
220
BIF_RETTYPE port_command_3(BIF_ALIST_3)
225
Eterm* cons = list_val(l);
226
Eterm car = CAR(cons);
227
if (car == am_force) {
228
flags |= ERTS_PORT_COMMAND_FLAG_FORCE;
229
} else if (car == am_nosuspend) {
230
flags |= ERTS_PORT_COMMAND_FLAG_NOSUSPEND;
232
BIF_ERROR(BIF_P, BADARG);
237
BIF_ERROR(BIF_P, BADARG);
239
return do_port_command(BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3, flags);
198
242
BIF_RETTYPE port_call_2(BIF_ALIST_2)
200
244
return port_call_3(BIF_P,BIF_ARG_1,make_small(0),BIF_ARG_2);