pub, sub, quit + print subscriber
This commit is contained in:
parent
539d22a72e
commit
85f94917c9
@ -37,7 +37,7 @@ void srv_process_free (struct process * p)
|
|||||||
free (p);
|
free (p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_print (struct process *p)
|
void srv_process_print (struct process *p)
|
||||||
{
|
{
|
||||||
printf ("process %d : index %d\n", p->pid, p->index);
|
printf ("process %d : index %d\n", p->pid, p->index);
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,6 @@ int srv_process_eq (const struct process *p1, const struct process *p2);
|
|||||||
void srv_process_gen (struct process *p
|
void srv_process_gen (struct process *p
|
||||||
, pid_t pid, unsigned int index, unsigned int version);
|
, pid_t pid, unsigned int index, unsigned int version);
|
||||||
|
|
||||||
void process_print (struct process *);
|
void srv_process_print (struct process *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,6 +27,22 @@ pubsubd_channels_del (struct channels *chans, struct channel *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pubsubd_channels_del_all (struct channels *chans)
|
||||||
|
{
|
||||||
|
if (!chans)
|
||||||
|
return;
|
||||||
|
|
||||||
|
struct channel *c;
|
||||||
|
|
||||||
|
while (!LIST_EMPTY(chans)) {
|
||||||
|
c = LIST_FIRST(chans);
|
||||||
|
LIST_REMOVE(c, entries);
|
||||||
|
pubsubd_channel_free (c);
|
||||||
|
free (c);
|
||||||
|
c = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct channel * pubsubd_channel_copy (struct channel *c)
|
struct channel * pubsubd_channel_copy (struct channel *c)
|
||||||
{
|
{
|
||||||
struct channel *copy;
|
struct channel *copy;
|
||||||
@ -59,6 +75,15 @@ pubsubd_channel_eq (const struct channel *c1, const struct channel *c2)
|
|||||||
|
|
||||||
void pubsubd_subscriber_init (struct app_list_head *chans) { LIST_INIT(chans); }
|
void pubsubd_subscriber_init (struct app_list_head *chans) { LIST_INIT(chans); }
|
||||||
|
|
||||||
|
void pubsubd_app_list_elm_print (const struct app_list_elm *ale)
|
||||||
|
{
|
||||||
|
printf ( "app_list_elm\n\t");
|
||||||
|
srv_process_print (ale->p);
|
||||||
|
|
||||||
|
printf ( "\tchan : %s\n", ale->chan);
|
||||||
|
printf ( "\taction : %d\n", (int) ale->action);
|
||||||
|
}
|
||||||
|
|
||||||
struct app_list_elm * pubsubd_app_list_elm_copy (const struct app_list_elm *ale)
|
struct app_list_elm * pubsubd_app_list_elm_copy (const struct app_list_elm *ale)
|
||||||
{
|
{
|
||||||
if (ale == NULL)
|
if (ale == NULL)
|
||||||
@ -218,8 +243,11 @@ int pubsubd_get_new_process (struct service *srv, struct app_list_elm *ale)
|
|||||||
else if (strncmp("sub", token, 3) == 0) {
|
else if (strncmp("sub", token, 3) == 0) {
|
||||||
ale->action = 1;
|
ale->action = 1;
|
||||||
}
|
}
|
||||||
else {
|
else if (strncmp("both", token, 4) == 0) {
|
||||||
ale->action = 2; // both
|
ale->action = 2;
|
||||||
|
}
|
||||||
|
else { // everything else is about killing the service
|
||||||
|
ale->action = 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,8 @@ struct channel {
|
|||||||
void pubsubd_channels_init (struct channels *chans);
|
void pubsubd_channels_init (struct channels *chans);
|
||||||
struct channel * pubsubd_channel_copy (struct channel *c);
|
struct channel * pubsubd_channel_copy (struct channel *c);
|
||||||
struct channel * pubsubd_channel_get (struct channels *chans, struct channel *c);
|
struct channel * pubsubd_channel_get (struct channels *chans, struct channel *c);
|
||||||
|
void pubsubd_channels_del (struct channels *chans, struct channel *c);
|
||||||
|
void pubsubd_channels_del_all (struct channels *chans);
|
||||||
|
|
||||||
void pubsubd_channel_free (struct channel *c);
|
void pubsubd_channel_free (struct channel *c);
|
||||||
int pubsubd_channel_eq (const struct channel *c1, const struct channel *c2);
|
int pubsubd_channel_eq (const struct channel *c1, const struct channel *c2);
|
||||||
@ -63,7 +65,7 @@ struct app_list_elm {
|
|||||||
struct process *p;
|
struct process *p;
|
||||||
char chan[BUFSIZ];
|
char chan[BUFSIZ];
|
||||||
size_t chanlen;
|
size_t chanlen;
|
||||||
char action; // 0 : pub, 1 : sub, 2 : both
|
char action; // 0 : pub, 1 : sub, 2 : both, kill the service : 3
|
||||||
LIST_ENTRY(app_list_elm) entries;
|
LIST_ENTRY(app_list_elm) entries;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -79,5 +81,6 @@ void pubsubd_subscriber_del (struct app_list_head *al, struct app_list_elm *p);
|
|||||||
struct app_list_elm * pubsubd_app_list_elm_copy (const struct app_list_elm *ale);
|
struct app_list_elm * pubsubd_app_list_elm_copy (const struct app_list_elm *ale);
|
||||||
void pubsubd_app_list_elm_create (struct app_list_elm *ale, struct process *p);
|
void pubsubd_app_list_elm_create (struct app_list_elm *ale, struct process *p);
|
||||||
void pubsubd_app_list_elm_free (struct app_list_elm *todel);
|
void pubsubd_app_list_elm_free (struct app_list_elm *todel);
|
||||||
|
void pubsubd_app_list_elm_print (const struct app_list_elm *ale);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -28,7 +28,7 @@ void main_loop (const struct service *srv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// printf ("before print\n");
|
// printf ("before print\n");
|
||||||
process_print (&proc);
|
srv_process_print (&proc);
|
||||||
// printf ("after print\n");
|
// printf ("after print\n");
|
||||||
|
|
||||||
// about the message
|
// about the message
|
||||||
|
@ -26,14 +26,28 @@ main(int argc, char* argv[])
|
|||||||
// for each new process
|
// for each new process
|
||||||
struct app_list_elm ale;
|
struct app_list_elm ale;
|
||||||
pubsubd_get_new_process (&srv, &ale);
|
pubsubd_get_new_process (&srv, &ale);
|
||||||
process_print (ale.p);
|
pubsubd_app_list_elm_print (&ale);
|
||||||
|
|
||||||
|
// stop the application ? (action 3)
|
||||||
|
if (ale.action == 3) {
|
||||||
|
pubsubd_channels_del_all (&chans);
|
||||||
|
printf ("Quitting ...\n");
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the chan to the list
|
||||||
|
|
||||||
|
// each chan has a list of subscribers
|
||||||
|
// someone who only push a msg doesn't need to be registered
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
// TODO thread to handle multiple clients at a time
|
// TODO thread to handle multiple clients at a time
|
||||||
}
|
}
|
||||||
|
|
||||||
// the application will shut down, and remove the service named pipe
|
// the application will shut down, and remove the service named pipe
|
||||||
if (srv_close (&srv))
|
if (srv_close (&srv))
|
||||||
ohshit(1, "service_close error");
|
ohshit (1, "service_close error");
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user