Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/subr_sbuf.c
Show First 20 Lines • Show All 382 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* Call the drain and process the return. | * Call the drain and process the return. | ||||
*/ | */ | ||||
int | int | ||||
sbuf_drain(struct sbuf *s) | sbuf_drain(struct sbuf *s) | ||||
{ | { | ||||
int len; | int len; | ||||
KASSERT(s->s_len > 0, ("Shouldn't drain empty sbuf %p", s)); | /* | ||||
KASSERT(s->s_error == 0, ("Called %s with error on %p", __func__, s)); | * Immediately return when no work to do, | ||||
* or an error has already been accumulated. | |||||
*/ | |||||
if ((s->s_len == 0) || (s->s_error != 0)) | |||||
return(s->s_error); | |||||
if (SBUF_DODRAINTOEOR(s) && s->s_rec_off == 0) | if (SBUF_DODRAINTOEOR(s) && s->s_rec_off == 0) | ||||
return (s->s_error = EDEADLK); | return (s->s_error = EDEADLK); | ||||
len = s->s_drain_func(s->s_drain_arg, s->s_buf, | len = s->s_drain_func(s->s_drain_arg, s->s_buf, | ||||
SBUF_DODRAINTOEOR(s) ? s->s_rec_off : s->s_len); | SBUF_DODRAINTOEOR(s) ? s->s_rec_off : s->s_len); | ||||
if (len <= 0) { | if (len <= 0) { | ||||
s->s_error = len ? -len : EDEADLK; | s->s_error = len ? -len : EDEADLK; | ||||
return (s->s_error); | return (s->s_error); | ||||
▲ Show 20 Lines • Show All 550 Lines • Show Last 20 Lines |