Skip to content

Commit 338bb6f

Browse files
committed
Merge pull request hmng#1 from mathben/missing_deregister_procedure
Missing deregister procedure
2 parents c635ede + b828afe commit 338bb6f

File tree

4 files changed

+122
-15
lines changed

4 files changed

+122
-15
lines changed

.gitignore

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,43 @@
1515
*.exe
1616
*.out
1717
*.app
18+
19+
# Generated file by autotools
20+
Makefile
21+
Makefile.in
22+
aclocal.m4
23+
ar-lib
24+
autom4te.cache/
25+
compile
26+
config.guess
27+
config.h
28+
config.h.in
29+
config.log
30+
config.status
31+
config.sub
32+
configure
33+
depcomp
34+
example/.deps/
35+
example/Makefile
36+
example/Makefile.in
37+
include/Makefile
38+
include/Makefile.in
39+
install-sh
40+
libtool
41+
ltmain.sh
42+
missing
43+
src/.deps/
44+
src/Makefile
45+
src/Makefile.in
46+
stamp-h1
47+
48+
# Editor text
49+
*.swp
50+
*~
51+
52+
# Build
53+
*.la
54+
*.lo
55+
*.libs
56+
example/server
57+

example/server.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,26 @@
1717
#include <arpa/inet.h>
1818
#include <sys/wait.h>
1919
#include <signal.h>
20-
#include <ev.h>
2120
#include "jsonrpc-c.h"
2221

2322
#define PORT 1234 // the port users will be connecting to
2423

25-
struct ev_loop *loop;
24+
struct jrpc_server my_server;
2625

2726
cJSON * say_hello(jrpc_context * ctx, cJSON * params, cJSON *id) {
2827
return cJSON_CreateString("Hello!");
2928
}
3029

3130
cJSON * exit_server(jrpc_context * ctx, cJSON * params, cJSON *id) {
32-
ev_break(loop, EVBREAK_ALL);
31+
jrpc_server_stop(&my_server);
3332
return cJSON_CreateString("Bye!");
3433
}
3534

3635
int main(void) {
37-
loop = EV_DEFAULT;
38-
struct jrpc_server my_server;
39-
jrpc_server_init(&my_server, loop, PORT);
40-
jrpc_server_start(&my_server);
36+
jrpc_server_init(&my_server, PORT);
4137
jrpc_register_procedure(&my_server, say_hello, "sayHello", NULL );
4238
jrpc_register_procedure(&my_server, exit_server, "exit", NULL );
43-
ev_run(loop, 0);
39+
jrpc_server_run(&my_server);
40+
jrpc_server_destroy(&my_server);
4441
return 0;
4542
}

include/jsonrpc-c.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,21 @@ struct jrpc_connection {
6363
int debug_level;
6464
};
6565

66-
int jrpc_server_init(struct jrpc_server *server, struct ev_loop *loop,
67-
int port_number);
66+
int jrpc_server_init(struct jrpc_server *server, int port_number);
6867

69-
int jrpc_server_start(struct jrpc_server *server);
68+
int jrpc_server_init_with_ev_loop(struct jrpc_server *server,
69+
int port_number, struct ev_loop *loop);
70+
71+
static int __jrpc_server_start(struct jrpc_server *server);
72+
73+
void jrpc_server_run(struct jrpc_server *server);
7074

7175
int jrpc_server_stop(struct jrpc_server *server);
7276

77+
void jrpc_server_destroy(struct jrpc_server *server);
78+
79+
static void jrpc_procedure_destroy(struct jrpc_procedure *procedure);
80+
7381
int jrpc_register_procedure(struct jrpc_server *server,
7482
jrpc_function function_pointer, char *name, void *data);
7583

src/jsonrpc-c.c

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
#include "jsonrpc-c.h"
2020

21+
struct ev_loop *loop;
22+
2123
// get sockaddr, IPv4 or IPv6:
2224
static void *get_in_addr(struct sockaddr *sa) {
2325
if (sa->sa_family == AF_INET) {
@@ -234,8 +236,13 @@ static void accept_cb(struct ev_loop *loop, ev_io *w, int revents) {
234236
}
235237
}
236238

237-
int jrpc_server_init(struct jrpc_server *server, struct ev_loop *loop,
238-
int port_number) {
239+
int jrpc_server_init(struct jrpc_server *server, int port_number) {
240+
loop = EV_DEFAULT;
241+
return jrpc_server_init_with_ev_loop(server, port_number, loop);
242+
}
243+
244+
int jrpc_server_init_with_ev_loop(struct jrpc_server *server,
245+
int port_number, struct ev_loop *loop) {
239246
memset(server, 0, sizeof(struct jrpc_server));
240247
server->loop = loop;
241248
server->port_number = port_number;
@@ -246,10 +253,10 @@ int jrpc_server_init(struct jrpc_server *server, struct ev_loop *loop,
246253
server->debug_level = strtol(debug_level_env, NULL, 10);
247254
printf("JSONRPC-C Debug level %d\n", server->debug_level);
248255
}
249-
return 0;
256+
return __jrpc_server_start(server);
250257
}
251258

252-
int jrpc_server_start(struct jrpc_server *server) {
259+
static int __jrpc_server_start(struct jrpc_server *server) {
253260
int sockfd;
254261
struct addrinfo hints, *servinfo, *p;
255262
int yes = 1;
@@ -309,10 +316,35 @@ int jrpc_server_start(struct jrpc_server *server) {
309316
return 0;
310317
}
311318

319+
void jrpc_server_run(struct jrpc_server *server){
320+
ev_run(server->loop, 0);
321+
}
322+
312323
int jrpc_server_stop(struct jrpc_server *server) {
324+
ev_break(server->loop, EVBREAK_ALL);
313325
return 0;
314326
}
315327

328+
void jrpc_server_destroy(struct jrpc_server *server){
329+
/* Don't destroy server */
330+
int i;
331+
for (i = 0; i < server->procedure_count; i++){
332+
jrpc_procedure_destroy( &(server->procedures[i]) );
333+
}
334+
free(server->procedures);
335+
}
336+
337+
static void jrpc_procedure_destroy(struct jrpc_procedure *procedure){
338+
if (procedure->name){
339+
free(procedure->name);
340+
procedure->name = NULL;
341+
}
342+
if (procedure->data){
343+
free(procedure->data);
344+
procedure->data = NULL;
345+
}
346+
}
347+
316348
int jrpc_register_procedure(struct jrpc_server *server,
317349
jrpc_function function_pointer, char *name, void * data) {
318350
int i = server->procedure_count++;
@@ -334,5 +366,35 @@ int jrpc_register_procedure(struct jrpc_server *server,
334366
}
335367

336368
int jrpc_deregister_procedure(struct jrpc_server *server, char *name) {
369+
/* Search the procedure to deregister */
370+
int i;
371+
int found = 0;
372+
if (server->procedures){
373+
for (i = 0; i < server->procedure_count; i++){
374+
if (found)
375+
server->procedures[i-1] = server->procedures[i];
376+
else if(!strcmp(name, server->procedures[i].name)){
377+
found = 1;
378+
jrpc_procedure_destroy( &(server->procedures[i]) );
379+
}
380+
}
381+
if (found){
382+
server->procedure_count--;
383+
if (server->procedure_count){
384+
struct jrpc_procedure * ptr = realloc(server->procedures,
385+
sizeof(struct jrpc_procedure) * server->procedure_count);
386+
if (!ptr){
387+
perror("realloc");
388+
return -1;
389+
}
390+
server->procedures = ptr;
391+
}else{
392+
server->procedures = NULL;
393+
}
394+
}
395+
} else {
396+
fprintf(stderr, "server : procedure '%s' not found\n", name);
397+
return -1;
398+
}
337399
return 0;
338400
}

0 commit comments

Comments
 (0)