Skip to content

Commit ba08ea3

Browse files
authored
Improve ref count semantics on http message (#359)
* Improve ref count semantics on http message * Document the changes
1 parent ebfad1a commit ba08ea3

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

include/aws/http/request_response.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,16 +615,21 @@ struct aws_http_message *aws_http2_message_new_response(struct aws_allocator *al
615615
/**
616616
* Acquire a hold on the object, preventing it from being deleted until
617617
* aws_http_message_release() is called by all those with a hold on it.
618+
*
619+
* This function returns the passed in message (possibly NULL) so that acquire-and-assign can be done with a single
620+
* statement.
618621
*/
619622
AWS_HTTP_API
620-
void aws_http_message_acquire(struct aws_http_message *message);
623+
struct aws_http_message *aws_http_message_acquire(struct aws_http_message *message);
621624

622625
/**
623626
* Release a hold on the object.
624627
* The object is deleted when all holds on it are released.
628+
*
629+
* This function always returns NULL so that release-and-assign-NULL can be done with a single statement.
625630
*/
626631
AWS_HTTP_API
627-
void aws_http_message_release(struct aws_http_message *message);
632+
struct aws_http_message *aws_http_message_release(struct aws_http_message *message);
628633

629634
/**
630635
* Deprecated. This is equivalent to aws_http_message_release().

source/request_response.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -537,11 +537,11 @@ void aws_http_message_destroy(struct aws_http_message *message) {
537537
aws_http_message_release(message);
538538
}
539539

540-
void aws_http_message_release(struct aws_http_message *message) {
540+
struct aws_http_message *aws_http_message_release(struct aws_http_message *message) {
541541
/* Note that release() may also be used by new() functions to clean up if something goes wrong */
542542
AWS_PRECONDITION(!message || message->allocator);
543543
if (!message) {
544-
return;
544+
return NULL;
545545
}
546546

547547
size_t prev_refcount = aws_atomic_fetch_sub(&message->refcount, 1);
@@ -557,11 +557,16 @@ void aws_http_message_release(struct aws_http_message *message) {
557557
} else {
558558
AWS_ASSERT(prev_refcount != 0);
559559
}
560+
561+
return NULL;
560562
}
561563

562-
void aws_http_message_acquire(struct aws_http_message *message) {
563-
AWS_PRECONDITION(message);
564-
aws_atomic_fetch_add(&message->refcount, 1);
564+
struct aws_http_message *aws_http_message_acquire(struct aws_http_message *message) {
565+
if (message != NULL) {
566+
aws_atomic_fetch_add(&message->refcount, 1);
567+
}
568+
569+
return message;
565570
}
566571

567572
bool aws_http_message_is_request(const struct aws_http_message *message) {

0 commit comments

Comments
 (0)