mirror of
https://github.com/cesanta/mongoose.git
synced 2025-01-14 17:58:11 +08:00
Add buf,len params to mg_mgr_wakeup()
This commit is contained in:
parent
4cd830a0bf
commit
fe813ee247
@ -687,14 +687,17 @@ Usage example: see [examples/multi-threaded](https://github.com/cesanta/mongoose
|
|||||||
### mg\_mgr\_wakeup()
|
### mg\_mgr\_wakeup()
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void mg_mgr_wakeup(struct mg_connection *pipe);
|
void mg_mgr_wakeup(struct mg_connection *pipe, const void *buf, size_len len);
|
||||||
```
|
```
|
||||||
|
|
||||||
Wake up an event manager that sleeps in `mg_mgr_poll()` call. This function
|
Wake up an event manager that sleeps in `mg_mgr_poll()` call. This function
|
||||||
must be called from a separate task/thread. Parameters:
|
must be called from a separate task/thread. A calling thread can pass
|
||||||
|
some specific data to the IO thread via `buf`, `len`. Parameters:
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
- `pipe` - a special connection created by the `mg_mkpipe()` call
|
- `pipe` - a special connection created by the `mg_mkpipe()` call
|
||||||
|
- `buf` - a data to send to the pipe connection. Use `""` if there is no data
|
||||||
|
- `len` - a data length
|
||||||
|
|
||||||
Return value: None
|
Return value: None
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ static void start_thread(void (*f)(void *), void *p) {
|
|||||||
static void thread_function(void *param) {
|
static void thread_function(void *param) {
|
||||||
struct mg_connection *c = param; // Pipe connection
|
struct mg_connection *c = param; // Pipe connection
|
||||||
sleep(2); // Simulate long execution
|
sleep(2); // Simulate long execution
|
||||||
mg_mgr_wakeup(c); // Wakeup event manager
|
mg_mgr_wakeup(c, "hi", 2); // Wakeup event manager
|
||||||
}
|
}
|
||||||
|
|
||||||
// HTTP request callback
|
// HTTP request callback
|
||||||
@ -62,8 +62,9 @@ static void pcb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
|||||||
struct mg_connection *t;
|
struct mg_connection *t;
|
||||||
for (t = c->mgr->conns; t != NULL; t = t->next) {
|
for (t = c->mgr->conns; t != NULL; t = t->next) {
|
||||||
if (t->label[0] != 'W') continue; // Ignore un-marked connections
|
if (t->label[0] != 'W') continue; // Ignore un-marked connections
|
||||||
mg_http_reply(t, 200, "Host: foo.com\r\n", "hi\n"); // Respond!
|
mg_http_reply(t, 200, "Host: foo.com\r\n", "%.*s\n", c->recv.len,
|
||||||
t->label[0] = 0; // Clear mark
|
c->recv.buf); // Respond!
|
||||||
|
t->label[0] = 0; // Clear mark
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
mongoose.c
10
mongoose.c
@ -3510,13 +3510,17 @@ static bool mg_socketpair(SOCKET sp[2], union usa usa[2]) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mg_mgr_wakeup(struct mg_connection *c) {
|
void mg_mgr_wakeup(struct mg_connection *c, const void *buf, size_t len) {
|
||||||
LOG(LL_INFO, ("skt: %p", c->pfn_data));
|
LOG(LL_INFO, ("skt: %p", c->pfn_data));
|
||||||
send((SOCKET) (size_t) c->pfn_data, "\x01", 1, MSG_NONBLOCKING);
|
send((SOCKET) (size_t) c->pfn_data, (const char *) buf, len, MSG_NONBLOCKING);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pf1(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
static void pf1(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
||||||
if (ev == MG_EV_READ) mg_iobuf_free(&c->recv);
|
if (ev == MG_EV_READ) {
|
||||||
|
mg_iobuf_free(&c->recv);
|
||||||
|
} else if (ev == MG_EV_CLOSE) {
|
||||||
|
closesocket((SOCKET) (size_t) c->pfn_data);
|
||||||
|
}
|
||||||
(void) ev_data, (void) fn_data;
|
(void) ev_data, (void) fn_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
10
mongoose.h
10
mongoose.h
@ -637,6 +637,10 @@ struct mg_fs {
|
|||||||
bool (*mkd)(const char *path); // Create directory
|
bool (*mkd)(const char *path); // Create directory
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern struct mg_fs mg_fs_posix; // POSIX open/close/read/write/seek
|
||||||
|
extern struct mg_fs mg_fs_packed; // Packed FS, see examples/complete
|
||||||
|
extern struct mg_fs mg_fs_fat; // FAT FS
|
||||||
|
|
||||||
// File descriptor
|
// File descriptor
|
||||||
struct mg_fd {
|
struct mg_fd {
|
||||||
void *fd;
|
void *fd;
|
||||||
@ -649,10 +653,6 @@ char *mg_file_read(struct mg_fs *fs, const char *path, size_t *size);
|
|||||||
bool mg_file_write(struct mg_fs *fs, const char *path, const void *, size_t);
|
bool mg_file_write(struct mg_fs *fs, const char *path, const void *, size_t);
|
||||||
bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...);
|
bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...);
|
||||||
|
|
||||||
extern struct mg_fs mg_fs_posix; // POSIX open/close/read/write/seek
|
|
||||||
extern struct mg_fs mg_fs_packed; // Packed FS, see examples/complete
|
|
||||||
extern struct mg_fs mg_fs_fat; // FAT FS
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -882,7 +882,7 @@ bool mg_aton(struct mg_str str, struct mg_addr *addr);
|
|||||||
char *mg_ntoa(const struct mg_addr *addr, char *buf, size_t len);
|
char *mg_ntoa(const struct mg_addr *addr, char *buf, size_t len);
|
||||||
|
|
||||||
struct mg_connection *mg_mkpipe(struct mg_mgr *, mg_event_handler_t, void *);
|
struct mg_connection *mg_mkpipe(struct mg_mgr *, mg_event_handler_t, void *);
|
||||||
void mg_mgr_wakeup(struct mg_connection *pipe);
|
void mg_mgr_wakeup(struct mg_connection *pipe, const void *buf, size_t len);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
8
src/fs.h
8
src/fs.h
@ -21,6 +21,10 @@ struct mg_fs {
|
|||||||
bool (*mkd)(const char *path); // Create directory
|
bool (*mkd)(const char *path); // Create directory
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern struct mg_fs mg_fs_posix; // POSIX open/close/read/write/seek
|
||||||
|
extern struct mg_fs mg_fs_packed; // Packed FS, see examples/complete
|
||||||
|
extern struct mg_fs mg_fs_fat; // FAT FS
|
||||||
|
|
||||||
// File descriptor
|
// File descriptor
|
||||||
struct mg_fd {
|
struct mg_fd {
|
||||||
void *fd;
|
void *fd;
|
||||||
@ -32,7 +36,3 @@ void mg_fs_close(struct mg_fd *fd);
|
|||||||
char *mg_file_read(struct mg_fs *fs, const char *path, size_t *size);
|
char *mg_file_read(struct mg_fs *fs, const char *path, size_t *size);
|
||||||
bool mg_file_write(struct mg_fs *fs, const char *path, const void *, size_t);
|
bool mg_file_write(struct mg_fs *fs, const char *path, const void *, size_t);
|
||||||
bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...);
|
bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...);
|
||||||
|
|
||||||
extern struct mg_fs mg_fs_posix; // POSIX open/close/read/write/seek
|
|
||||||
extern struct mg_fs mg_fs_packed; // Packed FS, see examples/complete
|
|
||||||
extern struct mg_fs mg_fs_fat; // FAT FS
|
|
||||||
|
@ -76,4 +76,4 @@ bool mg_aton(struct mg_str str, struct mg_addr *addr);
|
|||||||
char *mg_ntoa(const struct mg_addr *addr, char *buf, size_t len);
|
char *mg_ntoa(const struct mg_addr *addr, char *buf, size_t len);
|
||||||
|
|
||||||
struct mg_connection *mg_mkpipe(struct mg_mgr *, mg_event_handler_t, void *);
|
struct mg_connection *mg_mkpipe(struct mg_mgr *, mg_event_handler_t, void *);
|
||||||
void mg_mgr_wakeup(struct mg_connection *pipe);
|
void mg_mgr_wakeup(struct mg_connection *pipe, const void *buf, size_t len);
|
||||||
|
10
src/sock.c
10
src/sock.c
@ -444,13 +444,17 @@ static bool mg_socketpair(SOCKET sp[2], union usa usa[2]) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mg_mgr_wakeup(struct mg_connection *c) {
|
void mg_mgr_wakeup(struct mg_connection *c, const void *buf, size_t len) {
|
||||||
LOG(LL_INFO, ("skt: %p", c->pfn_data));
|
LOG(LL_INFO, ("skt: %p", c->pfn_data));
|
||||||
send((SOCKET) (size_t) c->pfn_data, "\x01", 1, MSG_NONBLOCKING);
|
send((SOCKET) (size_t) c->pfn_data, (const char *) buf, len, MSG_NONBLOCKING);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pf1(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
static void pf1(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
||||||
if (ev == MG_EV_READ) mg_iobuf_free(&c->recv);
|
if (ev == MG_EV_READ) {
|
||||||
|
mg_iobuf_free(&c->recv);
|
||||||
|
} else if (ev == MG_EV_CLOSE) {
|
||||||
|
closesocket((SOCKET) (size_t) c->pfn_data);
|
||||||
|
}
|
||||||
(void) ev_data, (void) fn_data;
|
(void) ev_data, (void) fn_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,8 +31,8 @@ bool mg_send(struct mg_connection *c, const void *buf, size_t len) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mg_mgr_wakeup(struct mg_connection *c) {
|
void mg_mgr_wakeup(struct mg_connection *c, const void *buf, size_t len) {
|
||||||
(void) c;
|
(void) c, (void) buf, (void) len;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mg_connection *mg_mkpipe(struct mg_mgr *mgr, mg_event_handler_t fn,
|
struct mg_connection *mg_mkpipe(struct mg_mgr *mgr, mg_event_handler_t fn,
|
||||||
|
@ -1504,7 +1504,7 @@ static void test_pipe(void) {
|
|||||||
int i, done = 0;
|
int i, done = 0;
|
||||||
mg_mgr_init(&mgr);
|
mg_mgr_init(&mgr);
|
||||||
ASSERT((c = mg_mkpipe(&mgr, eh6, (void *) &done)) != NULL);
|
ASSERT((c = mg_mkpipe(&mgr, eh6, (void *) &done)) != NULL);
|
||||||
mg_mgr_wakeup(c);
|
mg_mgr_wakeup(c, "", 1);
|
||||||
for (i = 0; i < 10 && done == 0; i++) mg_mgr_poll(&mgr, 1);
|
for (i = 0; i < 10 && done == 0; i++) mg_mgr_poll(&mgr, 1);
|
||||||
ASSERT(done == 1);
|
ASSERT(done == 1);
|
||||||
mg_mgr_free(&mgr);
|
mg_mgr_free(&mgr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user