Project

General

Profile

« Previous | Next » 

Revision 4a7ded2b

Added by Leszek Koltunski 3 days ago

Rename .java to .kt

View differences:

src/main/java/org/distorted/library/message/EffectListener.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski  leszek@koltunski.pl                                          //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10
//                                                                                               //
11
// This library is distributed in the hope that it will be useful,                               //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15
//                                                                                               //
16
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19
///////////////////////////////////////////////////////////////////////////////////////////////////
20

  
21
package org.distorted.library.message;
22

  
23
///////////////////////////////////////////////////////////////////////////////////////////////////
24

  
25
import org.distorted.library.effect.Effect;
26

  
27
/**
28
 * This interface lets users of the DistortedLibrary library get notified when a given effect finishes.
29
 * To receive the notifications, we first have to register with a call to {@link Effect#notifyWhenFinished(EffectListener)}.
30
 */
31

  
32
public interface EffectListener 
33
  {
34
/**
35
 * Gets called when Effect 'effectID' finishes execution (i.e. the Dynamic inside it reaches its final point).
36
 * 
37
 * @param effectID ID of the finished effect, as returned by {@link org.distorted.library.effect.Effect#getID() }
38
 */
39
   
40
  void effectFinished(final long effectID);
41
  }
42

  
43
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/library/message/EffectListener.kt
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski  leszek@koltunski.pl                                          //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10
//                                                                                               //
11
// This library is distributed in the hope that it will be useful,                               //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15
//                                                                                               //
16
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19
///////////////////////////////////////////////////////////////////////////////////////////////////
20

  
21
package org.distorted.library.message;
22

  
23
///////////////////////////////////////////////////////////////////////////////////////////////////
24

  
25
import org.distorted.library.effect.Effect;
26

  
27
/**
28
 * This interface lets users of the DistortedLibrary library get notified when a given effect finishes.
29
 * To receive the notifications, we first have to register with a call to {@link Effect#notifyWhenFinished(EffectListener)}.
30
 */
31

  
32
public interface EffectListener 
33
  {
34
/**
35
 * Gets called when Effect 'effectID' finishes execution (i.e. the Dynamic inside it reaches its final point).
36
 * 
37
 * @param effectID ID of the finished effect, as returned by {@link org.distorted.library.effect.Effect#getID() }
38
 */
39
   
40
  void effectFinished(final long effectID);
41
  }
42

  
43
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/library/message/EffectMessageSender.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski  leszek@koltunski.pl                                          //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10
//                                                                                               //
11
// This library is distributed in the hope that it will be useful,                               //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15
//                                                                                               //
16
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19
///////////////////////////////////////////////////////////////////////////////////////////////////
20

  
21
package org.distorted.library.message;
22

  
23
import org.distorted.library.effect.Effect;
24

  
25
import java.util.Vector;
26

  
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28
/**
29
 * Not part of public API, do not document (public only because has to be used in Meshes)
30
 *
31
 * @y.exclude
32
 */
33
public final class EffectMessageSender extends Thread
34
  {
35
  private static class Message
36
    {
37
    EffectListener mListener;
38
    long mEffectID;
39

  
40
    Message(EffectListener listener, long effectID)
41
      {
42
      mListener = listener;
43
      mEffectID = effectID;
44
      }
45
    }
46

  
47
  private static final Object mLock        = new Object();
48
  private static Vector<Message> mList     = null;
49
  private static EffectMessageSender mThis = null;
50
  private static volatile boolean mNotify  = false;
51

  
52
  // debug only, to be removed later
53
  private static int mNumStarts = 0;
54
  private static long mStartTime, mStopTime;
55

  
56
///////////////////////////////////////////////////////////////////////////////////////////////////
57
   
58
  private EffectMessageSender() 
59
    {
60

  
61
    }
62

  
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64

  
65
  public static void startSending()
66
    {
67
    synchronized(mLock)
68
      {
69
      if( mThis==null )
70
        {
71
        mStartTime = System.currentTimeMillis();
72
        mNumStarts++;
73

  
74
        mList = new Vector<>();
75
        mThis = new EffectMessageSender();
76
        mThis.start();
77
        }
78
      }
79
    }
80

  
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82
  
83
  public static void stopSending()
84
    {
85
    synchronized(mLock)
86
      {
87
      if( mThis!=null )
88
        {
89
        mStopTime = System.currentTimeMillis();
90
        mNumStarts--;
91

  
92
        mThis=null;
93
        mLock.notify();
94
        }
95
      }
96
    }
97
  
98
///////////////////////////////////////////////////////////////////////////////////////////////////
99
  
100
  public void run()
101
    {
102
    Message tmp;  
103
     
104
    while(mThis!=null)
105
      {
106
      while( !mList.isEmpty() )
107
        {
108
        tmp = mList.remove(0);
109
        tmp.mListener.effectFinished(tmp.mEffectID);
110
        }
111

  
112
      synchronized(mLock)
113
        {
114
        if (!mNotify)
115
          {
116
          try  { mLock.wait(); }
117
          catch(InterruptedException ignored) { }
118
          }
119
        mNotify = false;
120
        }
121
      }
122

  
123
    mList.clear();
124
    }
125
  
126
///////////////////////////////////////////////////////////////////////////////////////////////////
127
        
128
  public static void newMessage(Effect effect)
129
    {
130
    int numListeners = effect.getNumListeners();
131

  
132
    if( numListeners>0 )
133
      {
134
      long id = effect.getID();
135

  
136
      for(int i=0; i<numListeners; i++)
137
        {
138
        EffectListener listener = effect.removeFirstListener();
139
        Message msg = new Message(listener,id);
140
        mList.add(msg);
141
        }
142

  
143
      synchronized(mLock)
144
        {
145
        mNotify = true;
146
        mLock.notify();
147
        }
148
      }
149
    }
150

  
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152

  
153
  public static boolean isRunning()
154
    {
155
    return mThis!=null;
156
    }
157

  
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159

  
160
  public static void restartThread()
161
    {
162
    synchronized(mLock)
163
      {
164
      if( mThis==null )
165
        {
166
        if( mList==null ) mList = new Vector<>();
167
        mThis = new EffectMessageSender();
168
        mThis.start();
169
        }
170
      }
171
    }
172

  
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174

  
175
  public static String reportState()
176
    {
177
    return "running "+(mThis!=null)+" notify="+mNotify+" elements="+mList.size()+
178
           " start="+mStartTime+" stop="+mStopTime+" numStarts="+mNumStarts;
179
    }
180
  }
src/main/java/org/distorted/library/message/EffectMessageSender.kt
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski  leszek@koltunski.pl                                          //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10
//                                                                                               //
11
// This library is distributed in the hope that it will be useful,                               //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15
//                                                                                               //
16
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19
///////////////////////////////////////////////////////////////////////////////////////////////////
20

  
21
package org.distorted.library.message;
22

  
23
import org.distorted.library.effect.Effect;
24

  
25
import java.util.Vector;
26

  
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28
/**
29
 * Not part of public API, do not document (public only because has to be used in Meshes)
30
 *
31
 * @y.exclude
32
 */
33
public final class EffectMessageSender extends Thread
34
  {
35
  private static class Message
36
    {
37
    EffectListener mListener;
38
    long mEffectID;
39

  
40
    Message(EffectListener listener, long effectID)
41
      {
42
      mListener = listener;
43
      mEffectID = effectID;
44
      }
45
    }
46

  
47
  private static final Object mLock        = new Object();
48
  private static Vector<Message> mList     = null;
49
  private static EffectMessageSender mThis = null;
50
  private static volatile boolean mNotify  = false;
51

  
52
  // debug only, to be removed later
53
  private static int mNumStarts = 0;
54
  private static long mStartTime, mStopTime;
55

  
56
///////////////////////////////////////////////////////////////////////////////////////////////////
57
   
58
  private EffectMessageSender() 
59
    {
60

  
61
    }
62

  
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64

  
65
  public static void startSending()
66
    {
67
    synchronized(mLock)
68
      {
69
      if( mThis==null )
70
        {
71
        mStartTime = System.currentTimeMillis();
72
        mNumStarts++;
73

  
74
        mList = new Vector<>();
75
        mThis = new EffectMessageSender();
76
        mThis.start();
77
        }
78
      }
79
    }
80

  
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82
  
83
  public static void stopSending()
84
    {
85
    synchronized(mLock)
86
      {
87
      if( mThis!=null )
88
        {
89
        mStopTime = System.currentTimeMillis();
90
        mNumStarts--;
91

  
92
        mThis=null;
93
        mLock.notify();
94
        }
95
      }
96
    }
97
  
98
///////////////////////////////////////////////////////////////////////////////////////////////////
99
  
100
  public void run()
101
    {
102
    Message tmp;  
103
     
104
    while(mThis!=null)
105
      {
106
      while( !mList.isEmpty() )
107
        {
108
        tmp = mList.remove(0);
109
        tmp.mListener.effectFinished(tmp.mEffectID);
110
        }
111

  
112
      synchronized(mLock)
113
        {
114
        if (!mNotify)
115
          {
116
          try  { mLock.wait(); }
117
          catch(InterruptedException ignored) { }
118
          }
119
        mNotify = false;
120
        }
121
      }
122

  
123
    mList.clear();
124
    }
125
  
126
///////////////////////////////////////////////////////////////////////////////////////////////////
127
        
128
  public static void newMessage(Effect effect)
129
    {
130
    int numListeners = effect.getNumListeners();
131

  
132
    if( numListeners>0 )
133
      {
134
      long id = effect.getID();
135

  
136
      for(int i=0; i<numListeners; i++)
137
        {
138
        EffectListener listener = effect.removeFirstListener();
139
        Message msg = new Message(listener,id);
140
        mList.add(msg);
141
        }
142

  
143
      synchronized(mLock)
144
        {
145
        mNotify = true;
146
        mLock.notify();
147
        }
148
      }
149
    }
150

  
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152

  
153
  public static boolean isRunning()
154
    {
155
    return mThis!=null;
156
    }
157

  
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159

  
160
  public static void restartThread()
161
    {
162
    synchronized(mLock)
163
      {
164
      if( mThis==null )
165
        {
166
        if( mList==null ) mList = new Vector<>();
167
        mThis = new EffectMessageSender();
168
        mThis.start();
169
        }
170
      }
171
    }
172

  
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174

  
175
  public static String reportState()
176
    {
177
    return "running "+(mThis!=null)+" notify="+mNotify+" elements="+mList.size()+
178
           " start="+mStartTime+" stop="+mStopTime+" numStarts="+mNumStarts;
179
    }
180
  }

Also available in: Unified diff