ID sem;
};
+#define HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_ERR(connector) \
+ err = wai_sem((connector)->sem, T_FOREVER); \
+ if (err < 0) { \
+ return err; \
+ }
+#define HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_VOID(connector) \
+ err = wai_sem((connector)->sem, T_FOREVER); \
+ if (err < 0) { \
+ return; \
+ }
+#define HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector) \
+ sig_sem((connector)->sem);
+
#define HTTP_CONNECTOR_FLAG_CREARMASK(flag) (~(flag))
#define HTTP_CONNECTOR_FLAG_REQUEST 0x00000001
#define HTTP_CONNECTOR_FLAG_EVENT 0x00000002
ID id;
W err;
- err = wai_sem(connector->sem, T_FOREVER);
- if (err < 0) {
- return err;
- }
+ HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_ERR(connector);
id = http_reqdict_allocate(connector->dict, host, host_len, port, method);
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
if (id < 0) {
DP_ER("http_reqdict_allocate", id);
return id; /* TODO */
Bool transport_close = True;
W err;
- err = wai_sem(connector->sem, T_FOREVER);
- if (err < 0) {
- return;
- }
+ HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_VOID(connector);
entry = http_reqdict_getentrybyID(connector->dict, endpoint);
if (entry == NULL) {
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return;
}
http_reqdict_free(connector->dict, endpoint);
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
}
LOCAL W http_connector_searchwaiting(http_connector_t *connector)
W err;
Bool evt = False;
- err = wai_sem(connector->sem, tmout);
+ err = wai_flg(connector->flg, HTTP_CONNECTOR_FLAG_REQUEST, WF_AND, tmout);
if (err < 0) {
- return err;
+ return 0;
}
+
+ HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_ERR(connector);
err = http_connector_searchwaiting(connector);
if (err < 0) {
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return err;
}
if (err > 0) {
http_transport_releaseunusedendpoint(connector->transport);
err = http_connector_waitreceiving(connector, tmout);
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
if (err < 0) {
return err;
}
DP_ER("wai_flg", err);
return err;
}
- err = wai_sem(connector->sem, T_FOREVER);
- if (err < 0) {
- return err;
- }
+ HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_ERR(connector);
found = http_connector_searcheventtarget(connector, event);
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
if (found == False) {
err = clr_flg(connector->flg, HTTP_CONNECTOR_FLAG_CLEARMASK_EVENT);
if (err < 0) {
Bool cont;
CONST UB *str;
- err = wai_sem(connector->sem, T_FOREVER);
- if (err < 0) {
- return err;
- }
+ HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_ERR(connector);
HTTP_CONNECTOR_SENDXXX_GET_CHECK(connector, endpoint, SEND_REQUEST_LINE, entry);
err = http_requestlinestream_initialize(&reqline, entry->method, path, path_len);
if (err < 0) {
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return err;
}
for (;;) {
http_requestlinestream_finalize(&reqline);
if (err < 0) {
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return err;
}
entry->snd_state = SEND_HEADER_MINE;
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return 0;
}
http_reqentry_t *entry;
W err;
- err = wai_sem(connector->sem, T_FOREVER);
- if (err < 0) {
- return err;
- }
+ HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_ERR(connector);
HTTP_CONNECTOR_SENDXXX_GET_CHECK_2(connector, endpoint, SEND_HEADER_MINE, SEND_HEADER_USER, entry);
if (entry->snd_state == SEND_HEADER_MINE) {
err = http_connector_writedefaultheader(connector, entry->transport, entry->host, entry->host_len);
if (err < 0) {
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return err;
}
entry->snd_state = SEND_HEADER_USER;
}
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return 0;
}
http_reqentry_t *entry;
W err;
- err = wai_sem(connector->sem, T_FOREVER);
- if (err < 0) {
- return err;
- }
+ HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_ERR(connector);
HTTP_CONNECTOR_SENDXXX_GET_CHECK_2(connector, endpoint, SEND_HEADER_MINE, SEND_HEADER_USER, entry);
if (entry->snd_state == SEND_HEADER_MINE) {
err = http_connector_writedefaultheader(connector, entry->transport, entry->host, entry->host_len);
if (err < 0) {
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return err;
}
}
err = http_transport_write(connector->transport, entry->transport, "\r\n", 2);
if (err < 0) {
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return err;
}
entry->snd_state = SEND_MESSAGE_BODY;
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return 0;
}
http_reqentry_t *entry;
W err;
- err = wai_sem(connector->sem, T_FOREVER);
- if (err < 0) {
- return err;
- }
+ HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_ERR(connector);
HTTP_CONNECTOR_SENDXXX_GET_CHECK(connector, endpoint, SEND_MESSAGE_BODY, entry);
err = http_transport_write(connector->transport, entry->transport, p, len);
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
if (err < 0) {
return err;
}
http_reqentry_t *entry;
W err;
- err = wai_sem(connector->sem, T_FOREVER);
- if (err < 0) {
- return err;
- }
+ HTTP_CONNECTOR_ENTER_CRITICAL_SECTION_RET_ERR(connector);
HTTP_CONNECTOR_SENDXXX_GET_CHECK(connector, endpoint, SEND_MESSAGE_BODY, entry);
entry->status = WAITING_RESPONSE;
- sig_sem(connector->sem);
+ HTTP_CONNECTOR_LEAVE_CRITICAL_SECTION(connector);
return 0;
}