[PATCH] events v05 with smb_event_id_t
by way of "Stefan metzeMetzmacher"
<metze at metzemix.de>
metze at metzemix.de
Fri May 16 06:09:06 GMT 2003
Hi Jeremy,
can you please take a lock at this patch.
it introduces the even id's to the exit and idle events.
Jelmer, has no time before beta1 and I think it should go into beta1
because nobody should use the current events register fn's in a module!
thanks
metze
-----------------------------------------------------------------------------
Stefan "metze" Metzmacher <metze at metzemix.de>
-------------- next part --------------
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=*.po --exclude=*.so --exclude=.#* --exclude=Makefile --exclude=stamp-h --exclude=configure --exclude=findsmb --exclude=*proto*.h --exclude=build_env.h --exclude=tdbsam2_parse_info.h --exclude=config.* --exclude=bin --exclude=*.configure --exclude=autom4te.cache --exclude=build_options.c* 3_0/source/include/module.h 3_0-events/source/include/module.h
--- 3_0/source/include/module.h Tue May 6 04:34:58 2003
+++ 3_0-events/source/include/module.h Thu May 8 19:59:41 2003
@@ -24,21 +24,15 @@
/* Module support */
typedef NTSTATUS (init_module_function) (void);
+
+typedef int smb_event_id_t;
+#define SMB_EVENT_ID_INVALID (-1)
+
#define SMB_IDLE_EVENT_DEFAULT_INTERVAL 180
#define SMB_IDLE_EVENT_MIN_INTERVAL 30
-typedef struct smb_idle_event_struct {
- struct smb_idle_event_struct *prev,*next;
- time_t interval;
- time_t last_run;
- void *data;
- void (*fn)(struct smb_idle_event_struct **event, time_t now);
-} smb_idle_event_struct;
+typedef void (smb_idle_event_fn)(void **data,time_t *interval,time_t now);
-typedef struct smb_exit_event_struct {
- struct smb_exit_event_struct *prev,*next;
- void *data;
- void (*fn)(struct smb_exit_event_struct **event);
-} smb_exit_event_struct;
+typedef void (smb_exit_event_fn)(void **data);
#endif /* _MODULE_H */
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=*.po --exclude=*.so --exclude=.#* --exclude=Makefile --exclude=stamp-h --exclude=configure --exclude=findsmb --exclude=*proto*.h --exclude=build_env.h --exclude=tdbsam2_parse_info.h --exclude=config.* --exclude=bin --exclude=*.configure --exclude=autom4te.cache --exclude=build_options.c* 3_0/source/lib/module.c 3_0-events/source/lib/module.c
--- 3_0/source/lib/module.c Tue May 6 06:56:26 2003
+++ 3_0-events/source/lib/module.c Thu May 8 20:00:29 2003
@@ -159,99 +159,171 @@ void module_path_get_name(const char *pa
* the registered funtions are run periodically
* and maybe shutdown idle connections (e.g. to an LDAP server)
***************************************************************************/
-static smb_idle_event_struct *smb_idle_event_list = NULL;
-NTSTATUS smb_register_idle_event(smb_idle_event_struct *idle_event)
+static smb_event_id_t smb_idle_event_id = 1;
+
+struct smb_idle_list_ent {
+ struct smb_idle_list_ent *prev,*next;
+ smb_event_id_t id;
+ smb_idle_event_fn *fn;
+ void *data;
+ time_t interval;
+ time_t last_run;
+};
+
+static struct smb_idle_list_ent *smb_idle_event_list = NULL;
+
+smb_event_id_t smb_register_idle_event(smb_idle_event_fn *fn, void *data, time_t interval)
{
- if (!idle_event) {
- return NT_STATUS_INVALID_PARAMETER;
+ struct smb_idle_list_ent *event;
+
+ if (!fn) {
+ return SMB_EVENT_ID_INVALID;
}
- idle_event->last_run = 0;
+ event = (struct smb_idle_list_ent *)malloc(sizeof(struct smb_idle_list_ent));
+ if (!event) {
+ DEBUG(0,("malloc() failed!\n"));
+ return SMB_EVENT_ID_INVALID;
+ }
+ event->fn = fn;
+ event->data = data;
+ event->interval = interval;
+ event->last_run = 0;
+ event->id = smb_idle_event_id++;
- DLIST_ADD(smb_idle_event_list,idle_event);
+ DLIST_ADD(smb_idle_event_list,event);
- return NT_STATUS_OK;
+ return event->id;
}
-NTSTATUS smb_unregister_idle_event(smb_idle_event_struct *idle_event)
+BOOL smb_unregister_idle_event(smb_event_id_t id)
{
- if (!idle_event) {
- return NT_STATUS_INVALID_PARAMETER;
+ struct smb_idle_list_ent *event = smb_idle_event_list;
+
+ while(event) {
+ if (event->id == id) {
+ DLIST_REMOVE(smb_idle_event_list,event);
+ SAFE_FREE(event);
+ return True;
+ }
+ event = event->next;
}
-
- DLIST_REMOVE(smb_idle_event_list,idle_event);
-
- return NT_STATUS_OK;
+
+ return False;
}
void smb_run_idle_events(time_t now)
{
- smb_idle_event_struct *tmp_event = smb_idle_event_list;
+ struct smb_idle_list_ent *event = smb_idle_event_list;
- while (tmp_event) {
+ while (event) {
time_t interval;
- if (tmp_event->fn) {
- if (tmp_event->interval >= SMB_IDLE_EVENT_MIN_INTERVAL) {
- interval = tmp_event->interval;
- } else {
- interval = SMB_IDLE_EVENT_DEFAULT_INTERVAL;
- }
- if (now >(tmp_event->last_run+interval)) {
- tmp_event->fn(&tmp_event,now);
- tmp_event->last_run = now;
- }
+ if (event->interval >= SMB_IDLE_EVENT_MIN_INTERVAL) {
+ interval = event->interval;
+ } else {
+ interval = SMB_IDLE_EVENT_MIN_INTERVAL;
}
+ if (now >(event->last_run+interval)) {
+ event->fn(&event->data,&event->interval,now);
+ event->last_run = now;
+ }
+ event = event->next;
+ }
+
+ return;
+}
+
+static void smb_free_idle_events(void)
+{
+ struct smb_idle_list_ent *event = smb_idle_event_list;
+ struct smb_idle_list_ent *tmp = NULL;
- tmp_event = tmp_event->next;
+ while (event) {
+ tmp = event;
+ event = event->next;
+ SAFE_FREE(tmp);
}
+ smb_idle_event_list = NULL;
+
return;
}
+
/***************************************************************************
* This Function registers a exit event
*
* the registered funtions are run on exit()
* and maybe shutdown idle connections (e.g. to an LDAP server)
***************************************************************************/
-static smb_exit_event_struct *smb_exit_event_list = NULL;
-NTSTATUS smb_register_exit_event(smb_exit_event_struct *exit_event)
+static smb_event_id_t smb_exit_event_id = 1;
+
+struct smb_exit_list_ent {
+ struct smb_exit_list_ent *prev,*next;
+ smb_event_id_t id;
+ smb_exit_event_fn *fn;
+ void *data;
+};
+
+static struct smb_exit_list_ent *smb_exit_event_list = NULL;
+
+smb_event_id_t smb_register_exit_event(smb_exit_event_fn *fn, void *data)
{
- if (!exit_event) {
- return NT_STATUS_INVALID_PARAMETER;
+ struct smb_exit_list_ent *event;
+
+ if (!fn) {
+ return SMB_EVENT_ID_INVALID;
+ }
+
+ event = (struct smb_exit_list_ent *)malloc(sizeof(struct smb_exit_list_ent));
+ if (!event) {
+ DEBUG(0,("malloc() failed!\n"));
+ return SMB_EVENT_ID_INVALID;
}
+ event->fn = fn;
+ event->data = data;
+ event->id = smb_exit_event_id++;
- DLIST_ADD(smb_exit_event_list,exit_event);
+ DLIST_ADD(smb_exit_event_list,event);
- return NT_STATUS_OK;
+ return event->id;
}
-NTSTATUS smb_unregister_exit_event(smb_exit_event_struct *exit_event)
+BOOL smb_unregister_exit_event(smb_event_id_t id)
{
- if (!exit_event) {
- return NT_STATUS_INVALID_PARAMETER;
+ struct smb_exit_list_ent *event = smb_exit_event_list;
+
+ while(event) {
+ if (event->id == id) {
+ DLIST_REMOVE(smb_exit_event_list,event);
+ SAFE_FREE(event);
+ return True;
+ }
+ event = event->next;
}
-
- DLIST_REMOVE(smb_exit_event_list,exit_event);
-
- return NT_STATUS_OK;
+
+ return False;
}
void smb_run_exit_events(void)
{
- smb_exit_event_struct *tmp_event = smb_exit_event_list;
+ struct smb_exit_list_ent *event = smb_exit_event_list;
+ struct smb_exit_list_ent *tmp = NULL;
- while (tmp_event) {
- if (tmp_event->fn) {
- tmp_event->fn(&tmp_event);
- }
- tmp_event = tmp_event->next;
+ while (event) {
+ event->fn(&event->data);
+ tmp = event;
+ event = event->next;
+ /* exit event should only run one time :-)*/
+ SAFE_FREE(tmp);
}
- /* run exit_events only once */
+ /* the list is empty now...*/
smb_exit_event_list = NULL;
+ /* free the idle events on exit too... */
+ smb_free_idle_events();
+
return;
}
-
More information about the samba-technical
mailing list